三、Audio-ALSA 中的platfrom、machine、codec

一、Linux ALSA 音频系统框架

在这里插入图片描述
● ALSA CORE
alsa 核心层,向上提供逻辑设备(PCM/CTL/MIDI/TIMER/…)系统调用,向下驱动硬件设备(Machine/I2S/DMA/CODEC)
● ASoC CORE
ASoC:ALSA System on Chip,是建立在标准 ALSA 驱动上,为了更好支持嵌入系系统 和 应用于移动设备的音频 codec 的一套软件体系,它依赖于标准 ALSA 驱动框架。
由三大部分组成,分别是 Machine、Platform、Codec。
在这里插入图片描述
内核文档 /Documentation/alsa/soc/overview.txt 中详细介绍了 ASoC 的设计初衷。

1、platform

用于实现平台相关的DMA驱动和音频接口等。

Platform 一般是指某一个SoC平台,比如 pxaxxx,s3cxxxx,omapxxx 等等,与音频相关的通常包含该 SoC 中的时钟、DMA、I2S、PCM等等,只要指定了 SoC,那么我们可以认为它会有一个对应的 Platform,它只与 SoC 相关,与 Machine 无关,这样我们就可以把 Platform 抽象出来,使得同一款 SoC 不用做任何的改动,就可以用在不同的 Machine 中。实际上,把 Platform 认为是某个 SoC 更好理解。

这一部分只关心CPU本身,不关心Codec。
主要处理两个问题:DMA引擎 和 SoC集成的PCM、I2S或AC97数字接口控制。

主要作用是完成音频数据的管理,最终通过CPU的数字音频接口(DAI)把音频数据传送给Codec进行处理,最终由Codec输出驱动耳机或者是喇叭的音信信号。

在具体实现上,ASoC 有把 Platform 驱动分为两个部分:snd_soc_platform_driver 和snd_soc_dai_driver。

其中,platform_driver 负责管理音频数据,把音频数据通过dma或其他操作传送至cpu dai中,dai_driver则主要完成cpu一侧的dai的参数配置,同时也会通过一定的途径把必要的dma等参数与snd_soc_platform_driver进行交互。

Platform 又可细分两部分:
● cpu dai
在嵌入式系统里面通常指 SoC 的 I2S、PCM 总线控制器,
负责把音频数据从 I2S tx FIFO 搬运到 CODEC(这是回放的情形,录制则方向相反)。
cpu_dai 通过 snd_soc_register_dai() 来注册。

● pcm dma
负责把 dma buffer 中的音频数据搬运到 I2S tx FIFO。
值得留意的是:
某些情形下是不需要 dma 操作的,比如 Modem 和 CODEC 直连,
因为 Modem 本身已经把数据送到 FIFO 了,这时只需启动 codec_dai 接收数据即可;

2、Codec

用于实现平台无关的功能,如寄存器读写接口,音频接口,各widgets的控制接口和DAPM的实现等。

字面上的意思就是编解码器,Codec里面包含了I2S接口、D/A、A/D、Mixer、PA(功放),通常包含多种输入(Mic、Line-in、I2S、PCM)和 多个输出(耳机、喇叭、听筒,Line-out),Codec和Platform一样,是可重用的部件,同一个 Codec 可以被不同的Machine使用。嵌入式 Codec 通常通过I2C对内部的寄存器进行控制。

这一部分只关心 Codec 本身,与 CPU 平台相关的特性不由此部分操作。
在移动设备中,Codec 的作用可以归结为4种,分别是:
1、对 PCM 等信号进行 D/A 转换,把数字的音频信号转换为模拟信号。
2、对Mic、Linein或者其他输入源的模拟信号进行A/D转换,把模拟的声音信号转变CPU能够处理的数字信号。
3、对音频通路进行控制,比如播放音乐,收听调频收音机,又或者接听电话时,音频信号在codec内的流通路线是不一样的。
4、对音频信号做出相应的处理,例如音量控制,功率放大,EQ控制等等。

ASoC 对 Codec 的这些功能都定义好了一些列相应的接口,以方便地对Codec进行控制。

ASoC 对 Codec 驱动的一个基本要求是:驱动程序的代码必须要做到平台无关性,以方便同一个 Codec 的代码不经修改即可用在不同的平台上。

3、machine

指某款机器,通过配置 dai_link把 cpu_dai、codec_dai、modem_dai 各个音频接口给链结成一条条音频链路,然后注册 snd_soc_card。

ASoC 的一切都从 Machine 驱动开始,包括声卡的注册,绑定 Platform 和 Codec 驱动等等

和上面两个不一样,Platform 和 CODEC 驱动一般是可以重用的,而 Machine 有它特定的硬件特性,几乎是不可重用的。

所谓的硬件特性指:
● SoC Platform 与 Codec 的差异;
● DAIs 之间的链结方式;
● 通过某个 GPIO 打开 Amplifier;
● 通过某个 GPIO 检测耳机插拔;
● 使用某个时钟如 MCLK/External-OSC 作为 I2S、CODEC 的时钟源等等。
从上面的描述来看,对于回放的情形,PCM 数据流向大致是:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45309916/article/details/124940961