dapm widgets
DAPM框架为我们提供了大量的宏来定义各种各样的widget。这些宏定义根据widget的类型被分为了几个域:
codec域
比如VREF和VMID等提供参考电压的widget,这些widget通常在codec的probe/remove函数中进行控制
platform域
针对平台或板子的一些需要物理连接的输入/输出接口,如耳机,扬声器,麦克风,因为这些接口在每块板子上可能不一样,所以通常他们是在machine驱动中进行定义和控制,并且也可以由用户空间的应用程序通过某种方式来控制他们的打开和关闭。
以上这些widget分别对应信号发生器,输入引脚,输出引脚,麦克风,耳机,扬声器,线路输入接口。
reg字段被设置为SND_SOC_NOPM(-1),表明这些widget是没有寄存器控制位来控制widget的电源状态的。
麦克风,耳机,扬声器,线路输入接口这几种widget,还可以定义一个dapm事件回调函数event,从event_flags字段的设置可以看出,他们只会响应SND_SOC_DAPM_POST_PMU (上电后)SND_SOC_DAPM_PRE_PMD(下电前)事件
path域
一般指codec内部的mixer,muxer等控制音频路径的widget
这种widget一般是对普通kcontrol控件的再封装,增加音频路径和电源管理功能,所以这种widget会包含一个或多个kcontrol,普通的kcontrol已经在javascript:void(0)中介绍过,不过这些被包含的kcontrol不能使用这种方法定义,他们需要使用dapm框架提供的宏来定义。
可以看出,这些widget的reg和shift字段是需要赋值的,说明这些widget是有相应的电源控制寄存器的,DAPM框架在扫描和更新音频路径时,会利用这些寄存器来控制widget的电源状态,使得它们的供电状态是按需分配的,需要的时候(在有效的音频路径上)上电,不需要的时候(不再有效的音频路径上)下电。这些widget需要完成和之前介绍的mixer、mux等控件同样的功能,实际上,这是通过它们包含的kcontrol控件来完成的,这些kcontrol我们需要在定义widget前先定义好,然后通过wcontrols和num_kcontrols参数传递给这些辅助定义宏。
如果需要自定义这些widget的dapm事件处理回调函数,也可以使用下面这些带“_E”后缀的版本:
stream域
指那些需要处理音频数据流的widget,例如ADC,DAC等
其他
还有几个通用的widget
说明
使用tinymix,这些dapm widget都不会显示:SND_SOC_DAPM_SUPPLY, SND_SOC_DAPM_PGA, SND_SOC_DAPM_DAC, SND_SOC_DAPM_ADC, SND_SOC_DAPM_AIF_IN, SND_SOC_DAPM_AIF_OUT, SND_SOC_DAPM_INPUT, SND_SOC_DAPM_OUTPUT
使用tinymix,显示的dapm widget有:SND_SOC_DAPM_SWITCH, SND_SOC_DAPM_MIXER, SND_SOC_DAPM_MUX
dapm kcontrol
对于音频路径上的mixer或mux类型的widget,他们包含了多个kcontrol,这里的kcontrol并不是用之前的普通kcontrol的方法来定义的,而是借助以下这些宏来定义dapm widget中的kcontrol。
可以看出,SOC_DAPM_SINGLE对应与普通控件的SOC_SINGLE,SOC_DAPM_SINGLE_TLV对应SOC_SINGLE_TLV……,相比普通的kcontrol控件,dapm的kcontrol控件只是把info,get,put回调函数换掉了。dapm kcontrol的put回调函数不仅仅会更新控件本身的状态,他还会把这种变化传递到相邻的dapm kcontrol,相邻的dapm kcontrol又会传递这个变化到他自己相邻的dapm kcontrol,直到音频路径的末端,通过这种机制,只要改变其中一个widget的连接状态,与之相关的所有widget都会被扫描并测试一下自身是否还在有效的音频路径中,从而可以动态地改变自身的电源状态,这就是dapm的精髓所在。
1) 来看一个mixer widget是如何通过dapm kcontrol实现
2) 来看一个mux widget是如何通过dapm kcontrol实现
dapm route
对于上面这幅框图
参考文章
- ALSA声卡驱动中的DAPM详解之三:如何定义各种widget
附上几篇文章的链接
1. Asoc dapm(一) - kcontrol
2. Asoc dapm(二) - kcontrol注册与使用
3. Asoc dapm(三) - dapm widgets & dapm kcontrol & dapm route
4. Asoc dapm(四) - dapm widgets & dapm route注册
5. Asoc dapm(五) - dapm widget链表更新