ROCK PI S音频开发(一)系统准备

news2024/11/6 15:39:28

1、连接WIFI
 

sudo nmcli r wifi on
sudo nmcli dev wifi
sudo nmcli dev wifi connect "SSID" password "PASSWORD" 

2、更新源

sudo apt-get update
sudo apt-get install git wget
export DISTRO=focal-stable
wget -O - apt.radxa.com/$DISTRO/public.key | sudo apt-key add -
sudo apt-get update

3、安装相关编译器
 

sudo apt-get install gcc-aarch64-linux-gnu build-essential device-tree-compiler libncurses5 libncurses5-dev make cmake

4、安装基础音频软件
 

sudo apt-get install alsa-utils jackd2 jackmeter mplayer

-------------------------------------------------------------------------------------------------------------------------------

接下来做一些基本的测试

1、jackd服务

jackd -dalsa -dhw:1 -r44100&

查看端口
 

jack_lsp

2、要使用高品质音频,需采用I2S的方式连接外部解码器,通过编译设备树将相应IO配置为I2S模式

2.1 反编译DTB

dtc -I dtb -O dts -o xx.dtb xxx.dts

即把/boot/dtbs/4.4.143-65-rockchip-g58431d38f8f3/rockchip/rk3308-rock-pi-s.dtb反编译为dts,然后对该文件进行编辑

dtc -I dtb -O dts -o /boot/dtbs/4.4.143-65-rockchip-g58431d38f8f3/rockchip/rk3308-rock-pi-s.dtb rk3308-rock-pi-s.dts

运行上述命令后,将在当前目录下生成rk3308-rock-pi-s.dts,接下来对该文件的以下片段进行修改,不使用rock pi s自带的音频解码器,并将IO配置为I2S模式。

2.2 I2S slave模式的设备树

	i2s_8ch_0: i2s@ff300000 {
		compatible = "rockchip,rk3308-i2s-tdm";
		reg = <0x00 0xff300000 0x00 0x1000>;
		interrupts = <0x00 0x30 0x04>;
		clocks = <0x02 0x4c 0x02 0x4e 0x02 0xa4 0x02 0x6e 0x02 0x6f 0x02 0x03 0x02 0x04>;
		clock-names = "mclk_tx\0mclk_rx\0hclk\0mclk_tx_src\0mclk_rx_src\0mclk_root0\0mclk_root1";
		dmas = <0x25 0x00 0x25 0x01>;
		dma-names = "tx\0rx";
		resets = <0x02 0x89 0x02 0x8a>;
		reset-names = "tx-m\0rx-m";
		rockchip,cru = <0x02>;
		rockchip,grf = <0x4b>;
		rockchip,mclk-calibrate;
		pinctrl-names = "default";
		pinctrl-0 = <0x4e 0x4f 0x50 0x51 0x52 0x53 0x54 0x55 0x56 0x57 0x58 0x59 0x5a>;		
		rockchip,clk-trcm = <2>;
		#sound-dai-cells = <0>;
		status = "okay";
		phandle = <0xbe>;
	};

	I2S_sound {
		status = "okay";
		compatible = "simple-audio-card";
		simple-audio-card,format = "i2s";
		simple-audio-card,name = "dummy-card";
		simple-audio-card,mclk-fs = <256>;
		simple-audio-card,bitclock-master = <&master>;
		simple-audio-card,frame-master = <&master>;
		simple-audio-card,cpu {
			sound-dai = <&i2s_8ch_0>;
		};
		master:simple-audio-card,codec {
			sound-dai = <&dummy_codec>;
		};
	};
	
 	dummy_codec: dummy-codec {
         status = "okay";
         compatible = "rockchip,dummy-codec";
		 //clocks = <0x02 0x6f>;
		 //clock-names = "mclk";
         #sound-dai-cells = <0>;
    };
	

	acodec-sound {
		compatible = "rockchip,multicodecs-card";
		rockchip,card-name = "rockchip,rk3308-acodec";
		rockchip,multicodecs-card,format = "i2s";
		rockchip,mclk-fs = <0x100>;
		rockchip,cpu = <&i2s_8ch_0>;
		rockchip,codec = <0x8b>;
		status = "disabled";
		phandle = <0x13d>;		
	};

