3. R-Car音频驱动与ALSA SoC框架
在R-Car平台上,音频子系统并不是“一个驱动搞定所有事情”,而是由Linux ALSA SoC(ASoC)框架把SoC内部音频接口、板级外部Codec、以及两者之间的数字连接拆成三层来管理。理解这三层以及它们之间的绑定关系,是后续调试无声、杂音、采样率不匹配等问题的前提。
一、ASoC三层结构在R-Car上的映射
ASoC把音频系统划分为Platform、CPU DAI、Codec和Machine驱动四类角色。在R-Car上,它们分别对应:
- Platform:R-Car的SCU(Sound Common Unit)或SSI控制器,负责DMA搬运与音频数据流管理,典型驱动为
rcar_sound。 - CPU DAI:SoC侧的串行音频接口,如SSI0~SSI9、SCU、SRC等,负责I2S/TDM/DSP格式的时钟与数据线收发。
- Codec:板载音频编解码器(如AK4613、PCM3168A)或外部DSP,负责模拟/数字转换。
- Machine驱动:把CPU DAI与Codec通过DAI Link绑定,并注册声卡,典型文件为
sound/soc/renesas/rcar-*.c或设备树中的simple-audio-card。
这四类角色在运行时通过struct snd_soc_dai_link连接,形成一条从用户空间PCM到物理音频线的完整通路。
二、DAI、DAI Link与DAPM的分工
DAI(Digital Audio Interface)是数字音频接口的抽象,每个DAI有独立的时钟、格式和通道能力。R-Car的SSI和SCU都注册为DAI,Codec侧也注册自己的DAI。DAI本身只描述“接口能力”,不决定谁连谁。
DAI Link是Machine驱动中的核心结构,它把CPU DAI与Codec DAI配对,并指定platform、codec、cpu_dai_name、codec_dai_name、dai_fmt等字段。一个声卡可以包含多条DAI Link,例如R-Car H3的Salvator-X板就同时连接AK4613和PCM3168A,形成两条独立链路。
DAPM(Dynamic Audio Power Management)负责音频路径上的电源管理。它把Codec内部的Mixer、Mux、PGA、ADC、DAC以及SoC侧的DAI都建模为Widget,通过Route描述连接关系。当PCM流打开时,DAPM自动沿着有效路径上电,关闭时断电,从而避免静态功耗。调试时常用amixer查看和设置这些Widget的状态。
三、设备树中的音频节点配置
R-Car的音频设备树通常由三部分组成:SoC侧的rcar_sound节点、Codec节点、以及Machine节点(sound或simple-audio-card)。以SSI连接AK4613为例,关键配置如下:
&rcar_sound {
pinctrl-0 = <&ssi0_pins>;
pinctrl-names = "default";
status = "okay";
rcar_sound,dai {
dai0 {
playback = <&ssi0>;
capture = <&ssi0>;
};
};
};
&ssi0 {
status = "okay";
};
&ak4613 {
compatible = "asahi-kasei,ak4613";
clocks = <&audio_clk_a>;
clock-names = "mclk";
status = "okay";
};
sound {
compatible = "simple-audio-card";
simple-audio-card,name = "rcar-sound";
simple-audio-card,format = "i2s";
simple-audio-card,bitclock-master = <&ssi0>;
simple-audio-card,frame-master = <&ssi0>;
simple-audio-card,cpu {
sound-dai = <&ssi0>;
};
simple-audio-card,codec {
sound-dai = <&ak4613>;
};
};
这里bitclock-master和frame-master指定SSI0为主时钟源,Codec为从设备。如果主从关系写反,会出现时钟无法锁定、播放速度异常或完全无声。设备树编译后,内核会依据这些节点自动生成DAI Link并注册声卡。
四、调试方法与常见问题定位
音频调试应遵循“先看声卡是否注册,再看DAI Link是否绑定,最后看DAPM路径是否上电”的顺序。常用命令如下:
cat /proc/asound/cards:确认声卡是否注册,若为空说明Machine驱动或设备树节点未生效。cat /proc/asound/card0/pcm0p/sub0/hw_params:查看当前PCM流的采样率、格式、通道数,判断是否与Codec能力匹配。amixer -c 0 controls:列出所有DAPM Widget,检查关键路径(如DAC→Mixer→Output)是否存在且未被静音。dmesg | grep -i "asoc\|rcar\|ak4613":查看驱动probe日志,定位DAI Link绑定失败或时钟获取失败。
status未设为okay,或simple-audio-card,format与Codec实际格式不一致。例如AK4613支持I2S和左对齐,若设备树写i2s而Codec寄存器配置为左对齐,则数据错位、表现为噪声或无声。
hw_params阶段返回-EINVAL,此时应检查dai_fmt与Codec的set_fmt实现是否兼容。