ALSA SoC 层概述
文档的结构:背景、目标、实现。
ALSA 片上系统 (ASoC) 层的总体项目目标是为嵌入式片上系统处理器提供更好的 ALSA 支持(例如pxa2xx、au1x00、IMX 等)和便携式音频编解码器。在 ASoC 之前子系统内核中有一些对 SoC 音频的支持,但是它有一些限制。可以认为时ALSA出现的背景,也是创建ALSA后,朝之改进的点。
-
编解码器驱动程序通常与底层 SoC 紧密耦合中央处理器。这并不理想,会导致代码重复。例如,Linux 有用于 4 种不同 SoC 平台的不同 wm8731 驱动程序。
-
没有标准方法来表示用户发起的音频事件(例如耳机/麦克风插入,插入后耳机/麦克风检测
事件)。这些是便携式设备上非常常见的事件,通常需要机器特定代码以重新路由音频,启用放大器等,在这样的之后事件。 -
驱动程序在播放时倾向于打开整个编解码器(或录音)音频。这对 PC 来说很好,但往往会浪费很多打开便携式设备。也不支持储蓄通过改变编解码器过采样率、偏置电流等来控制电源。
ASoC 的设计目的
ASoC 层旨在解决这些问题并提供以下功能:
-
编解码器独立性,即特定声卡驱动的独立性,方便驱动移植。
-
方便设置codec和 SoC 之间的 I2S/PCM 音频接口。每个 SoC接口和codec将其音频接口功能注册到core ,随后在应用程序时进行匹配和配置硬件参数。
-
动态音频电源管理 (DAPM)。 DAPM 自动将codec设置为最低功率状态。这包括通电/断电,以及内部电源块取决于codec音频路由和任何正常工作的数据流。
-
pop音和click 音减少。减少由通电/断电codec时序(包括使用数字静音)引发的pop音和click音。 ASoC 指示当codec更改电源状态会通知到ASoC。
- 机器特定控件。在编写codec驱动时,方便添加控件(例如扬声器放大器的音量控制,音源切换)。
设计实现
为了实现这一切,ASoC 基本上将嵌入式音频系统拆分多个可重用的组件驱动程序:
-
codec驱动程序:codec驱动程序与平台无关,并且包含音频控制、音频接口功能、DAPM定义和codec IO 函数。还可以扩展到 BT、FM 和 MODEM,IC。codec 类驱动程序应该是可以运行的通用代码在任何架构和机器上。
-
平台类驱动:平台类驱动包括音频DMA引擎驱动程序、数字音频接口 (DAI) 驱动程序(例如 I2S、AC97、PCM)以及该平台的任何音频 DSP 驱动程序。
-
机器类驱动程序:该驱动充当粘合剂,将其他组件驱动程序绑定在一起,以形成 ALSA
“声卡设备”。它处理任何机器特定的控制和机器级音频事件(例如在播放开始时打开放大器)。