2.3 I2S master模式的设备树

	i2s_8ch_0: i2s@ff300000 {
		compatible = "rockchip,rk3308-i2s-tdm";
		reg = <0x00 0xff300000 0x00 0x1000>;
		interrupts = <0x00 0x30 0x04>;
		clocks = <0x02 0x4c 0x02 0x4e 0x02 0xa4 0x02 0x6e 0x02 0x6f 0x02 0x03 0x02 0x04>;
		clock-names = "mclk_tx\0mclk_rx\0hclk\0mclk_tx_src\0mclk_rx_src\0mclk_root0\0mclk_root1";
		dmas = <0x25 0x00 0x25 0x01>;
		dma-names = "tx\0rx";
		resets = <0x02 0x89 0x02 0x8a>;
		reset-names = "tx-m\0rx-m";
		rockchip,cru = <0x02>;
		rockchip,grf = <0x4b>;
		rockchip,mclk-calibrate;
		pinctrl-names = "default";
		pinctrl-0 = <0x4e 0x4f 0x50 0x51 0x52 0x53 0x54 0x55 0x56 0x57 0x58 0x59 0x5a>;		
		rockchip,clk-trcm = <2>;
		#sound-dai-cells = <0>;
		status = "okay";
		phandle = <0xbe>;
	};

	I2S_sound {
		status = "okay";
		compatible = "simple-audio-card";
		simple-audio-card,format = "i2s";
		simple-audio-card,name = "dummy-card";
		simple-audio-card,mclk-fs = <256>;
		simple-audio-card,bitclock-master = <&i2s_8ch_0>;
		simple-audio-card,frame-master = <&i2s_8ch_0>;
		simple-audio-card,cpu {
			sound-dai = <&i2s_8ch_0>;
		};
		master:simple-audio-card,codec {
			sound-dai = <&dummy_codec>;
		};
	};
	
 	dummy_codec: dummy-codec {
         status = "okay";
         compatible = "rockchip,dummy-codec";
		 //clocks = <0x02 0x6f>;
		 //clock-names = "mclk";
		 //pinctrl-names = "default";
		 //pinctrl-0 = <0x5a>;
         #sound-dai-cells = <0>;
    };
	

	acodec-sound {
		compatible = "rockchip,multicodecs-card";
		rockchip,card-name = "rockchip,rk3308-acodec";
		rockchip,multicodecs-card,format = "i2s";
		rockchip,mclk-fs = <0x100>;
		rockchip,cpu = <&i2s_8ch_0>;
		rockchip,codec = <0x8b>;
		status = "disabled";
		phandle = <0x13d>;		
	};

3、编译修改完成的dts文件

sudo dtc -I dts -O dtb -f rk3308-rock-pi-s.dts -o /boot/dtbs/4.4.143-65-rockchip-g58431d38f8f3/rockchip/rk3308-rock-pi-s.dtb

重启系统

sudo reboot

--------------------------------------------------------------------------------------------------------------------------------

如果使用I2S master模式,ROCK PI S的LRCK、BCLK针脚为输出,那么在启动jacd服务后,这两个针脚应将产生到对应的频率

jackd -dalsa -dhw:1 -r44100

如果使用I2S slave模式,LRCK、BCLK针脚由外部时钟提供,如果外部时钟不存在,jackd服务将不能正常启动。

接下来会产生一个问题,在I2S master模式下,只产生BCK和LRCK时钟,没有MCLK时钟,可能有些外部解码器需要提供MCLK时钟,这个问题还没搞清楚怎么办,不过有一种硬件的解决方案是使用锁相环倍频电路,不过此电路的缺点是最高支持48k采样率。

锁相环倍频电路

 假如CLK-IN输入的是LRCK时钟,74HC4046的3脚就与74HC4040的256分频连接,此时CLK-OUT输出就是11.2896M,或者CLK-IN输入的是BCK时钟,74HC4046的3脚就与74HC4040的4分频连接,此时CLK-OUT输出也是11.2896M。CLK-OUT就是通过倍频生成的MCLK时钟。

