A10+Android4.0 音频驱动(树莓派II 源码)
linux-3.0目录
make ARCH=arm menuconfig
进到内核配置界面,可以看到
知道我们的配置项名字,然后进
目录 :\lichee\linux-3.0\sound\soc
看Kconfig文件,可以看到 它只是打开了下面有关sun4i这个芯片的其他音频项。
所以,A10内置CODEC的驱动主要是在
\lichee\linux-3.0\sound\soc\sun4i
sun4i-codec.c文件
sun4i_codec_probe 入口函数
return err;
}
snd_ctl_add()函数用于将创建的snd_kcontrol 添加到对应的card 中。
A10的android4.0系统里, 创建一个control控制各通道静音开关和音量大小,如下
static const struct snd_kcontrol_new codec_snd_controls_b_c[] = {
//FOR B C VERSION
CODEC_SINGLE("Master Playback Volume", SUN4I_DAC_ACTL,0,0x3f,0),
CODEC_SINGLE("layback Switch", SUN4I_DAC_ACTL,6,1,0),//全局输出开关
CODEC_SINGLE("Capture Volume",SUN4I_ADC_ACTL,20,7,0),//录音音量
CODEC_SINGLE("Fm Volume",SUN4I_DAC_ACTL,23,7,0),//Fm 音量
CODEC_SINGLE("Line Volume",SUN4I_DAC_ACTL,26,1,0),//Line音量
CODEC_SINGLE("MicL Volume",SUN4I_ADC_ACTL,25,3,0),//mic左音量
CODEC_SINGLE("MicR Volume",SUN4I_ADC_ACTL,23,3,0),//mic右音量
CODEC_SINGLE("FmL Switch",SUN4I_DAC_ACTL,17,1,0),//Fm左开关
CODEC_SINGLE("FmR Switch",SUN4I_DAC_ACTL,16,1,0),//Fm右开关
CODEC_SINGLE("LineL Switch",SUN4I_DAC_ACTL,19,1,0),//Line左开关
CODEC_SINGLE("LineR Switch",SUN4I_DAC_ACTL,18,1,0),//Line右开关
CODEC_SINGLE("Ldac Left Mixer",SUN4I_DAC_ACTL,15,1,0),
CODEC_SINGLE("Rdac Right Mixer",SUN4I_DAC_ACTL,14,1,0),
CODEC_SINGLE("Ldac Right Mixer",SUN4I_DAC_ACTL,13,1,0),
CODEC_SINGLE("Mic Input Mux",SUN4I_DAC_ACTL,9,15,0),//from bit 9 to bit 12.Mic(麦克风)输入静音
CODEC_SINGLE("ADC Input Mux",SUN4I_ADC_ACTL,17,7,0),//ADC输入静音
};
创建一个新的control 至少需要实现snd_kcontrol_new 中的info()、get()和put()这3 个成员函数
数组codec_snd_controls_b_c[]内容单值元素
SOC_SINGLE()的 info()、get()、put()成员函数分别为:
snd_soc_info_volsw ()、snd_soc_get_volsw ()和snd_soc_put_volsw ();
看原型定义
linux-3.0目录
make ARCH=arm menuconfig
进到内核配置界面,可以看到
知道我们的配置项名字,然后进
目录 :\lichee\linux-3.0\sound\soc
看Kconfig文件,可以看到 它只是打开了下面有关sun4i这个芯片的其他音频项。
所以,A10内置CODEC的驱动主要是在
\lichee\linux-3.0\sound\soc\sun4i
sun4i-codec.c文件
sun4i_codec_probe 入口函数
kernel 层寄存器设置
在Kernel层定义了供amixer命令设置的内容。Kernel层寄存器设置分多种类型。
设备初始化函数sun4i_codec_probe中包含注册控制接口:
snd_chip_codec_mixer_new()它添加控制接口
if ((err = snd_ctl_add(card, snd_ctl_new1(&codec_snd_controls_b_c[idx],clnt))) < 0) {return err;
}
控制接口control对于许多开关(switch)和调节器(slider)而言应用相当广泛,它能从用户空间被存取。control的最主要用 途是mixer,所有的mixer 元素基于control 内核API 实现,在ALSA 中,control 用snd_kcontrol结构体描述(Y:\lichee\linux-3.0\sound\core\control.c)。
创建一个control,调用snd_ctl_add()和snd_ctl_new1()这两个函数来完成,这两个函数的原型为:
int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol);
struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new *ncontrol,void *private_data);
snd_ctl_new1()函数用于创建一个snd_kcontrol 并返回其指针,snd_ctl_add()函数用于将创建的snd_kcontrol 添加到对应的card 中。
A10的android4.0系统里, 创建一个control控制各通道静音开关和音量大小,如下
static const struct snd_kcontrol_new codec_snd_controls_b_c[] = {
//FOR B C VERSION
CODEC_SINGLE("Master Playback Volume", SUN4I_DAC_ACTL,0,0x3f,0),
CODEC_SINGLE("layback Switch", SUN4I_DAC_ACTL,6,1,0),//全局输出开关
CODEC_SINGLE("Capture Volume",SUN4I_ADC_ACTL,20,7,0),//录音音量
CODEC_SINGLE("Fm Volume",SUN4I_DAC_ACTL,23,7,0),//Fm 音量
CODEC_SINGLE("Line Volume",SUN4I_DAC_ACTL,26,1,0),//Line音量
CODEC_SINGLE("MicL Volume",SUN4I_ADC_ACTL,25,3,0),//mic左音量
CODEC_SINGLE("MicR Volume",SUN4I_ADC_ACTL,23,3,0),//mic右音量
CODEC_SINGLE("FmL Switch",SUN4I_DAC_ACTL,17,1,0),//Fm左开关
CODEC_SINGLE("FmR Switch",SUN4I_DAC_ACTL,16,1,0),//Fm右开关
CODEC_SINGLE("LineL Switch",SUN4I_DAC_ACTL,19,1,0),//Line左开关
CODEC_SINGLE("LineR Switch",SUN4I_DAC_ACTL,18,1,0),//Line右开关
CODEC_SINGLE("Ldac Left Mixer",SUN4I_DAC_ACTL,15,1,0),
CODEC_SINGLE("Rdac Right Mixer",SUN4I_DAC_ACTL,14,1,0),
CODEC_SINGLE("Ldac Right Mixer",SUN4I_DAC_ACTL,13,1,0),
CODEC_SINGLE("Mic Input Mux",SUN4I_DAC_ACTL,9,15,0),//from bit 9 to bit 12.Mic(麦克风)输入静音
CODEC_SINGLE("ADC Input Mux",SUN4I_ADC_ACTL,17,7,0),//ADC输入静音
};
创建一个新的control 至少需要实现snd_kcontrol_new 中的info()、get()和put()这3 个成员函数
数组codec_snd_controls_b_c[]内容单值元素
SOC_SINGLE()的 info()、get()、put()成员函数分别为:
snd_soc_info_volsw ()、snd_soc_get_volsw ()和snd_soc_put_volsw ();
看原型定义