近来对音频芯片兴趣颇浓,想在片选系统上实现音频驱动,仔细研究发现,Linux内核系统(3.0)可以配置两种音频编程接口驱动,其驱动架构的组成如下:
1) Linux OSS 音频设备驱动架构的组成:mixer 接口、dsp 接口及用户空间编程方法。
2) Linux ALSA 音频设备驱动架构的组成:card 和组件管理、PCM 设备、control 接口、AC97 API(或者是其他音频芯片API接口)及用户空间编程方法。
1.ASoC的由来:
由于OSS音频驱动架构是一个没有完全开放源代码的商业产品,而ALSA音频驱动架构恰好弥补了这一空白。
ASoC--ALSA System on Chip (即ALSA在片选系统上的应用),是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系。在ASoc出现之前,内核对于SoC中的音频已经有部分的支持,不过会有一些局限性:
• Codec驱动与SoC CPU的底层耦合过于紧密,这种不理想会导致代码的重复,例如,仅是wm8731的驱动,当时Linux中有分别针对4个平台的驱动代码。
• 音频事件没有标准的方法来通知用户,例如耳机、麦克风的插拔和检测,这些事件在移动设备中是非常普通的,而且通常都需要特定于机器的代码进行重新对音频路劲进行配置。
• 当进行播放或录音时,驱动会让整个codec处于上电状态,这对于PC没问题,但对于移动设备来说,这意味着浪费大量的电量。同时也不支持通过改变过取样频率和偏置电流来达到省电的目的。
ASoC正是为了解决上述种种问题而提出的,目前已经被整合至内核的代码树中:sound/soc。ASoC不能单独存在,他只是建立在标准ALSA驱动上的一个它必须和标准的ALSA驱动框架相结合才能工作。
2.音频设备硬件接口
2.1 PCM 接口
PCM也是一种4线制接口。与I2S非常相像,但支持一个更灵活的协议。它有位时钟(BCLK)和同步时钟(SYNC)用来在Tx和Rx在传送和接收音频数据是同步连接。位时钟通常因采样率的不同而不同,然而同步时钟(SYNC)与采样频率相同。PCM同样支持时分复用,可以几个设备同时使用总线(这有时被称为network模式)。
2.2 IIS 接口
I2S是一个4线数字音频接口,常用于HiFi,STB便携设备。Tx 和Rx信号线用于音频传输。而位时钟和左右时钟(LRC)用于同步链接。I2S具有灵活性,因为控制器和解码器都可以控制位时钟和左右时钟。位时钟因采样率和主系统时钟而有不同。LRCLK与采样率相同。少数设备支持独立的ADC和DAC的LRCLK。这使在不同采样率情况下同步捕获和回放成为可能。
2.3 AC97 接口
AC97是一种个人电脑声卡上常见的五线接口。现在在很多便携设备中也很流行。这个数字音频接口有一个复位线,分时在SDATA_OUT(回放)和SDATA_IN(捕获) 线上传送数据。位时钟常由解码器驱动(通常是12.288MHz).帧时钟(通常48kHz)总是由控制器驱动。每个AC97帧21uS,并分为13个时间槽。
2.4 音频系统结构
通常,就像软件领域里的抽象和重用一样,嵌入式设备的音频系统可以被划分为板载硬件(Machine)、Soc(Platform)、Codec三大部分,如下图所示:
3. 软件架构
在软件层面,ASoC也把嵌入式设备的音频系统同样分为3大部分,Machine,Platform和Codec。
• Codec驱动 ASoC中的一个重要设计原则就是要求Codec驱动是平台无关的,它包含了一些音频的控件(Controls),音频接口,DAMP(动态音频电源管理)的定义和某些Codec IO功能。为了保证硬件无关性,任何特定于平台和机器的代码都要移到Platform和Machine驱动中。所有的Codec驱动都要提供以下特性:
o Codec DAI 和 PCM的配置信息;
o Codec的IO控制方式(I2C,SPI等);
o Mixer和其他的音频控件;
o Codec的ALSA音频操作接口;
也可以增加提供以下功能:
o DAPM描述信息;
o DAPM事件处理程序;
o DAC数字静音控制
• Platform驱动 它包含了该SoC平台的音频DMA和音频接口的配置和控制(I2S,PCM,AC97等等);它也不能包含任何与板子或机器相关的代码。
• Machine驱动 Machine驱动负责处理机器特有的一些控件和音频事件(例如,当播放音频时,需要先行打开一个放大器);单独的Platform和Codec驱动是不能工作的,它必须由Machine驱动把它们结合在一起才能完成整个设备的音频处理工作。
4. CLASS SOC
整个ASoC是由一些列struct组成,要搞清楚ASoC的工作机理,必须要理解这一系列struct之间的关系和作用,下面的关系图展示了ASoC中重要的数据结构之间的关联方式:
Kernel 3.0中的ASoC数据结构
通过snd_soc_card结构,又引出了Machine驱动的另外两个个数据结构:
snd_soc_dai_link(实例:smdk_dai[] )
snd_soc_ops(实例:smdk_ops )
snd_soc_dai_link看名字就知道,很明显它是起耦合链接作用的。它指定了Platform、Codec、codec_dai、cpu_dai的名字,稍后Machine驱动将会利用这些名字去匹配已经在系统中注册的platform,codec,dai。
snd_soc_ops连接Platform和Codec的dai_link对应的ops操作函数,本例就是smdk_ops,它只实现了hw_params函数:smdk_hw_params。
到此为止,主要的部分machine的平台设备注册我们完成了。