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(这个值就是我们设置调节音量的值)