音频驱动
1. 概述
1.1 功能简介
音频驱动负责处理音频信号的输入和输出。RK3576 内置 I2S/PCM 音频接口,支持 I2S、TDM、PCM 等多种音频格式,可通过 I2C 连接外部音频编解码器(Codec)芯片,实现高质量音频播放和录制。M4-R2 底板具体的音频接口(扬声器、耳机、麦克风)以实际物料为准(待板上验证)。
1.2 应用场景
- 音频播放:音乐播放、语音合成、系统提示音
- 音频录制:麦克风录音、语音识别输入
- 视频通话:配合摄像头和网络实现音视频通话
- 车载音频:车载导航语音输出、免提通话
- 工业语音:工业设备语音报警、对讲系统
1.3 工作原理
RK3576 的音频接口支持以下特性:
| 特性 | 说明 |
|---|---|
| I2S | 标准 I2S 音频接口 |
| TDM | 时分复用,多通道音频 |
| PCM | 脉冲编码调制接口 |
| 采样率 | 支持 8kHz~192kHz |
| 位宽 | 16/24/32 位 |
详见 RK 官方文档:[《Rockchip_Developer_Guide_Linux_Software_CN.pdf》]
2. 硬件准备
2.1 硬件清单
| 组件 | 型号/规格 | 数量 | 备注 |
|---|---|---|---|
| 主控板 | C-3576BQ 核心板 + M4-R2 底板 | 1 | |
| 调试串口线 | USB 转 TTL(3.3V) | 1 | 波特率 1500000 |
| 音频 Codec 模块 | ES8388 / ES7210 / ES8326 | 1 | I2C + I2S 接口 |
| 扬声器/耳机 | 8Ω 0.5W 小喇叭 / 3.5mm 耳机 | 1 | 用于音频输出测试 |
| 麦克风(可选) | 驻极体麦克风 | 1 | 用于音频输入测试 |
| 杜邦线 | 母对母 | 若干 |
2.2 引脚连接
以 ES8388 音频 Codec 为例:
| 主控板引脚 | Codec 引脚 | 功能说明 |
|---|---|---|
| I2S1_SCK | SCLK | I2S 时钟 |
| I2S1_LRCK | WS/LRCK | I2S 字选择(左右声道) |
| I2S1_SDO | DSDOUT | I2S 数据输出 |
| I2S1_SDI | DSDIN | I2S 数据输入 |
| I2C1_SDA | SDA | I2C 数据(配置 Codec) |
| I2C1_SCL | SCL | I2C 时钟 |
| 3.3V | VCC | Codec 电源 |
| GND | GND | 共地 |
I2S 和 I2C 引脚在底板原理图中有标注,具体引出与复用关系以实际原理图与 SDK 配置为准(待板上验证)。实际操作时应确认引脚连接正确。
2.3 硬件确认
# 查看音频设备
aplay -l # 播放设备
arecord -l # 录音设备
# 查看 ALSA 声卡
cat /proc/asound/cards
cat /proc/asound/card0/id3. 软件准备
3.1 内核配置
确认以下内核配置已启用:
CONFIG_SND=y
CONFIG_SND_SOC=y
CONFIG_SND_SOC_ROCKCHIP=y
CONFIG_SND_SOC_ROCKCHIP_I2S=y
CONFIG_SND_SOC_ES8388=y
CONFIG_SND_SOC_ES7210=y
CONFIG_SND_SOC_HDMI_CODEC=y
CONFIG_SND_PCM=y
CONFIG_SND_JACK=y
CONFIG_OF=y3.2 设备树
RK3576 的 I2S 控制器在设备树中定义(以下为 RK 平台通用结构示例):
i2s1: i2s@fe510000 {
compatible = "rockchip,rk3576-i2s", "rockchip,rk3066-i2s";
reg = <0x0 0xfe510000 0x0 0x1000>;
interrupts = <GIC_SPI 147 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru MCLK_I2S1>, <&cru HCLK_I2S1>;
clock-names = "mclk", "hclk";
dmas = <&dmac1 4>, <&dmac1 5>;
dma-names = "tx", "rx";
rockchip,grf = <&sys_grf>;
#sound-dai-cells = <0>;
status = "disabled";
};以上寄存器基地址、中断号与时钟标识为 RK 平台通用结构示例,具体数值以实际发布的 RK3576 SDK 设备树为准(待板上确认)。
4. 操作步骤
4.1 查看音频设备
# 查看声卡列表
cat /proc/asound/cards
# 输出示例:
# 0 [es8388 ]: es8388 - es8388
# es8388
# 查看播放设备
aplay -l
# 查看录音设备
arecord -l
# 查看 PCM 设备
cat /proc/asound/pcm4.2 播放音频
# 播放 WAV 文件
aplay test.wav
# 播放指定声卡
aplay -D plughw:0,0 test.wav
# 调节音量
amixer set 'Speaker' 80%
amixer set 'Headphone' 100%
# 查看音频控件
amixer contents4.3 录制音频
# 录制 WAV 文件(10 秒)
arecord -f S16_LE -r 44100 -c 2 -d 10 test.wav
# 录制指定声卡
arecord -D plughw:0,0 -f S16_LE -r 44100 -c 2 test.wav
# 同时播放和录制(环回测试)
arecord -f S16_LE -r 44100 -c 2 -d 5 | aplay -f S16_LE -r 44100 -c 24.4 设备树中配置音频
&i2s1 {
status = "okay";
pinctrl-0 = <&i2s1_lrck &i2s1_sclk &i2s1_sdi &i2s1_sdo>;
pinctrl-names = "default";
// 配置音频路由
sound-name = "rockchip,es8388-codec";
rockchip,audio-codec = <&es8388>;
rockchip,platform = <&i2s1>;
};
&es8388 {
status = "okay";
compatible = "everest,es8388";
reg = <0x10>; // I2C 地址
clocks = <&cru MCLK_I2S1>;
clock-names = "mclk";
// 音频路由配置
pinctrl-0 = <&spk_ctl &hp_ctl>;
pinctrl-names = "default";
spk-ctl-gpio = <&gpio1 RK_PA2 GPIO_ACTIVE_HIGH>;
hp-ctl-gpio = <&gpio1 RK_PA3 GPIO_ACTIVE_HIGH>;
};以上 pinctrl 名称与 GPIO 编号为 RK 平台通用示例,具体以实际 SDK 设备树为准。
5. 代码详解
5.1 内核中音频驱动的注册
// RK3576 I2S 控制器驱动(简化)
// sound/soc/rockchip/rockchip_i2s.c
static struct platform_driver rockchip_i2s_driver = {
.probe = rockchip_i2s_probe,
.remove = rockchip_i2s_remove,
.driver = {
.name = "rockchip-i2s",
.of_match_table = rockchip_i2s_match,
},
};
static const struct of_device_id rockchip_i2s_match[] = {
{ .compatible = "rockchip,rk3576-i2s" },
{ /* sentinel */ }
};5.2 用户空间音频操作的内核调用链
用户空间 aplay test.wav
→ snd_pcm_open()
→ snd_pcm_hw_params()
→ snd_pcm_start()
→ rockchip_i2s_trigger()
→ 启动 DMA 传输
→ 将音频数据写入 I2S 发送 FIFO6. 常见问题
6.1 声卡无法识别
现象: aplay -l 无输出
解决方案:
# 检查声卡是否加载
cat /proc/asound/cards
# 检查 I2C 设备(Codec)
i2cdetect -y 0
# 检查 I2S 时钟
cat /sys/kernel/debug/clk/clk_mclk_i2s1/clk_rate
# 检查设备树中音频节点状态
# 具体节点路径以实际 DTB 反编译结果为准
dtc -I dtb -O dts /sys/firmware/fdt | grep -A3 "i2s@"确认设备树中 I2S 和 Codec 节点 status = "okay",检查 I2C 地址是否正确。
6.2 播放无声音
现象: aplay 执行成功但无声音输出
解决方案:
# 检查音量设置
amixer contents
# 确保音量未静音
amixer set 'Speaker' unmute
amixer set 'Speaker' 80%
# 检查音频路由
cat /proc/asound/card0/pcm0p/info
# 使用 speaker-test 测试
speaker-test -c 2 -t wav -l 1检查扬声器/耳机连接,确认 Codec 输出路由配置。
6.3 音频杂音
现象: 音频播放有杂音或爆音
解决方案:
# 检查 MCLK 时钟频率
cat /sys/kernel/debug/clk/clk_mclk_i2s1/clk_rate
# 调整 ALSA 混音器设置
alsamixer检查 I2S 时钟配置(MCLK 应为采样率的 256/384/512 倍),排查电源噪声。
