RK3588/RK3576/RK3562、T113/T527 Audio调试思路
(1)硬件供电与软件配置的domian一致,否则可能会造成功能异常,甚至芯片损坏等。(2)使用示波器测量硬件信号:时钟和数据。测量时钟频率,幅度,占空比,jitter等是否符合协议规范(比如:当⼯作电压为3.3v,而实际时钟信号只有2v时,导致采集不到数据,原因可能是被外设拉低,或者对地短路,或者软件电压配置不正确等)。
常用的Audio调试工具

调试思路
硬件方面:
(1)硬件供电与软件配置的domian一致,否则可能会造成功能异常,甚至芯片损坏等。
(2)使用示波器测量硬件信号:时钟和数据。测量时钟频率,幅度,占空比,jitter等是否符合协议规范(比如:当⼯作电压为3.3v,而实际时钟信号只有2v时,导致采集不到数据,原因可能是被外设拉低,或者对地短路,或者软件电压配置不正确等)。
软件方面:
(1)确认driver和配置dts,进入系统用i2cdetect -y -a X确认能否正确识别到音频设备。
(2)通过 procfs 确认声卡注册成功以及时钟是否设置正确。
(3)最后进行播录音测试,验证功能。
整体调试步骤如下:
第1步:确认引脚调用情况
cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins | grep i2s
第2步:确认声卡是否识别
i2cdetect -y -a X
第3步:确认声卡是否注册成功
# cat /proc/asound/cards0 [rockchiprk809co]: rockchip_rk809- - rockchip,rk809-codecrockchip,rk809-codec7 [Loopback ]: Loopback - LoopbackLoopback 1# ls /dev/snd/by-path controlC7 pcmC0D0p pcmC7D0p pcmC7D1pcontrolC0 pcmC0D0c pcmC7D0c pcmC7D1c timer
第4步:查看时钟设置是否正确
cat /sys/kernel/debug/clk/clk_summary | grep -E "i2s0|mclk"cat /sys/kernel/debug/clk/clk_summary | grep i2s0_8ch_mclkoutcat /sys/kernel/debug/clk/clk_summary | egrep "i2s0|pll"
排查思路
(1)声卡注册失败
-
确认声卡驱动配置编译进系统;
-
根据 kmsg 定位原因:DAI,CODEC 或者 Machine,比如如下log表示DAI未注册上
[ 0.584114] rk-multicodecs vad-sound: ASoC: CPU DAI (null) not registered
-
DAI fail:当 DMA 通道资源不足时,导致 DAI 注册失败,关闭其他使用 DMA 的模块,再次确认。
-
CODEC fail:使用万用表 和 示波器 测量 CODEC 电压,时钟;
-
配合 i2c-tools 确认 i2c 设备通信是否正常。
(2)播放无声
-
确认音频源为非静音文件;
-
使用 aplay 或者 tinyplay 播放,定位问题是发生在用户态还是内核态;
-
播放等待10秒以上确认是否为 I/O error 问题;
-
使用 amixer 或者 tinymix 检查 CODEC 内部 DAC 通路是否打开,音量是否静音
-
查看 寄存器 配置,配合芯⽚⼿册或者 CODEC ⼿册确认配置是否正确:IOMUX,DAI,CODEC。
-
使⽤ 万⽤表 和 ⽰波器 测量电压,时钟,数据。确认电压,时钟正常,数据线上有波形;
-
测量CODEC 近端 模拟输出信号是否正常,测量 PA 使能 gpio 电平,逐级定位问题点。
(3)录音无声
-
CODEC 端通过信号发生器生成 1k0 波形输入;
-
使用 arecord 或者 tinycap 录音,定位问题是生在用户态还是内核态;
-
录音等待10秒以上确认是否为 I/O error 问题;
-
使用 amixer 或者 tinymix 检查 CODEC 内部 ADC 通路是否打开,音量是否静音;
-
查看 寄存器 配置,配合芯片册或者 CODEC 手册确认配置是否正确:IOMUX,DAI,CODEC。
-
使用万用表 和示波器测量电压,时钟,数据。确认电压,时钟正常,数据线上有波形;测量CODEC 近端模拟输⼊信号是否正常,逐级定位问题点。
(4)I/O error
播放录⾳10秒以上⽆响应时内核 log 打印: playback/capture write error DMA or IRQ trouble?
-
通过 寄存器 查询 DAI 控制器 FIFO COUNT寄存器,是否已经停止计数;
-
通过 procfs 查看 dma 中断是否更新: cat /proc/interrupts | grep dma;
-
通过 寄存器 查询 DMA 控制器 channel status 寄存器(偏移地址:0x100)是否异常停止;
-
DAI 工作于 slave 时,请确保外设时钟在 DAI 的整个⽣命周期持续提供,如果无法保证,请保持常开。
欢迎关注“嵌入式分享”,持续更新!

更多推荐



所有评论(0)