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(动态音频电源管理)等高层抽象映射为具体的寄存器位操作。
关键理解: 在嵌入式 Linux 中,Codec 驱动不仅仅是“读写寄存器”,它需要与 SoC 端的 CPU DAI(数字音频接口)驱动、DMA 引擎以及用户空间的 ALSA lib 协同工作,构成完整的音频数据通路。

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 驱动开发。

选型建议: 学习阶段优先选择 WM8960 或 ES8316,因为它们的 Linux 驱动文档丰富,寄存器手册清晰。TLV320AIC3x 系列更适合需要复杂模拟通路定制的工业项目。
嵌入式 Linux 音频系统架构 — Codec 位置 SoC / CPU I²S / PCM 接口 DMA 控制器 I²S 数据 音频 Codec DAC / ADC 混音器 / PGA DAPM 电源管理 I²C 控制 模拟输出 模拟输入 扬声器 / 耳机 麦克风 / Line In 图注: • 实线箭头:音频数据流(I²S/PCM 数字音频总线) • 虚线箭头:控制通路(I²C/SPI 寄存器配置) • Codec 驱动通过 ALSA soc-core 框架,将寄存器操作封装为 kcontrol 和 DAPM 组件

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 定义。
  • 硬件层:Codec 芯片通过 I²C/SPI 被控制,通过 I²S/PCM 传输音频数据。
常见误区: 初学者容易将 Codec 驱动与 Machine 驱动混淆。Machine 驱动负责描述 SoC 的 DAI 与 Codec 的 DAI 之间的物理连接(如时钟极性、帧格式),而 Codec 驱动只关注芯片内部的寄存器配置。两者通过 ASoC 的 DAI link 机制绑定。
ALSA ASoC 驱动分层结构 用户空间:ALSA lib / tinyalsa / 音频应用 内核空间 — ASoC 框架 Platform 驱动 DMA 引擎 CPU DAI 接口 Codec 驱动 寄存器读写 DAPM / kcontrol Machine 驱动 DAI Link 绑定 板级初始化 硬件层:Codec 芯片 (I²C/SPI + I²S/PCM)

1.5 本章小结

音频 Codec 是嵌入式 Linux 音频系统的核心硬件抽象层。通过本章,我们明确了:

  1. Codec 在系统中承担数模转换、通路管理、时钟同步和电源控制四大职责。
  2. WM8960、TLV320AIC3x、ES8316 三款芯片在性能、接口和驱动成熟度上各有特点,适合不同场景。
  3. 在 ASoC 框架中,Codec 驱动与 Platform 驱动、Machine 驱动协同工作,寄存器配置是 Codec 驱动的核心实现细节。