DAPM-2 Widget/Path/Route
- WM8960结构图
 - Widget
 - Route
 - Path
 - 总结
 
课程:韦东山音频专题
内核:Kernel 3.5
实例:WM8960
WM8960结构图

 录音时的音频通路 抽象图为:
 
Widget

wm8960.c sound\soc\codecs
static const struct snd_soc_dapm_widget wm8960_dapm_widgets[] = {
	SND_SOC_DAPM_INPUT("LINPUT1"),
	SND_SOC_DAPM_INPUT("LINPUT2"),
	SND_SOC_DAPM_INPUT("LINPUT3"),
	SND_SOC_DAPM_MIXER("Left Boost Mixer", WM8960_POWER1, 5, 0,
		   wm8960_lin_boost, ARRAY_SIZE(wm8960_lin_boost)),
	SND_SOC_DAPM_MIXER("Left Output Mixer", WM8960_POWER3, 3, 0,
		&wm8960_loutput_mixer[0],
		ARRAY_SIZE(wm8960_loutput_mixer)),
	SND_SOC_DAPM_ADC("Left ADC", "Capture", WM8960_POWER2, 3, 0),
}
// "Left Boost Mixer"中包含三个snd_kcontrol_new
static const struct snd_kcontrol_new wm8960_lin_boost[] = {
SOC_DAPM_SINGLE("LINPUT2 Switch", WM8960_LINPATH, 6, 1, 0),
SOC_DAPM_SINGLE("LINPUT3 Switch", WM8960_LINPATH, 7, 1, 0),
SOC_DAPM_SINGLE("LINPUT1 Switch", WM8960_LINPATH, 8, 1, 0),
};
 
DAPM的kcontrol 和 普通的kcontrol是不一样的,他们的.put函数不一样。
 定义时 SOC_DAPM_SINGLE() 和 SOC_SINGLE()区分。
Route

static const struct snd_soc_dapm_route audio_paths[] = {
	{ "Left Boost Mixer", "LINPUT1 Switch", "LINPUT1" },
	{ sink widget’s name , kcontrol’s name   , source widget’s name }
 
需要将Route转化为Path,对
wm8960_add_widgets(struct snd_soc_codec *codec)
	snd_soc_dapm_add_routes(dapm, audio_paths, ARRAY_SIZE(audio_paths));
		for (i = 0; i < num; i++)
			snd_soc_dapm_add_route(dapm, route);
				//根据名字找到sink/source widget 和 kcontrol
				path->source = wsource;
				path->sink = wsink;
				path->connected = route->connected;
 
Path
Route转为Path后,如果我们想让下面的path导通,需要什么条件?
 DAPM的目的是省电,由此可以再引入complete path的概念。
- complete path
 
以下为一条complete path
 
static const struct snd_soc_dapm_route audio_paths[] = {
		{ "Left Boost Mixer", "LINPUT1 Switch", "LINPUT1" }, // Path1
		{ "Left Input Mixer", "Boost Switch", "Left Boost Mixer", }, // Path2
		{ "Left ADC", NULL, "Left Input Mixer" },  // Path3
 
- 上电过程
 
条件1:complete Path上的所有path都是connect状态
 条件2:有APP在使用声卡使用
 满足上述两个条件才会启动所涉及的Reg/Widget(上电)
总结
- tinymix 设置普通的kcontrol:直接设置寄存器
 - tinymix 设置DAPM的kcontrol:设置所在Path的connect位
调用dapm_power_widgets(widget->dapm, SND_SOC_DAPM_STREAM_NOP); - tinyplay, tinycap在传输数据之前:
调用damp_power_widgets(dapm, event); dapm_power_widgets在有app使用声卡时会找出complete path,设置上面所有的widget(上电)



