--------------------------------------------------------------------------------------------------------------------------------

如果使用I2S SLAVE模式就简单了,使用有源晶振直接分频即可,参照以下电路即可得到MCLK,BCK,LRCK三个时钟信号

 请注意LRCK,BCK时钟信号应与ROCK PI S的ADC_LRCK,ADC_BCK连接,而不是DAC_LRCK,DAC_BCK。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/625147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP快速实战20-PHP7中的垃圾回收机制与原理讲解

文章目录 前言PHP垃圾回收实现的原理垃圾回收机制引用计数循环垃圾收集 实现原理 总结 前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP快速入门与实战 在计算机程序中&#xff0c;垃圾回收指的是一种自动管理内存的技术。在程序执行过程中&#xff0c;分配给它的内存会随着…

2023年软件测试趋势?测试人的发展前景?“我“到底该如何走...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 现在开始学习软件…

NetSuite 中国财务常用报表功能包

目录 1.致谢 2.功能说明 2.1 概述 2.2 报表说明 3.安装 4.操作指南 4.1 CLR_资产负债表 4.2 CLR_资产负债表&#xff08;期初/发生/结余&#xff09; 4.3 CLR_利润表 4.4 CLR_利润表季报 4.5 CLR_现金流量表 4.6 CLR_现金流量表季报 4.7 CLR_总账 4.8 CLR_序时账…

《消息队列高手课》课程学习笔记(八)

如何实现高性能的异步网络传输&#xff1f; **异步与同步模型最大的区别是&#xff0c;同步模型会阻塞线程等待资源&#xff0c;而异步模型不会阻塞线程&#xff0c;它是等资源准备好后&#xff0c;再通知业务代码来完成后续的资源处理逻辑。**这种异步设计的方法&#xff0c;…

深入理解深度学习——注意力机制(Attention Mechanism):注意力评分函数(Attention Scoring Function)

分类目录&#xff1a;《深入理解深度学习》总目录 《深入理解深度学习——注意力机制&#xff08;Attention Mechanism&#xff09;&#xff1a;注意力汇聚与Nadaraya-Watson 核回归》中使用了高斯核来对查询和键之间的关系建模。式中的高斯核指数部分可以视为注意力评分函数&a…

Spark笔记

DBeaver数据库连接器 Download | DBeaver Community shell命令 bin/spark-submit –class cn.edu.ncut.sparkcore.wordcount.Test03_WordCount_cluster –deploy-mode cluster –master yarn ./sparkcore-1.0-SNAPSHOT.jar 10 血缘关系查看 toDebugString()&#xff1a…

深入篇【Linux】学习必备:【文本编辑器】vim的基本介绍及使用

深入篇【Linux】学习必备&#xff1a;【文本编辑器】vim的基本介绍及使用 Ⅰ.vim基本简介Ⅱ.vim的基本操作⏰【命令模式下】1.移动光标2.复制删除粘贴3.替换更改4.撤销指令 ⏰【底行模式下】1.查找字符2.保存退出3.查看所有模式 Ⅲ.简单vim配置1.配置文件位置2.使用插件 Ⅰ.vim…

前后端交互三、Ajax加强

零、文章目录 前后端交互三、Ajax加强 1、XMLHttpRequest的基本使用 &#xff08;1&#xff09;什么XMLHttpRequest XMLHttpRequest&#xff08;简称 xhr&#xff09;是浏览器提供的 Javascript 对象&#xff0c;通过它&#xff0c;可以请求服务器上的数据资源。jQuery 中的…

力扣 209. 长度最小的子数组

一、题目描述 给定一个含有 n 个正整数的数组和一个正整数 target。 找出该数组中满足其和大于等于 target 的长度最小的连续子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例 1&#xff1a; 输入&#xff1a;target 7, nums [2,3,1…

Servlet详解

