ALSA 片上系统层概述

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“声卡设备”。它处理任何机器特定的控件和机器级别的音频事件(例如,在播放开始时打开放大器)。