一、ALSA框架
音频设备接口有多种,如PCM、I2S和AC97,适用于不同的应用场合。Linux内核中有两种主要的音频驱动框架:
OSS(开放声音系统):通过字符设备接口直接访问硬件。
ALSA(高级Linux声音架构):通过库文件访问硬件,不再直接使用sound设备节点。
本篇博客将重点介绍ALSA框架。
1.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进行配置的。
1.2 ALSA框架
ALSA框架从上到下依次为:
应用程序:如tinyplay、tinycap、tinymix,这些程序通过alsa库调用API来实现播放、录音和控制。
ALSA库API:提供统一的API接口,简化了应用程序的实现难度。
ALSA核心层:向上提供逻辑设备(如PCM、CTL、MIDI等)的系统调用,向下驱动硬件设备。
ASoC核心层:基于标准ALSA核心层,专门为嵌入式系统设计,支持音频Codec。
硬件驱动:由Machine、Platform和Codec组成。
以前,应用程序直接调用硬件驱动,但现在通过库文件来访问驱动,这样可以隐藏驱动的实现细节。常用的库有alsa-lib和tinyalsa。
1.3 ASoC
ASoC是在标准ALSA核心基础上的一层封装,解决了以下问题:
独立的Codec驱动:使得Codec驱动可以在不同平台上复用。
简单的I2S/PCM接口设置:方便配置Codec和SoC之间的连接。
动态电源管理:使Codec始终处于最低功耗状态,并负责音频路由。
POP和click音抑制:通过正确的上下电顺序来实现。
特定控制:如耳机、麦克风插拔检测和外放功放开关。
为了实现这些功能,ASoC将音频系统拆分为三个可重用的组件:Machine、Platform和Codec。这样可以使硬件驱动更加灵活和可移植。