RV1106+es8388音频采集和播放调试

1 问题

播放文件无声输出,采集声音数据全为0。

2 定位过程

2.1 查看pinctrl无i2s

查询指令:

go 复制代码
cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins |grep i2s

发现无i2s的相关管脚定义,修改设备树,增加pinctrl,代码如下:

同时i2s0_pins也要修改,如下:

修改完后,pinctrl正确:

如果还不对,估计是有和别的功能的管脚定义冲突了,需要再检查设备树。

2.2 示波器抓无MCLK信号

此时问题依然,抓i2s的信号。

下图逻辑分析仪抓的,实际上MCLK使用示波器抓有波形的,但是幅值只有不到100mv,正常的应该是3.3V。

针对无MCLK的问题,通过redmine和官方沟通给出一个指令,devmem 0xff000004 32,显示确实是MCLK没有使能,图示如下:

手动配置使能:devmem 0xff000004 32 0xffff2220(具体定义官方文档需要申请,这里不纠结了)

配置后MCLK有输出,示波器测量电压也是3.3v,波形如下:

2.3 ES8388无输出

此时依然是问题依旧。

不经意间发现,rv1106的SDO是接在es8388的SDO上的:

Es8388手册中明确pin6为输入,pin8为输出:

硬件飞线,使得sdo对sdi,sdi对sdo,文件播放正常,录音正常。

3 设备树的要点

3.1 pinctrl

go 复制代码
i2s0 {
		/omit-if-no-ref/
		i2s0_pins: i2s0-pins {
			rockchip,pins =
				/* i2s0_lrck */
				<2 RK_PA1 2 &pcfg_pull_none>,
				/* i2s0_mclk */
				<2 RK_PA2 2 &pcfg_pull_none>,
				/* i2s0_sclk */
				<2 RK_PA0 2 &pcfg_pull_none>,
				/* i2s0_sdi0 */
				<2 RK_PA5 2 &pcfg_pull_none>,
				/* i2s0_sdo0 */
				<2 RK_PA4 2 &pcfg_pull_none>;
				/* i2s0_sdo1_sdi3 */
				//<2 RK_PA7 2 &pcfg_pull_none>,
				/* i2s0_sdo2_sdi2 */
				//<2 RK_PA6 2 &pcfg_pull_none>,
				/* i2s0_sdo3_sdi1 */
				//<2 RK_PA3 2 &pcfg_pull_none>;
		};
	};
go 复制代码
&i2s0_8ch {
	#sound-dai-cells = <0>;
    pinctrl-names = "default";
    pinctrl-0 = <&i2s0_pins>;
    status = "okay";
};

3.2 8388驱动

go 复制代码
&i2c3 {
    status = "okay";

	es8388: es8388@10 {
    	status = "okay";
        compatible = "everest,es8388", "everest,es8323";
        reg = <0x10>;
        clocks = <&cru I2S0_8CH_MCLKOUT>;
        clock-names = "mclk";
        assigned-clocks = <&cru I2S0_8CH_MCLKOUT>;
        assigned-clock-rates = <12288000>;
        #sound-dai-cells = <0>;
    };
    
};

3.3 8388声卡驱动

go 复制代码
es8388_sound: es8388-sound {
       	status = "okay";
    		compatible = "simple-audio-card";
    		simple-audio-card,name = "Erockchip,es8388-codec";
    		simple-audio-card,format = "i2s";
    		simple-audio-card,mclk-fs = <256>;
    		simple-audio-card,cpu {
        		sound-dai = <&i2s0_8ch>;
    		};
    		simple-audio-card,codec {
        		sound-dai = <&es8388>;
    		};
	};
复制代码
//关闭rv1106的原有声卡定义
go 复制代码
acodec_sound: acodec-sound {
	status = "disable";
	compatible = "simple-audio-card";
	simple-audio-card,name = "rv1106-acodec";
	simple-audio-card,format = "i2s";
	simple-audio-card,mclk-fs = <256>;
	simple-audio-card,cpu {
		sound-dai = <&i2s0_8ch>;
	};
	simple-audio-card,codec {
		sound-dai = <&acodec>;
	};
};

4 基本调试指令

