ASoC 组件绑定与 DAI Link

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
2
3
4
5
6
7
8
9
10
11
12
13
CPU/codec platform/i2c probe
-> devm_snd_soc_register_component()
-> component + DAI enter global registry

machine probe
-> devm_snd_soc_register_card()
-> snd_soc_bind_card()
-> match dai_link components
-> soc_probe_link_components()
-> soc_init_pcm_runtime()
-> soc_new_pcm()
-> snd_soc_pcm_dai_new()
-> snd_card_register()

组件 probe 顺序不确定;缺少任何 DAI/component 时 card 可 defer probe。

描述:

  • 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
2
3
4
5
6
ALSA snd_pcm open
-> soc_pcm_open()
-> component open
-> CPU/codec DAI startup()
-> machine ops->startup()
-> merge runtime constraints

close 以对应顺序 shutdown 并释放 active/refcount。

6. hw_params

1
2
3
4
5
soc_pcm_hw_params()
-> machine hw_params
-> codec DAI hw_params
-> CPU DAI hw_params
-> component/platform 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-dai phandle 错;
  • codec I2C probe 失败;
  • missing clocks/resets;
  • machine driver未启用;
  • DAI format/master 双方冲突;
  • deferred probe 永久等待供应者。

文章互动

阅读 --

留言

0 条留言

正在加载留言…