目录 一. Servlet介绍 1.1 概念 2.2 Servlet架构 二. 创建一个Servlet程序 2.1 创建一个Maven项目 2.2 引入 jar 包 2.3 创建目录 2.4 编写代码 2.5 打包程序 2.6 部署程序 2.7 验证程序 三. Servlet常用API 3.1 HttpServlet 3.2 HttpServletRequest 3.2 HttpServlet…

深入了解SSM框架(案例(SSM+Jsp) + 详细分析 + 思维导图)

1.Spring Spring就像是整个项目中装配bean的大工厂&#xff0c;在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。也可以称之为项目中的粘合剂。 Spring的核心思想是IoC&#xff08;控制反转&#xff09;&#xff0c;即不再需要程序员去显式地new一个…

swagger 接口测试,用 python 写自动化时该如何处理?

在使用Python进行Swagger接口测试时&#xff0c;可以使用requests库来发送HTTP请求&#xff0c;并使用json库和yaml库来处理响应数据。以下是一个简单的示例代码&#xff1a; 如果你想学习自动化测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站百万播…

vim编辑器基本使用

一、写在前面 今天在练习git相关操作时&#xff0c;无意间发现当你使用commit命令提交代码时&#xff0c;忘记添加备注信息会自动进入一个奇怪的模式&#xff0c;按esc键亦或是ctrlC都无法退出&#xff0c;这个奇怪的模式也就是vim编辑器。如下图&#xff1a; vim是一种文本…

前端工程化-VUE

前端工程化-VUE Vue-cliNode.js1&#xff0e;什么是Node.js2&#xff0e;Node.js的安装 高效的开发离不开基础工程的搭建。本章主要介绍如何使用Vue进行实际SPA项目的开发&#xff0c;这里使用的是目前热门的JavaScript应用程序模块打包工具Webpack&#xff0c;进行模块化开发、…

嵌入式C语言中if/else如何优化详解

观点一&#xff08;灵剑&#xff09;&#xff1a; 前期迭代懒得优化&#xff0c;来一个需求&#xff0c;加一个if&#xff0c;久而久之&#xff0c;就串成了一座金字塔。 当代码已经复杂到难以维护的程度之后&#xff0c;只能狠下心重构优化。那&#xff0c;有什么方案可以优雅…

Spring 源码解析 - FactoryBean 获取 Bean 过程

一、FactoryBean FactoryBean是Spring框架提供的一个核心接口之一&#xff0c;用来创建复杂或无法通过默认构造函数创建的对象。这种情况下通过实现FactoryBean接口&#xff0c;可以自定义实例化Bean的过程&#xff0c;包括Bean的对象类型、初始化、销毁等。 在应用场景中&am…

RK3588平台开发系列讲解(进程篇)程序的二进制格式 ELF

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、ELF 文件二、二进制文件组成三、运行程序为进程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢CPU 是不能执行文本文件里面的指令的,这些指令只有人能看懂,CPU 能够执行的命令是二进制的,比如“0101”…

Selenium还能这么玩:自动管理浏览器

这是个系列文章&#xff0c;主要讲selenium一些实战操作&#xff0c;使用 Python 编写代码。可以把他们应用到自动化测试&#xff0c;也可以应用到网络爬虫中。 这篇文章介绍一个操作&#xff0c;可以让selenium 控制浏览器共用同一个 session。他的应用场景是&#xff1a;共用…

pwn3-绕过防御-ROP(1)

**ROP&#xff1a;**全程Return Oriented Programming(面向返回的编程)&#xff0c;在栈溢出基础上&#xff0c;利用程序中已有的小片段(gadgets)&#xff0c;改变寄存器或变量的值&#xff0c;从而控制程序执行流程&#xff0c;从而绕过NX防御&#xff0c;常见有ret2text,ret2…

Linux:samba服务 (smbd)

smb服务器为centos7 使用的yum安装&#xff08;如果不会搭建本地yum仓库可以查看&#xff09; Linux&#xff1a;rpm查询安装 && yum安装_鲍海超-GNUBHCkalitarro的博客-CSDN博客 samba 简介 samba 使用了 1.SMB 协议 Server Message Block&#xff0c;服务消息块 2…