al5623.c内核代码框架分析(3)

switch (alc5623->id) {
 case 0x21:
 case 0x22:
  snd_soc_dapm_new_controls(dapm, alc5623_dapm_amp_widgets,
     ARRAY_SIZE(alc5623_dapm_amp_widgets));
  snd_soc_dapm_add_routes(dapm, intercon_amp_spk,
     ARRAY_SIZE(intercon_amp_spk));
  break;
 case 0x23:
  snd_soc_dapm_add_routes(dapm, intercon_spk,
     ARRAY_SIZE(intercon_spk));
  break;
 default:
  return -EINVAL;
 }

return ret;
}

上面看到了snd_soc_add_codec_controls这个函数,具体做了什���事情,就是将要给上层控制的命令写到这个结构体数组里
上面发相应的命令,比如Speaker Playback Volume,后面再加相应的参数就可以实现音量的控制,其它也是类似的,可以参考手册去添加。

/*
 static const struct snd_kcontrol_new alc5621_vol_snd_controls[] = {
 SOC_DOUBLE_TLV("Speaker Playback Volume",
   ALC5623_SPK_OUT_VOL, 8, 0, 31, 1, hp_tlv),
 SOC_DOUBLE("Speaker Playback Switch",
   ALC5623_SPK_OUT_VOL, 15, 7, 1, 1),
 SOC_DOUBLE_TLV("Headphone Playback Volume",
   ALC5623_HP_OUT_VOL, 8, 0, 31, 1, hp_tlv),
 SOC_DOUBLE("Headphone Playback Switch",
   ALC5623_HP_OUT_VOL, 15, 7, 1, 1),
 };
*/

而snd_soc_dapm_new_controls这个函数又提供什么功能呢?它其实是一个动态音频电源管理,主要是描述dapm的信息,同时也处理一些dapm的事件。
相关的结构体也是和上面的类似的,大家可以对着数据手册去参考一下。

至此,整个alc5623的芯片的框架就已经剖析完毕。

那么,我们如何来测试这个音频是否可以用呢?在linux终端提供了amixer和aplay这样的命令可以去操作,当然也可以去用alsa库,调函数写一个C程序去测试。
这里我们主要来说说amixer和aplay的使用。到开发板的linux终端。

1、用以下命令查看amixer支持哪些命令:
amixer --help

2、查看驱动里面已经提供了多少接口可以去操作:
amixer contents
例如:
显示:numid=5,iface=MIXER,name='Line In Volume'

3、获取当前参数的值---->Speaker Playback Volume这个就是刚刚我们看到的controls组件提供的控制参数
amixer cget  numid=1,iface=MIXER,name='Speaker Playback Volume'
numid=1,iface=MIXER,name='Speaker Playback Volume'
  ; type=INTEGER,access=rw---R--,values=2,min=0,max=31,step=0
  : values=20,20
  | dBscale-min=-46.50dB,step=1.50dB,mute=0
 
从这上面得知的结果是声音的值最小为0,最大为31

4、设置某个参数
比如就设置上面音量的大小:
amixer cset  numid=1,iface=MIXER,name='Speaker Playback Volume'  25(这个值就是我们设置调节音量的值)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/816a116f7ebb15c385bc21ba8cf90042.html