go 复制代码
cat /proc/asound/cards  //查看声卡
cat /sys/kernel/debug/regmap/3-0010/registers  //查看8388的寄存器
cat /sys/kernel/debug/clk/clk_summary | grep i2s0_8ch_mclkout  // 查看mclk的频率
cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins |grep i2s  //查看管脚映射
go 复制代码
rk_mpi_amix_test --list_contents //查看指令,具体的在sdk的文档中也有介绍

rk_mpi_ai_test --sound_card_name=hw:0,0 --device_rate=16000 --device_ch=2 --out_rate=16000 --out_ch=2 --output=/tmp

rk_mpi_ao_test -i /tmp/test.pcm --input_rate=48000 --input_ch=2 --device_rate=48000 --device_ch=2 --bit=16 --sound_card_name=hw:0,0

rk_mpi_ao_test -i /tmp/cap_out.pcm --input_rate=16000 --input_ch=2 --device_rate=16000 --device_ch=2 --bit=16 --sound_card_name=hw:0,0
go 复制代码
i2cdetect -y 3  //查看iic总线

//输出增益
i2cget -f -y 3 0x10 0x2e  //L out1 vol  0x1e = 0
i2cget -f -y 3 0x10 0x2f  //R out1 vol
i2cget -f -y 3 0x10 0x30  //L out2 vol
i2cget -f -y 3 0x10 0x31  //R out2 vol

i2cset -f -y 3 0x10 0x2e 0x1e
i2cset -f -y 3 0x10 0x2f 0x1e
i2cset -f -y 3 0x10 0x30 0x1e
i2cset -f -y 3 0x10 0x31 0x1e

5 MCLK使能配置

上边已经找到了MCLK无输出的原因,所以要加到代码中,添加代码到es8388的probe或者i2s的probe。

我这边加到了es8388的probe中,具体代码如下:

go 复制代码
void __iomem *reg_addr;
int val = 0 ;
printk("-------------------mclk out enable set\n");
reg_addr = ioremap(0xff000004, 4);
if (reg_addr) {
    writel(0xffff2220, reg_addr);
    val = readl(reg_addr);
    printk("-------------------val = 0x%x\n",val);
    iounmap(reg_addr);
} else {
    printk("-------------------Failed to map CPU config register\n");
}

6 MCLK的疑问

原则上这个mclk应该是可以随着设备树的配置一起工作的,因为sclk、lrclk、dat都是正常。

可能还是设备树的配置问题,官方给了一个设备树配置的方法,但是依然不行,所以索性就直接在代码中使能,待以后有时间再找原因。

相关推荐
沐禾安信14 小时前
AVI 视频打不开?2026 四款转 MP4 工具封神
音视频·电脑录屏
兵叔物联16 小时前
基于FFmpeg的短视频自动剪辑工具
ffmpeg·音视频
AORUO奥偌16 小时前
从“拼凑”到“集成”:音视频系统如何重塑弱电智能化建设逻辑
音视频·公共广播系统·音视频系统·多媒体会议与ip广播系统·多媒体会议系统
禹亮科技17 小时前
大型国企会议室音视频集成实战:3间120㎡空间Poly G7500+LED大屏+讯飞多语言会议系统落地方案
音视频·视频会议系统集成·上海禹亮科技·讯飞听见多语言会议系统·poly g7500
音视频牛哥19 小时前
SmartMediaKit macOS版RTSP/RTMP低延迟播放器:技术架构、核心能力与应用实践
音视频·低延迟rtsp播放器·macos直播播放器·macos rtsp播放器·macos rtmp播放器·rtsp播放器mac版·rtmp播放器mac版
潜创微科技21 小时前
沁恒CH9339:USB3.0超高速对拷,两台电脑一根线共享一切
音视频
Cxiaomu21 小时前
从 TRTC Demo 到独立音视频服务:React + TRTC Web SDK 服务化实践
前端·react.js·音视频
EasyGBS1 天前
政务视频资源汇聚:国标GB28181视频平台EasyGBS在“一网统管”中的定位和落地路径
网络·音视频·政务
蝉蜕日记2 天前
视频压缩 v1.1.31:高效压缩,无损画质,释放存储空间
音视频·生活·视频编解码·视频·软件需求
lumengabc2 天前
视频制作流程MP4旁白语音生成裁剪视频压缩python处理ppt转视频M4a格式
音视频