1. 音频 Codec 概述

音频 Codec(Coder-Decoder)是嵌入式音频系统的核心模拟-数字混合芯片,负责在数字音频流与模拟音频信号之间完成双向转换,并管理音量、混音、滤波、增益等信号链路。在 Linux 嵌入式系统中,音频 Codec 驱动位于 ALSA(Advanced Linux Sound Architecture)框架的 Codec 层,与 Platform 驱动(DMA/CPU DAI)和 Machine 驱动(板级链路)共同构成标准的三层音频驱动模型。

1.1 音频 Codec 在嵌入式系统中的作用

嵌入式设备(智能音箱、车载信息娱乐、安防对讲、便携音频)对音频 Codec 的需求集中在以下四个维度:

维度说明典型指标
模拟-数字转换ADC 将麦克风/线路输入的模拟信号转为 PCM/I2S 数字流SNR ≥ 90 dB,THD+N ≤ -80 dB
数字-模拟转换DAC 将数字音频还原为模拟信号驱动耳机/扬声器输出功率 30 mW – 1 W,信噪比 ≥ 100 dB
信号链路控制音量调节、静音、混音、EQ、ALC(自动电平控制)增益步进 0.5/1 dB,混音路径 ≥ 4 路
接口与时钟管理I2S/TDM 数字音频接口、PLL 时钟生成、MCLK/BCLK/LRCK 同步采样率 8 kHz – 192 kHz,主/从模式可配
关键认知: 嵌入式音频 Codec 不是单纯的 ADC/DAC 芯片,它集成了完整的模拟前端、数字信号处理(DSP)和电源管理单元。驱动开发者的核心工作是通过 I2C/SPI 寄存器读写来配置这些内部模块,使其与 SoC 的 CPU DAI 和 DMA 通道协同工作。

1.2 常见音频 Codec 芯片介绍

下表列出三款在嵌入式 Linux 开发中广泛使用的 Codec 芯片,覆盖低功耗便携、中端车载和通用工业场景:

芯片型号厂商主要特性典型应用驱动路径 (Linux)
WM8960Cirrus Logic (Wolfson)双声道 DAC/ADC、内置 1W 扬声器功放、D类输出、低功耗便携音箱、智能家居、平板sound/soc/codecs/wm8960.c
ES8316Everest Semiconductor超低功耗(ADC 1.5 mA)、单声道、内置 MICBIAS、小封装智能语音助手、TWS 充电盒、IoT 节点sound/soc/codecs/es8316.c
TLV320AIC3xTexas Instruments多通道(2-4 路)、可编程 PLL、数字混音、ALC 引擎车载信息娱乐、安防对讲、工业语音sound/soc/codecs/tlv320aic3x.c
选型提示: WM8960 驱动成熟度高,社区支持好,适合快速原型;ES8316 功耗极低,适合电池供电的唤醒词检测场景;TLV320AIC3x 的混音和 ALC 能力更强,适合多麦克风输入的车载/工业产品。

1.3 音频 Codec 驱动在 Linux 内核中的位置

Linux 音频子系统采用 ALSA 框架,Codec 驱动位于 sound/soc/codecs/ 目录下,属于 ASoC (ALSA System on Chip) 三层模型中的 Codec 层。下图展示了 ASoC 架构及 Codec 驱动的角色:

ASoC 三层架构与 Codec 驱动位置 ASoC 三层音频驱动模型 Machine 驱动 板级链路:CPU DAI + Codec + 时钟/GPIO Platform 驱动 CPU DAI + DMA 引擎 + 音频接口 Codec 驱动 I2C/SPI 寄存器读写 + DAPM + 控制接口 Codec 硬件芯片 WM8960 / ES8316 / TLV320AIC3x ★ Codec 驱动核心职责: 通过 I2C/SPI 读写寄存器 → 配置 ADC/DAC/混音器/ALC → 注册 ALSA 控制接口 → 实现 DAPM 电源管理

在 ASoC 框架中,Codec 驱动需要实现以下核心接口:

  • 寄存器读写回调:通过 regmap 或直接 I2C/SPI 传输函数操作硬件寄存器,这是故障排查的第一入口。
  • DAPM (Dynamic Audio Power Management):定义音频路径中的电源域和 widget,实现按需供电,降低功耗。
  • ALSA 控制接口:将音量、混音开关、EQ 等暴露给用户空间的 amixer / alsamixer。
  • DAI 配置:设置 I2S/TDM 格式、位宽、主从模式,与 Platform 驱动的 CPU DAI 匹配。
常见误区: 初学者常把 Codec 驱动等同于“读写寄存器”。实际上,一个完整的 Codec 驱动必须同时实现 DAPM 电源拓扑和 ALSA 控制接口,否则会出现播放无声时芯片仍全功耗运行、或混音器控件无法调节音量等问题。寄存器读写只是基础,驱动架构设计才是关键。

1.4 本章小结