本篇是《嵌入式外设调试思路》系列的 Audio 调试篇梳理音频外设从硬件、软件到常见故障的通用排查方法。一、常用的 Audio 调试工具类别工具硬件仪器万用表、示波器、信号发生器、AP 音频分析仪调试命令tinyplay / alsa-utilsaplay、arecord、amixer、alsaloopfsprocfs、sysfsiotracesystrace、ftracePC 工具Audacity、Adobe Audition二、调试思路2.1 硬件方面供电与配置一致硬件供电要与软件配置的 IO domain 电压一致否则可能造成功能异常甚至芯片损坏测量信号用示波器测量时钟和数据信号检查时钟频率、幅度、占空比、jitter 等是否符合协议规范。比如工作电压为 3.3 V而实际时钟信号只有 2 V导致采集不到数据——原因可能是被外设拉低、对地短路或者软件电压配置不正确等。2.2 软件方面确认 driver 和 dts 配置进入系统后用i2cdetect -y -a X确认能否正确识别到音频设备Codec通过 procfs 确认声卡注册成功以及时钟设置是否正确最后进行播放 / 录音测试验证功能。三、整体调试步骤第 1 步确认引脚复用情况cat/sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins|grepi2s第 2 步确认 Codec 是否识别i2cdetect-y-aX第 3 步确认声卡是否注册成功# cat /proc/asound/cards0[rockchiprk809co]: rockchip_rk809- - rockchip,rk809-codec rockchip,rk809-codec7[Loopback]: Loopback - Loopback Loopback1# ls /dev/snd/by-path controlC7 pcmC0D0p pcmC7D0p pcmC7D1p controlC0 pcmC0D0c pcmC7D0c pcmC7D1c timer第 4 步查看时钟设置是否正确cat/sys/kernel/debug/clk/clk_summary|grep-Ei2s0|mclkcat/sys/kernel/debug/clk/clk_summary|grepi2s0_8ch_mclkoutcat/sys/kernel/debug/clk/clk_summary|egrepi2s0|pll四、排查思路4.1 声卡注册失败确认声卡驱动配置已编译进系统根据 kmsg 定位原因是出在 DAI、CODEC 还是 Machine。比如下面的 log 表示 DAI 未注册上[ 0.584114] rk-multicodecs vad-sound: ASoC: CPU DAI (null) not registeredDAI failDMA 通道资源不足时会导致 DAI 注册失败可关闭其他使用 DMA 的模块后再次确认CODEC fail使用万用表和示波器测量 CODEC 的电压、时钟配合 i2c-tools 确认 I2C 设备通信是否正常。4.2 播放无声确认音频源为非静音文件使用aplay或tinyplay播放定位问题发生在用户态还是内核态播放等待 10 秒以上确认是否为 I/O error 问题使用amixer或tinymix检查 CODEC 内部 DAC 通路是否打开、音量是否静音查看寄存器配置配合芯片手册或 CODEC 手册确认 IOMUX、DAI、CODEC 配置是否正确使用万用表和示波器测量电压、时钟、数据确认电压和时钟正常、数据线上有波形测量 CODEC 近端模拟输出信号是否正常测量 PA 使能 GPIO 电平逐级定位问题点。4.3 录音无声CODEC 端通过信号发生器输入 1 kHz 波形使用arecord或tinycap录音定位问题发生在用户态还是内核态录音等待 10 秒以上确认是否为 I/O error 问题使用amixer或tinymix检查 CODEC 内部 ADC 通路是否打开、音量是否静音查看寄存器配置配合芯片手册或 CODEC 手册确认 IOMUX、DAI、CODEC 配置是否正确使用万用表和示波器测量电压、时钟、数据确认电压和时钟正常、数据线上有波形测量 CODEC 近端模拟输入信号是否正常逐级定位问题点。4.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 的整个生命周期内持续提供如果无法保证请保持时钟常开。
阅读完成 · 觉得有帮助?