1. 音频 Codec 概述
在嵌入式 Linux 音频系统中,音频 Codec(Coder-Decoder)是连接数字音频处理器(SoC/CPU)与模拟音频世界的核心桥梁。它负责完成数字音频信号与模拟音频信号之间的双向转换,并管理音频通路、增益控制、采样率同步等关键功能。
1.1 Codec 在嵌入式 Linux 中的作用
嵌入式 Linux 音频子系统通常采用 ALSA(Advanced Linux Sound Architecture) 框架。Codec 驱动作为 ALSA 体系中的底层硬件抽象层,承担以下核心职责:
- D/A 与 A/D 转换:将数字 PCM 流转换为模拟音频输出(播放),或将模拟麦克风/线路输入转换为数字 PCM 流(录音)。
- 音频通路管理:通过内部混音器、多路选择器(MUX)、可编程增益放大器(PGA)等模块,动态配置音频数据流路径。
- 采样率与时钟同步:根据系统主时钟(MCLK)或外部时钟源,配置内部 PLL 分频,生成所需的采样率(8kHz ~ 192kHz)。
- 电源管理与功耗优化:控制内部各模块(DAC、ADC、耳机放大器、麦克风偏置等)的独立上电/下电,实现低功耗待机。
- 寄存器抽象与配置:通过 I²C 或 SPI 总线访问 Codec 内部寄存器,将 ALSA 的
kcontrol、DAPM(动态音频电源管理)等高层抽象映射为具体的寄存器位操作。
1.2 常见音频 Codec 芯片简介
市场上存在大量音频 Codec 芯片,它们在接口类型、模拟特性、功耗等级和封装尺寸上各有侧重。以下三款是嵌入式 Linux 开发中极具代表性的型号:
| 特性 | WM8960 | TLV320AIC3x | ES8316 |
|---|---|---|---|
| 厂商 | Cirrus Logic (Wolfson) | Texas Instruments | Everest Semiconductor |
| 接口 | I²S / PCM, I²C 控制 | I²S / DSP, I²C 或 SPI 控制 | I²S / PCM, I²C 控制 |
| DAC/ADC 性能 | 24-bit, 信噪比 98dB (DAC) | 24-bit, 信噪比 92~100dB | 24-bit, 信噪比 100dB (DAC) |
| 内置功放 | 2×1W 立体声扬声器功放 | 可选单声道/立体声功放 | 无内置功放,需外接 |
| 典型应用 | 树莓派音频扩展板、便携音箱 | 工业平板、车载信息娱乐 | 智能音箱、低功耗 IoT 设备 |
| Linux 驱动状态 | 主线内核支持完善 | 主线内核支持,配置灵活 | 主线内核支持,社区维护活跃 |
1.3 三款 Codec 的架构特点
WM8960
WM8960 是一款经典的立体声 Codec,内置双路 1W 扬声器功放和耳机驱动器。其内部包含完整的 DAPM 通路,支持 3D 立体声增强和动态范围压缩。在嵌入式 Linux 中,WM8960 驱动是学习 DAPM 和寄存器映射的绝佳范例。
TLV320AIC3x 系列
TI 的 TLV320AIC3x 系列(如 AIC3100、AIC3254)以高度可配置的模拟输入/输出通路著称。它支持差分/单端输入、可编程麦克风偏置、以及灵活的 PLL 时钟树。该系列驱动在工业级产品中广泛使用,其寄存器配置涉及大量通路选择位。
ES8316
ES8316 是一款低功耗、小封装的 Codec,专为电池供电的便携设备设计。它支持 24-bit/96kHz 音频,内置低噪声麦克风偏置和耳机放大器。ES8316 的寄存器空间较小(通常 8-bit 地址),配置简洁,适合初学者快速上手 Codec 驱动开发。
1.4 Codec 驱动在 ALSA 框架中的层次
理解 Codec 在软件栈中的位置,有助于后续寄存器配置的学习。下图展示了 ALSA 音频驱动的分层结构:
- 用户空间:ALSA lib / tinyalsa / PulseAudio 等音频服务。
- 内核空间:
- ALSA Core:提供
snd_pcm、snd_ctl等字符设备接口。 - ASoC (ALSA System on Chip):将音频驱动拆分为 Platform(DMA/DAI)、Codec、Machine(板级连接)三部分。
- Codec 驱动:实现
snd_soc_dai_driver和snd_soc_codec_driver,包含寄存器读写函数、DAPM 路由表、kcontrol 定义。
- ALSA Core:提供
- 硬件层:Codec 芯片通过 I²C/SPI 被控制,通过 I²S/PCM 传输音频数据。
1.5 本章小结
音频 Codec 是嵌入式 Linux 音频系统的核心硬件抽象层。通过本章,我们明确了:
- Codec 在系统中承担数模转换、通路管理、时钟同步和电源控制四大职责。
- WM8960、TLV320AIC3x、ES8316 三款芯片在性能、接口和驱动成熟度上各有特点,适合不同场景。
- 在 ASoC 框架中,Codec 驱动与 Platform 驱动、Machine 驱动协同工作,寄存器配置是 Codec 驱动的核心实现细节。