AM335x(TQ335x)学习笔记——WM8960声卡驱动移植
时间:11-28
来源:互联网
点击:
- {"RightDAC",NULL,"RightInputMixer"},
由于调试时间比较长,可能有些修改我没有描述到,完整的wm8960.c文件我会一并上传到我的资源,可以下载参考。
3. 编写Machine驱动
内核代码有个很好的例子就是davinci-evm.c,这是am335x-evm评估板的Machine驱动,该评估采用的Codec并不是WM8960,因此,我们在该文件中添加WM8960信息即可。具体的修改如下:
Step1. 添加compatible信息。修改后的内容如下:
- staticconststructof_device_iddavinci_evm_dt_ids[]={
- {
- .compatible="ti,tq-evm-audio",
- .data=(void*)&evm_dai_wm8960,
- },
- {
- .compatible="ti,da830-evm-audio",
- .data=(void*)&evm_dai_tlv320aic3x,
- },
- {/*sentinel*/}
- };
- staticstructsnd_soc_dai_linkevm_dai_wm8960={
- .name="wm8960",
- .stream_name="wm8960-hifi",
- .codec_dai_name="wm8960-hifi",
- .ops=&evm_wm8960_ops,
- .init=evm_wm8960_init,
- .dai_fmt=SND_SOC_DAIFMT_I2S|SND_SOC_DAIFMT_CBM_CFM|
- SND_SOC_DAIFMT_NB_NF,
- };
(1) codec_dai_name = "wm8960-hifi" --> 指定codec设备名称,与wm8960.c中指定的相同即可。
(2) ops --> 指定wm8960的各种操作函数,本文仅实现了hw_params函数。
(3) init --> 指定wm8960的初始化函数,主要是完成dapm相关的初始化。
(4) dai_fmt --> 指定音频的接口方式、主从关系和时钟翻转信息。SND_SOC_DAIFMT_I2S表示音频接口采用I2S协议;SND_SOC_DAIFMT_CBM_CFM表示Codec的BCLK为Master,LRCLK为Master,即wm8960为主,AM335x为从;SND_SOC_DAIFMT_NB_NF表示BCLK和LRCLK都不需要翻转。
Step3.实现evm_wm8960_init
这一部分主要是dapm相关的设置,本人理解也不是非常深刻,直接贴上代码,具体如下:
- staticconststructsnd_soc_dapm_widgetevm_wm8960_dapm_widgets[]={
- SND_SOC_DAPM_SPK("AudioOut1",NULL),
- SND_SOC_DAPM_MIC("myMic",NULL),
- SND_SOC_DAPM_MIC("myLineIN",NULL),
- };
- staticconststructsnd_kcontrol_newevm_wm8960_controls[]={
- SOC_DAPM_PIN_SWITCH("AudioOut1"),
- SOC_DAPM_PIN_SWITCH("myMic"),
- SOC_DAPM_PIN_SWITCH("myLineIN"),
- };
- staticconststructsnd_soc_dapm_routeevm_wm8960_audio_map[]={
- /*Connectionstothe...*/
- {"AudioOut1",NULL,"HP_L"},
- {"AudioOut1",NULL,"HP_R"},
- /*Mic*/
- {"LINPUT1",NULL,"MICB"},
- {"MICB",NULL,"myMic"},
- /*Linein*/
- {"LINPUT3",NULL,"myLineIN"},
- {"RINPUT3",NULL,"myLineIN"},
- };
- staticintevm_wm8960_init(structsnd_soc_pcm_runtime*rtd)
- {
- interr;
- structsnd_soc_codec*codec=rtd->codec;
- structsnd_soc_dapm_context*dapm=&codec->dapm;
- snd_soc_dapm_new_controls(dapm,evm_wm8960_dapm_widgets,
- ARRAY_SIZE(evm_wm8960_dapm_widgets));
- err=snd_soc_add_codec_controls(codec,evm_wm8960_controls,
- ARRAY_SIZE(evm_wm8960_controls));
- if(err<0)
- returnerr;
- snd_soc_dapm_add_routes(dapm,evm_wm8960_audio_map,
- ARRAY_SIZE(evm_wm8960_audio_map));
- snd_soc_dapm_enable_pin(dapm,"AudioOut1");
- snd_soc_dapm_enable_pin(dapm,"myMic");
- snd_soc_dapm_sync(dapm);
- return0;
- }
- staticintevm_wm8960_hw_params(structsnd_pcm_substream*substream,
- structsnd_pcm_hw_params*params)
- {
- structsnd_soc_pcm_runtime*rtd=substream->private_data;
- structsnd_soc_dai*codec_dai=rtd->codec_dai;
- structsnd_soc_dai*cpu_dai=rtd->cpu_dai;
- structsnd_soc_card*soc_card=rtd->card;
- intret=0;
- unsignedsysclk=((structsnd_soc_card_drvdata_davinci*)
- snd_soc_card_get_drvdata(soc_card))->sysclk;
- /*setthecodecsystemclock*/
- ret=snd_soc_dai_set_sysclk(codec_dai,0,sysclk,SND_SOC_CLOCK_IN);
- if(ret<0)
- returnret;
- /*settheCPUsystemclock*/
- ret=snd_soc_dai_set_sysclk(cpu_dai,0,sysclk,SND_SOC_CLOCK_IN);
- if(ret<0)
- returnret;
- return0;
- }
- staticstructsnd_soc_opsevm_wm8960_ops={
- .startup=evm_startup,
- .shutdown=evm_shutdown,
- .hw_params=evm_wm8960_hw_params,
- };
4. 配置内核
完成了代码的移植工作之后还需要对内核进一步配置。默认的内核将ALSA作为module加载,本文将编译进内核。具体步骤如下
AM335xTQ335xWM8960声卡驱动移 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)