linuxシステムwm 9713サウンドカード構成記録


最近wm 9713の外音放送とイヤホンの検査をしていて、何日も期待に背かないで、やっとできました.以下に記録する、開発ボードはreal 210 v 6である.2リリース:
外音を出力させる場合は、wm 9713の0 x 1 cレジスタの値が0 x 1200、イヤホン出力が0 x 00 a 0であることを確認し、もちろん両者も同時に出力することができ、値は0 x 12 a 0である.
さらにAC 97_を設定するEXTENDED_MSTATUSレジスタ(すなわち0 x 3 eレジスタ)は、設定された値が0 xb 900(ラッパ出力イネーブルオン、7、8ビット制御ラッパ9、10ビット制御イヤホン、0オン)である.
もちろん音量の設定も必須AC 97_MASTER(0 x 02)外音音量設定、AC 97_HEADPHONE(0 x 04)イヤホンの音量を設定します.ここでの値は0 x 0000と0 x 0606で、0 x 0000は最大音です.
イヤホンを検出するには、2つのレジスタ(他の開発ボードはCPUがイヤホン挿入の有無を検出する可能性があります.ここではwm 9713が自分で検出し、CPUは介入しません)AC 97_を設定します.INT_PAGINGとAC 97_ADDITIONAL_FUNC 1(すなわち0 x 24および0 x 5 a)は、それぞれ0 x 10および0 x 40の値を有する.
これらの設定の関数全体を以下に貼り、必要に応じて直接使用すればよい(codecsディレクトリのwm 9713.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,
};