1. 硬件架构
首先我们来看看,我们实际的开发板上的硬件接口,一般由一个cpu和一个codec组成,其大致的框图为
对于音频的应用主要有播放和录音的功能,数据流通过I2S的接口来传输,而I2c/l3接口主要完成的控制接口,例如控制声音的大小,功放的增益等操作。对于回放/录音的情形,PCM 数据流向大致是:
2. 软件架构
ASoC–ALSA System on Chip ,是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系。Codec驱动与SoC CPU的底层耦合过于紧密.利于在多样化的平台/机器上移植复用,方便 codec 与 SoC 通过 PCM/I2S 总线建立链接。
软件领域里的抽象和重用一样,嵌入式设备的音频系统可以被划分为板载硬件(Machine)、Soc(Platform)、Codec三大部分:
Linux框架中,ASOC状态可以划分为硬件Machine Driver、Platform Driver、Codec Driver三大部分组成。由上图可以看出Machine是指我们的开发板,Platform是指Soc,包括开发Soc上的Audio DMA和CPU DAIs接口,而Codec是指编解码器。
- machine:单板相关内容,开发板所用的主芯片(Platform是指Soc)、编解码芯片(codec)是哪一个。主芯片里的IIS接口(DAI(全称Digital Audio Interface)接口)接到哪里去.CPU DAI是哪一个,codec DAI是哪一个,DMA是哪个
- platform:平台相关内容。通常需要包含Soc中的时钟、PCM、IIS(DAI)(设置接口)和DMA(传输数据)等。只要指定了Soc,那么我们就认为对应一个platform,与Machine无关,使得该Soc可以在不同的Machine做兼容。
- codec:也就是编解码器,Codec里面一般包含了I2S接口(DAI)、D/A、A/D、mixer、PA(内置或者外接)
3. 数据结构框图
下面以一个的常见开发板mini2440来说明其数据结构的总体框架
-
Machine driver
sound/soc/sumsang/s3c24xx_uda134x.c
其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码采样率时钟配置 -
Platform driver
sound/soc/sumsang/s3c24xx-i2s.c
I2S 控制器驱动 采样率时钟DMA 等配置 -
Codec driver
sound/soc/codec/uda134x.c开发asoc声卡驱动就是向asoc驱动核心的三个数据链表中注册相应的链表节点,最后通过machine中注册的dai_link数据结构将三部分联系在一起,共同完成硬件初始化部分,最后完成整个声卡的注册。