要适配 RK3308B 的 I2S 数字麦克风,需修改设备树(DTS)以正确配置音频路径和时钟关系。以下是关键步骤和完整示例:
关键步骤说明
定义数字麦克风编解码器节点
使用虚拟编解码器 dmic-codec(内核已内置驱动):
dmic_codec: dmic-codec {
compatible = "dmic-codec";
num-channels = <2>; // 通道数(根据麦克风数量调整)
wakeup-delay-ms = <50>; // 麦克风唤醒延时
status = "okay";
};
配置 simple-audio-card 节点
- 主从模式:若麦克风提供时钟(主模式),则设置
codec 为主设备(Master);若由 SoC 提供时钟(从模式),则设置 cpu 为主设备。
- 格式:
format = "i2s" 或 "left_j"(根据麦克风时序要求)。
- 时钟:
mclk-fs 需匹配麦克风规格(常见值 256、512)。
配置 I2S 控制器节点
确保 i2s_8ch_1 已启用,并指定 DMA 通道:
&i2s_8ch_1 {
status = "okay";
#sound-dai-cells = <0>;
rockchip,trcm-sync-tx-only; // 可选:仅 TX 同步模式
};
完整 DTS 配置示例
场景 1:麦克风为主设备(Master)
/ {
// 定义虚拟麦克风编解码器
dmic_codec: dmic-codec {
compatible = "dmic-codec";
num-channels = <2>;
wakeup-delay-ms = <50>;
status = "okay";
};
// 音频路由节点
sound {
compatible = "simple-audio-card";
simple-audio-card,name = "rockchip,i2s-mic";
simple-audio-card,format = "i2s";
simple-audio-card,mclk-fs = <256>;
// 麦克风为主设备,提供时钟
simple-audio-card,bitclock-master = <&dailink_master>;
simple-audio-card,frame-master = <&dailink_master>;
// CPU(I2S 控制器)配置
simple-audio-card,cpu {
sound-dai = <&i2s_8ch_1>;
};
// 编解码器配置(指向麦克风)
dailink_master: simple-audio-card,codec {
sound-dai = <&dmic_codec>;
bitclock-master; // 声明为主设备
frame-master;
};
};
};
// 启用 I2S 控制器
&i2s_8ch_1 {
status = "okay";
#sound-dai-cells = <0>;
};
场景 2:SoC 为主设备(Master)
/ {
sound {
...
// SoC 提供时钟
simple-audio-card,bitclock-master = <&dailink_cpu>;
simple-audio-card,frame-master = <&dailink_cpu>;
dailink_cpu: simple-audio-card,cpu {
sound-dai = <&i2s_8ch_1>;
bitclock-master; // CPU 为主设备
frame-master;
};
simple-audio-card,codec {
sound-dai = <&dmic_codec>;
};
};
};
调试要点
检查时钟配置
- 确保
mclk-fs 值与麦克风规格一致(如 256、512)。
- 主从模式必须与硬件设计匹配(可通过示波器验证时钟信号来源)。
内核配置
启用相关驱动:
CONFIG_SND_SIMPLE_CARD=y
CONFIG_SND_SOC_DMIC=y
调试命令
- 检查声卡加载:
cat /proc/asound/cards
- 查看 PCM 设备:
aplay -l 或 arecord -l
- 录制测试:
arecord -D hw:0,0 -f S16_LE -c 2 -r 16000 test.wav
查看时钟关系
在 /sys/kernel/debug/asoc/ 下检查 dai 时钟配置。
常见问题解决
- 无录音设备:检查 DTS 节点状态、时钟配置,确认麦克风供电正常。
- 杂音/失真:调整
mclk-fs 值,或检查 PCB 上时钟信号干扰。
- 主从模式错误:若麦克风不能输出时钟,强制配置为从模式(SoC 为主)。
通过以上步骤,RK3308B 即可正确驱动 I2S 数字麦克风。实际配置需根据硬件设计调整参数。