最近试图 解决 headset 插入没声音的问题,重新 读了 dapm.txt , 又有了新的体会 :
1, 输入源类型:
MIXER: 作用是 对多输入 进行选择 ,或者 混合多输入为一个输出。
MUX: 作用是 是对多输入 进行选择, 输出只有一个。
PGA: 单输入 单输出,同时带有 一个gain 控制音量。
在 DAMP 中, 对应的Widget 类型分别为 : snd_soc_dapm_mixer ; snd_soc_dapm_mux ; snd_soc_dapm_pga。
在定义widget 时,一般会为其指定 一个kcontrol, 例如:
- static const struct snd_kcontrol_new wm8900_loutmix_controls[] = {
- SOC_DAPM_SINGLE("LINPUT3 Bypass Switch", WM8900_REG_LOUTMIXCTL1, 7, 1, 0),
- SOC_DAPM_SINGLE("AUX Bypass Switch", WM8900_REG_AUXOUT_CTL, 7, 1, 0),
- SOC_DAPM_SINGLE("Left Input Mixer Switch", WM8900_REG_BYPASS1, 7, 1, 0),
- SOC_DAPM_SINGLE("Right Input Mixer Switch", WM8900_REG_BYPASS2, 3, 1, 0),
- SOC_DAPM_SINGLE("DACL Switch", WM8900_REG_LOUTMIXCTL1, 8, 1, 0),
- };
dapm kcontrol名称 = 目的对象sink名称 + 操作行为control名称,即'Left Output Mixer Left Input Mixer Switch',control为操作行为
- SND_SOC_DAPM_MIXER("Left Output Mixer", WM8900_REG_POWER3, 3, 0,
- wm8900_loutmix_controls,
- ARRAY_SIZE(wm8900_loutmix_controls)),
- static const struct snd_soc_dapm_route audio_map[] = {
- {"Left Output Mixer", "Left Input Mixer Switch", "Left Input Mixer"},
- };
对headset 没有声音 分析 又有的入口函数是 :
snd_soc_dapm_put_volsw
[c-sharp] view plain copy print ?
- snd_soc_dapm_put_volsw
- -->dapm_mixer_update_power
- -->snd_kcontrol_chip
- -->找到dapm kcontrol所在的widget(也就是操作目的对象sink)
- -->snd_soc_test_bits
- -->Tests a register with a new value and checks if the new value is different from the old value.
- dapm_power_widgets
- -->power up/down对象widget,更底层可追溯到dapm_seq_run_coalesced
- 检查是否有widget->event [这里不分析Event的情况,继续往下走]
- snd_soc_update_bits
- -->根据dapm kcontrol:SOC_DAPM_SINGLE定义的reg、shift和max设置音频通路,方法与普通的kcontrol一样
例中, Mixer " Left Output Mixer " 的输入定义在 wm8900_loutmix_controls 中, 这样 上层就可以通过参考 route map 的 值来 控制kcontrol 的值 ,从而打开一个通路。
引用,将kcontrols、widgets和route串联起来:
- snd_soc_dapm_new_controls(codec, wm8900_dapm_widgets,
- ARRAY_SIZE(wm8900_dapm_widgets));
- snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
- snd_soc_dapm_new_widgets(codec);
- return 0;