总结
-
普通snd_kcontrol的注册过程。
snd_soc_add_controls: snd_kcontrol_new构造处snd_kcontrol,放入card->controls链表。 -
DPMA的snd_kcontrol的注册过程。
2.1 snd_soc_dapm_new_controls //把widget放入到card->widgets链表
2.2 在注册machine驱动时,导致如下调用:
soc_probe_dai_link > soc_post_component_init > snd_soc_dapm_new_widgets
2.3 snd_soc_dpam_new_widgets:
对于每一个widget,设置它的power_check函数(用来判断该widget是否应该上电)
对于mixer widget,取出其中的kcontrol_new构造出snd_kcontrol,放入card->controls链表。
对于mux widget,它只有一个kcontrol_new,构造出snd_kcontrol,放入card->controls链表。
杂的
snd_soc_dapm_new_controls---->snd_soc_dapm_new_control: widget放到card->widgets链表
问题是:普通kcontrol和DPAM的kcontrol提供给应用层的接口是一样的,怎么操作?
最终widget中的kcontrol_new也会转换为snd_kcontrol,也会放入到card->controls
machine:注册machine驱动时,导致调用函数soc_probe_dai_link,调用函数soc_post_component_init,
snd_soc_dapm_new_widgets
对于每个widget
1)设置w->power_check:用来判断该widget是否要上电(上电条件 1.位于complete path上 2.有app在使用声卡)
2)对于mixer: mixer是混合器。
对于mixer,如果它的kcontrol_new位于某个path上,则使用
kcontrol_new来构造snd_kcontrol放入card->controls链表。
如果在软件上没有给kcontrol_new设置path,则认为你不想使用线路,就不创建kcontrol。
a
INPUT1----- -------
b | -
INPUT2----- ------- |+| A
c | -
INPUT3----- -------- mixer
得到的snd_kcontrol.name就是 A a
这个可以从tinymix中可以看到:
47 BOOL 1 Left Boost Mixer LINPUT2 Switch off,
这个kcontrol的组合了名字Left Boost Mixer和LINPUT2 Switch。
注意:snd_kcontrol的名字=widget's name + kcontrol_new's name
3)对于mux:单选器
ADCL--------Left |path1|
------MUX(单选)
ADCR--------Right |path2|
上图开关需要用一个Reg若干位表示,用一个kcontrol_new来表示,Left和Right是取值,不是名字。
mux widget组成包括: 1. MUX本身 2.一个snd_kcontrol_new,有多个取值,Left和Right。
对于 MUX widget说明
1)snd_kcontrol_new转换为snd_kcontrol放入到card->controls链表
2)对于sink widget为同一个MUX widget的path,path1和path2的kcontrol指向同一个kcontrol。