一、ALSA 框架
音频设备接口有多种,如 PCM、I2S 和 AC97,适用于不同的应用场合。Linux 内核中有两种主要的音频驱动框架:
- OSS(开放声音系统):通过字符设备接口直接访问硬件。
- ALSA(高级 Linux 声音架构):通过库文件访问硬件,不再直接使用 sound 设备节点。
本篇博客将重点介绍 ALSA 框架。
1 音频硬件设备
在 ALSA 中,硬件设备分为三类:
- Machine:描述特定的机器或设备,例如 RK3399 开发板。
- Platform:描述 SoC 平台,例如 RK3399。
- Codec:描述声卡芯片,例如 ALC5651。
Machine
Machine 指的是具体的设备,比如某个开发板或智能手机。每个 Machine 的硬件实现可能不同,包括 SoC、Codec 和输入输出设备。
Platform
Platform 通常指一个 SoC 平台,例如 RK3399。它包括 SoC 中的时钟、DMA、I2S 等组件。同一款 SoC 可以在多个不同的 Machine 上使用。
Codec
Codec 是编解码器,包含 D/A 转换、A/D 转换、混音器等功能。它通过 I2C/SPI 控制内部寄存器。嵌入式 Codec 通常是通过 I2C 或 SPI 进行配置的。
2 ALSA 框架
ALSA 框架从上到下依次为:
- 应用程序:如 tinyplay、tinycap、tinymix,这些程序通过 alsa 库调用 API 来实现播放、录音和控制。
- ALSA 库 API:提供统一的 API 接口,简化了应用程序的实现难度。
- ALSA 核心层:向上提供逻辑设备(如 PCM、CTL、MIDI 等)的系统调用,向下驱动硬件设备。
- ASoC 核心层:基于标准 ALSA 核心层,专门为嵌入式系统设计,支持音频 Codec。
- 硬件驱动:由 Machine、Platform 和 Codec 组成。
以前,应用程序直接调用硬件驱动,但现在通过库文件来访问驱动,这样可以隐藏驱动的实现细节。常用的库有 alsa-lib 和 tinyalsa。
3 ASoC
ASoC 是在标准 ALSA 核心基础上的一层封装,解决了以下问题:
- 独立的 Codec 驱动:使得 Codec 驱动可以在不同平台上复用。
- 简单的 I2S/PCM 接口设置:方便配置 Codec 和 SoC 之间的连接。
- 动态电源管理:使 Codec 始终处于最低功耗状态,并负责音频路由。
- POP 和 click 音抑制:通过正确的上下电顺序来实现。
- 特定控制:如耳机、麦克风插拔检测和外放功放开关。
为了实现这些功能,ASoC 将音频系统拆分为三个可重用的组件:Machine、Platform 和 Codec。这样可以使硬件驱动更加灵活和可移植。