ALSA SoC 层概览¶
ALSA 片上系统 (ASoC) 层的总体项目目标是为嵌入式片上系统处理器(例如 pxa2xx、au1x00、iMX 等)和便携式音频编解码器提供更好的 ALSA 支持。 在 ASoC 子系统之前,内核中对 SoC 音频有一些支持,但它有一些限制:-
编解码器驱动程序通常与底层 SoC CPU 紧密耦合。 这并不理想,并且会导致代码重复 - 例如,Linux 为 4 个不同的 SoC 平台提供了不同的 wm8731 驱动程序。
没有标准方法来发出用户启动的音频事件信号(例如,耳机/麦克风插入、插入事件后检测耳机/麦克风)。 这些是便携式设备上非常常见的事件,并且通常需要特定于机器的代码才能在发生此类事件后重新路由音频、启用放大器等。
驱动程序倾向于在播放(或录制)音频时启动整个编解码器。 这对于 PC 来说很好,但往往会在便携式设备上浪费大量电量。 也没有通过更改编解码器过采样率、偏置电流等来节省电量的支持。
ASoC 设计¶
ASoC 层旨在解决这些问题并提供以下功能:-
编解码器独立性。 允许在其他平台和机器上重复使用编解码器驱动程序。
编解码器和 SoC 之间轻松的 I2S/PCM 音频接口设置。 每个 SoC 接口和编解码器都向核心注册其音频接口功能,并在知道应用程序硬件参数时随后进行匹配和配置。
动态音频电源管理 (DAPM)。 DAPM 始终自动将编解码器设置为其最小功率状态。 这包括根据内部编解码器音频路由和任何活动流启动/关闭内部电源块。
消除爆音和咔哒声。 可以通过以正确的顺序启动/关闭编解码器电源(包括使用数字静音)来减少爆音和咔哒声。 ASoC 会在需要更改电源状态时向编解码器发出信号。
特定于机器的控件:允许机器向声卡添加控件(例如,扬声器放大器的音量控制)。
为了实现所有这些,ASoC 基本上将嵌入式音频系统拆分为多个可重用的组件驱动程序:-
编解码器类驱动程序:编解码器类驱动程序是独立于平台的,包含音频控件、音频接口功能、编解码器 DAPM 定义和编解码器 IO 功能。 如果需要,此类会扩展到 BT、FM 和 MODEM IC。 编解码器类驱动程序应该是可以在任何架构和机器上运行的通用代码。
平台类驱动程序:平台类驱动程序包括音频 DMA 引擎驱动程序、数字音频接口 (DAI) 驱动程序(例如 I2S、AC97、PCM)以及该平台的任何音频 DSP 驱动程序。
机器类驱动程序:机器驱动程序类充当粘合剂,用于描述和绑定其他组件驱动程序,以形成 ALSA“声卡设备”。 它处理任何特定于机器的控件和机器级别的音频事件(例如,在播放开始时打开放大器)。