Android 音频驱动分析--A10

本文详细介绍了Android在A10平台上音频驱动的配置与工作原理,包括Kernel层的寄存器设置、设备初始化函数、控制接口的创建以及相关控制命令如amixer的使用。通过对snd_ctl_add()、snd_ctl_new1()等函数的分析,揭示了音频驱动中mixer元素的实现方式。同时,讨论了模式设置如setMode()及其对音频路由的影响。
摘要由CSDN通过智能技术生成
 A10+Android4.0 音频驱动(树莓派II 源码)
linux-3.0目录
make ARCH=arm menuconfig
进到内核配置界面,可以看到
未命名.jpg 
知道我们的配置项名字,然后进

目录 :\lichee\linux-3.0\sound\soc 
看Kconfig文件,可以看到
  1. config SOUND_SUN4I
  2.        tristate "SOUND driver for sun4i"
  3.        depends on ARCH_SUN4I
  4.        help
  5.          SOUND driver for sun4i
  6. if SOUND_SUN4I          
  7. source "sound/soc/sun4i/Kconfig"
  8. source "sound/soc/sun4i/hdmiaudio/Kconfig"
  9. source "sound/soc/sun4i/spdif/Kconfig"
  10. source "sound/soc/sun4i/i2s/Kconfig"
  11. endif
复制代码
它只是打开了下面有关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 (); 
看原型定义
  1. #define CODEC_SINGLE(xname,  reg,  shift,  max,  invert)\ 
  2. {  .iface  = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\ 
  3.   .info 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值