首页 理论教育Linux内核与设备驱动:TI芯片音频驱动详解

Linux内核与设备驱动:TI芯片音频驱动详解

【摘要】:实际音频驱动的分析会以DM 3730的相关驱动为例进行说明。图6-17引自《DM 3730芯片手册》中第3096页框图。下面来看看dai相关的实现细节。4codec模块对codec模块部分,之前在codec的注册函数snd_soc_register_codec定义可见其会将co-dec driver和codec侧的dai同时注册,因为这两者都是与codec相关的。这里以DM3 730板上的twl4030为例,介绍相关的框架。对于codec主要是由codec driver来提供控制接口,而由codec dai来提供数据传输能力。

实际音频驱动的分析会以DM 3730的相关驱动为例进行说明。主要以ASoC中的各个模块进行介绍。

1ᤫmachine模块

首先来看一下初始化部分:

978-7-111-49426-3-Chapter06-189.jpg

978-7-111-49426-3-Chapter06-190.jpg

其中涉及的主要部分就是snd_soc_omap3evm,包含了物理连接的属性,具体内容如下:

978-7-111-49426-3-Chapter06-191.jpg

操作接口omap3evm_ops主要就是硬件参数的接口,详细分析如下:

978-7-111-49426-3-Chapter06-192.jpg

从整体上来看machine部分主要负责整体连接的设定,并不涉及太多的操作,具体的操作也是在整体上保证系统中各个接口的一致性。而ALSA框架为了保证这种一致性也分别提供了对处理器侧dai接口以及codec侧dai接口进行操作的函数,machine模块就是通过这些函数来完成对应的操作的。

2ᤫplatform模块

该模块主要是使用DMA进行数据传输,下面进行具体分析。

首先该模块要提供snd_soc_platform_driver,并在相应的platform device被probe时注册,详细的信息如下:

978-7-111-49426-3-Chapter06-193.jpg

主要的部分是各种操作接口omap_pcm_ops以及创建pcm时初始化的pcm_new接口omap_pcm_new。对于omap_pcm_new的细节如下:

978-7-111-49426-3-Chapter06-194.jpg

主要是分配空间,而omap_pcm_ops的内容如下:

978-7-111-49426-3-Chapter06-195.jpg

这里主要是各种操作接口,下面对几个接口进行分析:

978-7-111-49426-3-Chapter06-196.jpg

978-7-111-49426-3-Chapter06-197.jpg

978-7-111-49426-3-Chapter06-198.jpg

978-7-111-49426-3-Chapter06-199.jpg

其具体的细节就是根据需要通过ALSA pcm接口设置参数限制,另外主要的工作就是在相应的操作接口对DMA进行设置和正确地操作。

3ᤫ处理器侧dai模块

DM 3730中音频流的接口设备是McBSP(multichannel buffered serial port),其可以支持各种音频流的传输方式如(I2S、TCM)等,实际的代码中就是要根据参数的格式对硬件进行正确的设置。对于硬件McBSP的框架结构如图6-17所示。

图6-17引自《DM 3730芯片手册》中第3096页框图。在dai模块中主要通过设置其中左上的寄存器组来完成,而DMA则是通过操作DRR和DXR寄存器来完成数据的读写。

下面来看看dai相关的实现细节。对于驱动主要是注册dai接口的驱动,其细节如下:

978-7-111-49426-3-Chapter06-200.jpg

978-7-111-49426-3-Chapter06-201.jpg(www.chuimin.cn)

978-7-111-49426-3-Chapter06-202.jpg

图6-17 McBSP框架

可见主要包括数据能力和操作接口。操作接口的细节如下:

978-7-111-49426-3-Chapter06-203.jpg

978-7-111-49426-3-Chapter06-204.jpg

下面对主要的接口进行分析:

978-7-111-49426-3-Chapter06-205.jpg

978-7-111-49426-3-Chapter06-206.jpg

978-7-111-49426-3-Chapter06-207.jpg

978-7-111-49426-3-Chapter06-208.jpg

978-7-111-49426-3-Chapter06-209.jpg

978-7-111-49426-3-Chapter06-210.jpg

978-7-111-49426-3-Chapter06-211.jpg

978-7-111-49426-3-Chapter06-212.jpg

978-7-111-49426-3-Chapter06-213.jpg

978-7-111-49426-3-Chapter06-214.jpg

978-7-111-49426-3-Chapter06-215.jpg

978-7-111-49426-3-Chapter06-216.jpg

由以上代码分析可见,主要是设计寄存器的操作,在注释中已经对实际的操作进行了说明,具体的寄存器信息在芯片手册中有更详尽的描述。

4ᤫcodec模块

对codec模块部分,之前在codec的注册函数snd_soc_register_codec定义可见其会将co-dec driver和codec侧的dai同时注册,因为这两者都是与codec相关的。这里以DM3 730板上的twl4030为例,介绍相关的框架。首先是dai接口说明。

978-7-111-49426-3-Chapter06-217.jpg

可见同处理器侧的dai相同,都是进行接口能力的说明和操作接口的说明。操作接口与处理器侧的dai功能上是一致的,只是实际的操作要通过处理器的I2C总线操作来完成。

codec驱动的细节如下:

978-7-111-49426-3-Chapter06-218.jpg

这里主要是对codec管理的接口,下面来看一下probe的实现细节:

978-7-111-49426-3-Chapter06-219.jpg

可见主要是对设备特殊的属性进行设置,另外就是增加控制接口,这样系统就可以通过这些控制接口直接操作codec。对于codec主要是由codec driver来提供控制接口,而由codec dai来提供数据传输能力。

这样对DM 3730 ALSASoC中各个模块的实现都进行了分析和说明。