ASoC 组件绑定与 DAI Link
1. 三层不是三个固定驱动
ASoC 把声卡拆为:
- CPU component/DAI:I2S/TDM/PDM/SPDIF 控制器;
- codec component/DAI:模拟 codec、数字 codec、HDMI codec;
- platform PCM:DMA 数据搬运;
- machine/card:连接、时钟策略、routing、jack。
一个 component 可同时提供多个 DAI 和 controls。
2. 核心对象
| 对象 | 作用 |
|---|---|
snd_soc_component_driver |
component 回调和 controls/DAPM 描述 |
snd_soc_component |
已注册实例 |
snd_soc_dai_driver |
DAI playback/capture capability |
snd_soc_dai |
DAI 实例 |
snd_soc_card |
整张板级声卡 |
snd_soc_dai_link |
CPU/platform/codec 连接 |
snd_soc_pcm_runtime |
一条 link 的绑定运行时 |
3. 注册与绑定
1 | CPU/codec platform/i2c probe |
组件 probe 顺序不确定;缺少任何 DAI/component 时 card 可 defer probe。
4. DAI Link
描述:
- CPU DAI;
- codec DAI(可多个);
- platform;
- stream name;
- format/master/inversion;
- playback/capture only;
- nonatomic;
- dynamic/no_pcm;
- trigger order;
- init/ops/fixup。
Device Tree machine driver把 phandle 和属性转换为 dai_link。
5. PCM open
1 | ALSA snd_pcm open |
close 以对应顺序 shutdown 并释放 active/refcount。
6. hw_params
1 | soc_pcm_hw_params() |
实际顺序受 ASoC 版本和 link 配置影响;驱动不应依赖未声明的全局顺序。
7. prepare/trigger
trigger 同时控制 component、codec DAI、CPU DAI。对于 playback,通常先使 DMA/FIFO 进入一致状态再启动时钟,避免 underrun/pop;capture 顺序可能相反。link 可配置 trigger order。
8. DPCM
Dynamic PCM 将:
- Front-End:用户可见 PCM;
- Back-End:真实硬件 link,
分离。DAPM route 决定 FE 与哪些 BE 连接,适合复杂 SoC mixer、多输出、DSP。dpcm_path_get()、runtime update 和 BE hw_params 协调共享后端。
9. PM
ASoC card suspend/resume 协调:
- active streams;
- DAPM;
- codec bias;
- component PM;
- jack wake;
- regcache;
- pmdown_time。
runtime PM 通常在具体控制器/codec 驱动管理 clock/reset/regulator。
10. 常见绑定失败
- CPU/codec DAI name 不匹配;
sound-daiphandle 错;- codec I2C probe 失败;
- missing clocks/resets;
- machine driver未启用;
- DAI format/master 双方冲突;
- deferred probe 永久等待供应者。
正在加载留言…