这里以Wolfson公司的编解码芯片WM8960为例来说明上篇介绍的相关内容。
定义widget所需的DAPM Kcontrol
1 | static const struct snd_kcontrol_new wm8960_loutput_mixer[] = { |
在上述代码中定义了左右输出通道的混音器控件,以及单声道输出混音器:wm8960_loutput_mixer、wm8960_routput_mixer、wm8960_mono_out。
定义真实的widget,包括DAMP控件
1 | static const struct snd_soc_dapm_widget wm8960_dapm_widgets[] = { |
在这一步中为左右声道选择器定义了一个MUX widget,他们是Left Output Mixer、Right Output Mixer和Mono Output Mixer。 我们还为每个扬声器定义了一个混音器widget:SPK_LP、SPK_LN、HP_L、HP_R、SPK_RP、SPK_RN、OUT3。具体的混音器控制由wm8960_loutput_mixer、wm8960_routput_mixer、wm8960_mono_out来完成,这三个widget都具有power属性,因此,当这些widget中的一个或多个位于一个有效的音频路径时,DAPM框架可以通过其各自的寄存器的第7和第8位来控制电源状态。
定义widget的连接路径
1 | static const struct snd_soc_dapm_route audio_paths[] = { |
通过这一步的定义我们知道Left output Mux和Right output Mux有三个输入引脚,分别是Boost Bypass Switch、LINPUT3 Switch、PCM Playback Switch。Mono Output Mixer只有两个输入引脚,Left Switch、Right Switch,所以,上述定义的含义如下:
- Left Boost Mixer通过Boost Bypass Switch连接到Left Output Mixer
- Left DAC通过PCM Playback Switch连接到Left Output Mixer
- LINPUT3通过LINPUT3 Switch连接到Left Output Mixer
- Left Output Mixer连接到LOUT1 PGA,但是此链接没有开关控制
- Right xxx同理这里不一一列举出来了
在编解码器驱动程序的probe回调函数中注册widget和路径
1 | static int wm8960_add_widgets(struct snd_soc_component *component) |
当machine驱动程序probe到这个编解码时,就会调用编解码器组件的probe回调函数wm8960_probe,以完成编解码器驱动程序的初始化。编解码器需要绑定到platform驱动程序才能发挥作用,这是后面要介绍的内容。
流程
由于函数调用栈很深,没有办法一一列出,这里通过一个思维导图来将各函数调用关系列出来,感兴趣的读者可以自行阅读源码。
原图
参考文献
《Linux设备驱动开发-约翰-马德奥》