AM335x(TQ335x)学习笔记——WM8960声卡驱动移植
ASoC是对ALSA驱动架构的进一步封装。ASoC将ALSA驱动中的各模块抽象为三部分:Platform、Codec和Machine。Platform主要是平台硬件驱动,包括SoC的IIS模块、DMA等,在本文中就是指AM335x的McASP模块及AM335x用于音频读写操作的EDMA。Codec是编解码芯片驱动,在本文中就是WM8960。Machine是用来描述单板音频系统连接关系的驱动,在本文中其作用是将WM8960与McASP绑定起来,注册声卡设备节点。由于3.17版本的内核已经带有TI维护的McASP驱动和Wolf公司维护的WM8960驱动,因此,原理上讲,我们只需要编写Machine部分,建立WM8960与McASP的连接关系即可。不幸的是Wolf对WM8960的维护不是太完善,还需要我们进一步修改。下面我们来看下WM8960在TQ335x上的移植方法。
1. 在DTS中添加声卡信息
Step1. 完善sound信息
在DTS有一个节点名为sound,该节点用来描述单板上声卡设备信息,修改后的内容如下:
- sound{
- compatible="ti,tq-evm-audio";
- ti,model="AM335x-EVM";
- ti,audio-codec=<&wm8960>;
- ti,mcasp-controller=<&mcasp1>;
- ti,codec-clock-rate=<24576000>;
- ti,audio-routing=
- "HeadphoneJack","HP_L",
- "HeadphoneJack","HP_R",
- "LINPUT1","LineIn";
- };
(1)compatible = "ti,tq-evm-audio" --> 指定声卡兼容的设备,与Machine驱动中的compatible匹配。
(2)ti,model = "AM335x-EVM" --> 声卡的名称,原则上讲可以随意指定,但最好具有一定的可读性,这里没有修改。
(3)ti,audio-codec = <&wm8960> --> 指定单板使用的Codec,具体的Codec信息由其指向的节点wm8960描述。
(4)ti,mcasp-controller = <&mcasp1> --> 指定单板使用的Codec连接到AM335x的McASP1上,McASP1的具体信息由其指向的节点mcasp1描述。
(5)ti,codec-clock-rate = <24576000> --> 指定Codec的MCLK时钟频率,单位是HZ。TQ335x的Codec使用24.576MHZ的有源晶振提供MCLK,故设置为24576000。
(6)ti,audio-routing --> DAPM信息描述,用来指定Codec与McASP的连接关系。此处若不设置,则需要在Machine驱动中进行设置。本文在这里做了修改。
Step2. 完善Codec信息
通过阅读TQ335x的原理图可知,WM8960的控制端口连接到了AM335x的I2C0端口上,因此,可以i2c0节点内添加如下信息(类似上篇文章中触摸设备驱动节点):
- wm8960:wm8960@1a{
- compatible="wlf,wm8960";
- reg=<0x1a>;
- };
(1)compatible = "wlf,wm8960" --> 指定Codec兼容设备,与Codec驱动中的compatible匹配。
(2) reg = <0x1a> --> WM8960的I2C地址是1A,故设置为0x1a。
Step3. 完善Platform信息
AM335x的Platform信息主要指McASP和EMDA设置信息。由于默认的DTS已经配置好了McASP及EDMA的大部分信息,需要我们配置的是McASP的pinmux和i2s信息。
(1) 修改pinmux信息需要具体参考TQ335x的原理图,下面是根据原理图中的引脚连接方式修改的pinmux信息,如果有啥不懂的可以留言讨论:
- am335x_evm_audio_pins:am335x_evm_audio_pins{
- pinctrl-single,pins=
- 0x1A0(PIN_INPUT_PULLDOWN|MUX_MODE3)/*mcasp0_aclkr.mcasp1_aclkx*/
- 0x1A4(PIN_INPUT_PULLDOWN|MUX_MODE3)/*mcasp0_fsr.mcasp1_fsx*/
- 0x1A8(PIN_OUTPUT_PULLDOWN|MUX_MODE3)/*mcasp0_axr1.mcasp1_axr0*/
- 0x1AC(PIN_INPUT_PULLDOWN|MUX_MODE3)/*mcasp0_ahclkx.mcasp1_axr1*/
- >;
- };
- &mcasp1{
- pinctrl-names="default";
- pinctrl-0=<&am335x_evm_audio_pins>;
- status="okay";
- op-mode=<0>;/*MCASP_IIS_MODE*/
- tdm-slots=<2>;
- /*4serializers*/
- serial-dir=*0:INACTIVE,1:TX,2:RX*/
- 1200
- >;
- tx-num-evt=<1>;
- rx-num-evt=<1>;
- };
(1)pinctrl-0 = <&am335x_evm_audio_pins> --> 指定mcasp1的pinmux信息。
(2)op-mode = <0> --> 指定McASP为I2S工作模式。
(3)tdm-slots = <2> --> 指定通道数。AM335x的手册以更广泛意义的单词slot命名,具体到I2S接口,其含义就是Channel。
(4)serial-dir --> 指定serializer的方向。AM335x的手册中提到每个McASP有16个serializer,但AM335x这款芯片的McAPS只有4个serializer,分别用于AXR0、AXR1、AXR2和ARX3。由于TQ335x中将AXR0作为发送(输出)、ARX1作为接收(输入)且没有ARX2和ARX3,故设置4个serial-dir为1、2、0、0(0表示没有使用,1表示发送,2表示接收)。
(5)tx-num-evt = <1> --> 指定发送FIFO大小,本文设置为1。
(6)rx-num-evt = <1> --> 指定接收FIFO大小,本文设置为1。
AM335xTQ335xWM8960声卡驱动移 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)