对 DAPM 的新理解

来源:互联网 发布:认识老外的软件 编辑:程序博客网 时间:2024/05/09 01:22

最近试图 解决 headset  插入没声音的问题,重新 读了 dapm.txt  , 又有了新的体会 :

1, 输入源类型:

MIXER:  作用是 对多输入 进行选择 ,或者 混合多输入为一个输出。

MUX: 作用是 是对多输入 进行选择, 输出只有一个。

PGA:  单输入 单输出,同时带有 一个gain 控制音量。

在 DAMP 中, 对应的Widget 类型分别为 : snd_soc_dapm_mixer ; snd_soc_dapm_mux ; snd_soc_dapm_pga。

在定义widget 时,一般会为其指定 一个kcontrol, 例如:

 

  1. static conststruct snd_kcontrol_new wm8900_loutmix_controls[] = {
  2. SOC_DAPM_SINGLE("LINPUT3 Bypass Switch", WM8900_REG_LOUTMIXCTL1, 7, 1, 0),
  3. SOC_DAPM_SINGLE("AUX Bypass Switch", WM8900_REG_AUXOUT_CTL, 7, 1, 0),
  4. SOC_DAPM_SINGLE("Left Input Mixer Switch", WM8900_REG_BYPASS1, 7, 1, 0),
  5. SOC_DAPM_SINGLE("Right Input Mixer Switch", WM8900_REG_BYPASS2, 3, 1, 0),
  6. SOC_DAPM_SINGLE("DACL Switch", WM8900_REG_LOUTMIXCTL1, 8, 1, 0),
  7. };

dapm kcontrol名称 = 目的对象sink名称 + 操作行为control名称,即'Left Output Mixer Left Input Mixer Switch',control为操作行为

  1. SND_SOC_DAPM_MIXER("Left Output Mixer", WM8900_REG_POWER3, 3, 0,
  2. wm8900_loutmix_controls,
  3. ARRAY_SIZE(wm8900_loutmix_controls)),
  1. static conststruct snd_soc_dapm_route audio_map[] = {
  2. {"Left Output Mixer", "Left Input Mixer Switch","Left Input Mixer"},
  3. };

对headset 没有声音 分析 又有的入口函数是 :

snd_soc_dapm_put_volsw

[c-sharp] view plaincopyprint?
  1. snd_soc_dapm_put_volsw
  2. -->dapm_mixer_update_power
  3. -->snd_kcontrol_chip
  4. -->找到dapm kcontrol所在的widget(也就是操作目的对象sink)
  5. -->snd_soc_test_bits
  6. -->Tests a register with a new value and checksif the new valueis different from the old value.
  7. dapm_power_widgets
  8. -->power up/down对象widget,更底层可追溯到dapm_seq_run_coalesced
  9. 检查是否有widget->event [这里不分析Event的情况,继续往下走]
  10. snd_soc_update_bits
  11. -->根据dapm kcontrol:SOC_DAPM_SINGLE定义的reg、shift和max设置音频通路,方法与普通的kcontrol一样

 

例中, Mixer " Left Output Mixer " 的输入定义在 wm8900_loutmix_controls 中, 这样 上层就可以通过参考 route map 的 值来 控制kcontrol 的值 ,从而打开一个通路。

 

引用,将kcontrols、widgets和route串联起来: 

  1. snd_soc_dapm_new_controls(codec, wm8900_dapm_widgets,
  2. ARRAY_SIZE(wm8900_dapm_widgets));
  3. snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
  4. snd_soc_dapm_new_widgets(codec);
  5. return 0;

 

原创粉丝点击