1、概述
针对音箱日常工作项目开展的前期,需要快速的适配音频子模块,方便项目的声学评估和开展,期间遇到不少的问题,其中有一些细节往往会忽略掉,然而正好是问题的所在。在此背景下,遇到问题一步一步梳理,方便快速的定位出问题所在 。
适用范围 : 通用的Android / Linux 平台皆可适用
2、硬件相关准备
2.1 确保硬件通路正常
- 确保硬件板子相关连接都已经准备好,例如包括使用到的 I2C_SDA、I2C_SCK 以及
I2S_MCLK、I2S_BCLK、I2S_LRCK、I2S_DIN、I2S_DOUT 等是否都已连接好,硬件上时
钟及数据脚通路是否都以确定 OK; - 主控端 I2S 模块及外挂模块供电正常
2.2 硬件原理图
- 通过项目相应原理图确认使用的哪组 I2S 及其相应的引脚、复用;
- 通过相应原理图确认为实现外挂 Codec 与主控间的通讯而使用的哪组 I2C;
- 例如麦克风 PDM接口的接线图,一方面保证引脚配置,另一方避免引脚冲突
2.3 外挂 Codec 相关 datasheet
- 确认其使用的主/从模式?(master/slave?)
- 确认其正常工作的模块时钟频率?
- 确认其使用的数据传输模式及时钟信号翻转情况?(I2S/PCM?)
- 确认其使用的数据格式配置?(最大位宽?pcm_lrck_period 周期等?)
- 外挂 I2C 的 I2C 地址?
- 例如TAS5805 Datasheet 中的从机地址 ,一定要根据项目实际的电路图中ADR引脚的上拉电阻决定的

3. 软件相关准备
3.1 I2S 驱动及外挂驱动
- 主控端 I2S 接口模块实现驱动确认支持;
- 外挂 Codec 实现驱动确认支持;
3.2 软件相关配置修改
- 主控端 I2S 模块 daudio 相关数据格式配置项参数确认及配置;
- 主控端 I2S 模块 snddaudio 节点用于与外挂 Codec 绑定用的节点配置确认(外挂 Codec 的 codec name 与 codec_dai name 可通过外挂 Codec 驱动源码等方式确认);
- 外挂 Codec 的相关节点配置添加确认;
3.3 驱动模块使能
- 主控端 I2S 模块使能,包括 board.dts 配置文件模块使能及内核配置 menuconfig 模块使能;
- 外挂 Codec 驱动模块使能,包括 board.dts 配置文件模块使能及内核配置 menuconfig模块使能;
3.4 编译通过并打包
4. 实际验证
4.1 确认模块声卡注册并绑定成功;
- 通过指令:cat /proc/asound/cards 查看当前上机启动后是否有成功注册并绑定生成相应的外挂 Codec 名称的声卡; 针对Linux 平台也可以通过 arecord / aplay -l 查看声卡列表
root@:/
0 [snddmic ]: snddmic - snddmic
snddmic
1 [audiocodecex ]: audiocodec-ex - audiocodec-ex
audiocodec-ex
2 [sndacm8625 ]: sndtas5805 - sndtas5805
sndtas5805
- 通过 tinymix / amixer 查看当前注册声卡的音频控件列表是否正常;
- tinymix 适用于 Android 平台
- amixer 适用于 Linux 平台
root@:/
Simple mixer control 'Master',0
Capabilities: pvolume pvolume-joined
Playback channels: Mono
Limits: Playback 0 - 578
Mono: Playback 0 [0%]
4.2 确认 I2C 通讯正常;
- 可通过指令:dmesg | grep I2C 来查看当前是否有 I2C 相关的错误打印,如timeout / error 等;
- 一般I2C timeout 的原因主要有 : device端本身就没有回ACK,表现为I2C_ACKERR,大多是slave(从设备)问题,从设备上电是否符合SPEC等; 另外一种就是问题出在在master端(我们的CPU),表现为I2C_TIMEOUT。 在I2C bus没有上电的情况下去操作I2C
- 可通过外挂 Codec 提供的模块寄存器调试节点,实时操作节点来读写外挂 Codec 寄存器来确认 I2C 通讯是否正常;
- 如果I2C 不通,可通过i2c-tool 工具扫描发现的设备,单独操作设备,通过逻辑分析仪KingstVIS抓波形进行分析
4.3 外挂 Codec 模块音频通路配置
- 若有需要,通过 tinymix / amixer 指令工具配置相应外挂 Codec 的播放输出通路;
- 若有需要,通过 tinymix / amixer 指令工具配置相应外挂 Codec 的播放输出通路;
4.4 功放参数与硬件接法一致
硬件电路中功放接法是BTL模式,功放软件参数必须配置的也是BTL模式,否则会出现无声音的问题。
比如在某项目中,硬件电路接法是PBTL模式,但是功放参数中是BTL模式,所以排查一波之后才确定问题
- I2C读写正常
- 通过逻辑分析仪查看 I2S波形正常
- 然后最后才分析到模式这个疑问点

4.5 播放/录音功能验证
- 通过 tinyplay / aplay 指令工具播放指定 WAV 音频文件进行播放验证;
- Linux 平台上也可以通过 speaker-test 进行立体声测试
- 通过 tinycap / arecord 指令工具进行录制指定路径及名称的 WAV 音频文件,并在录音结束后通过
adb 工具(adb pull)将录音文件拉出并通过音频解析软件进行播放、查看确认等;
5. FAQ
-
按要求进行 menuconfig 配置,并且在 board.dts 将 I2S 打开,但无声卡生成。
-
按照Codec Datasheet 配置 I2C 从机地址,但I2C 一直Timeout
- 查看硬件电路 I2C SCK / SDA 是否接反以及从机设备供电是否正常
-
按照Codec Datasheet 配置 I2C 从机地址,当频繁的操作I2C 的时候,出现少部分写入Timeout
- 查看从机设备的上拉电阻是否按照Datasheet 标准来的
-
按照流程配置好Codec的音频通路以及I2C Addr,并可以发现音频节点,但是播放没声音
- 通过逻辑分析仪查看I2S / TDM / PCM 的波形的BCLK设置是否正常
- 芯片平台 通过dts 中的pcm_lrck_period 字段调整 可配置 16/32/64/128/256 个 bclk
-
I2C 通讯失败 i2c_drv_core_process()972 - [i2c2] Timeout when sending 9th SCL clk
-
主要原因在于芯片供电电压异常,导致芯片没处于正常的工作状态,从而操作I2C 会Timeout , 波形上显示 SCL 一直是拉低状态。正常状态应该是高电平