红联Linux门户
Linux帮助

linux系统wm9713声卡配置记录

发布时间:2015-12-11 15:16:19来源:linux网站作者:剑豪路飞

最近在搞wm9713的外音播放和耳机的检测,搞了几天不负所望,终于搞定了。现记录如下,开发板为real210 v6.2版本:


如果要让外音输出,那么确保wm9713的0x1c寄存器的值为0x1200,耳机输出为0x00a0,当然两者也可同时输出,值为0x12a0。

另外还要设置AC97_EXTENDED_MSTATUS寄存器(即0x3e寄存器),设置的值为0xb900(打开喇叭输出使能,第7、8位控制喇叭  9、10位控制耳机,设置为0为开启)。


当然音量的设置也是必须的AC97_MASTER(0x02)设置外音音量,AC97_HEADPHONE(0x04)设置耳机音量,我这里的值设置的为0x0000和0x0606,其中0x0000是为最大声音。

要有耳机检测,那么还要设置两个寄存器(其他开发板可能是由CPU来检测是否有耳机插入,这里是由wm9713自己检测,CPU不干预)AC97_INT_PAGING和AC97_ADDITIONAL_FUNC1(即0x24和0x5a),值分别是0x10和0x40。


下面贴出这些设置的整个函数,需要的话直接使用即可(codecs目录下的wm9713.c文件):


#define AC97_ADDITIONAL_FUNC1   0x5a 
static int wm9713_hifi_hw_params(struct snd_pcm_substream *substream, 
struct snd_pcm_hw_params *params, 
struct snd_soc_dai *dai) 
{
struct snd_soc_codec *codec = dai->codec; 
ac97_write(codec, AC97_POWERDOWN, 0x0000); 
ac97_write(codec, AC97_PHONE, 0x0808); 
ac97_write(codec, AC97_EXTENDED_MID, 0xf803); 
ac97_write(codec, AC97_EXTENDED_MSTATUS, 0xb900);//这里要打开喇叭输出使能,第7、8位控制喇叭  9、10位控制耳机,设置为0为开启 

ac97_write(codec, AC97_MASTER, 0x0000); 
ac97_write(codec, AC97_HEADPHONE, 0x0606); 
ac97_write(codec, AC97_REC_GAIN, 0x12a0);//0x00a0 耳机输出   0x1200 喇叭输出 
ac97_write(codec, AC97_INT_PAGING, 0x10);//使能耳机插入检测 
ac97_write(codec, AC97_ADDITIONAL_FUNC1, 0x40);//设置检测耳机插入的IO端口 
#ifdef CONFIG_SOUND_WM9713_INPUT_STREAM_MIC 
ac97_write(codec, 0x5c, 0x0002); 
ac97_write(codec, AC97_LINE, 0x0068); 
ac97_write(codec, AC97_VIDEO, 0xfe00); 
#else 
ac97_write(codec, AC97_VIDEO, 0xd612); 
#endif 
return 0; 

static struct snd_soc_dai_ops wm9713_dai_ops_hifi = { 
.hw_params  = wm9713_hifi_hw_params, 
.prepare= ac97_hifi_prepare, 
.set_clkdiv = wm9713_set_dai_clkdiv, 
.set_pll= wm9713_set_dai_pll, 
};