2. 声卡硬件基础:I2S、PCM、AC97、HD Audio 总线协议简介

在深入 Linux 音频驱动调试之前,必须理解声卡与主控之间的硬件通信协议。这些协议定义了音频数据如何从编解码器(Codec)传输到 CPU,以及控制命令如何下发。本章聚焦四种核心总线/接口:I2S、PCM、AC97 和 HD Audio,分析其物理层、数据帧结构及在驱动调试中的关键观测点。

调试视角: 驱动探测失败或音频无声,80% 的根因在于总线时序不匹配、帧同步信号丢失或 Codec 未正确应答。掌握这些协议的信号特征,是使用逻辑分析仪或示波器定位问题的前提。

2.1 I2S(Inter-IC Sound)总线

I2S 是数字音频设备间传输 PCM 音频数据的最常用串行总线,由 Philips 公司制定。它仅处理音频数据,控制命令通常通过 I2C 或 SPI 通道传输。

2.1.1 物理信号与拓扑

I2S 使用三条主要信号线(有时加一条 MCLK):

  • BCLK(位时钟):对应数字音频的每一位,频率 = 采样率 × 位宽 × 通道数。
  • LRCK(帧时钟/左右声道选择):频率等于采样率,高电平表示左声道,低电平表示右声道(或相反)。
  • SD(串行数据):以二进制补码形式传输音频样本。
  • MCLK(主时钟,可选):频率通常为 256×fs 或 384×fs,用于 Codec 内部 PLL 同步。
关键公式: BCLK = fs × bits_per_sample × channels。例如 CD 音质(44.1kHz, 16bit, 双声道):BCLK = 44100 × 16 × 2 = 1.4112 MHz。
I2S 总线信号连接与基本时序 CPU / DMA 控制器 音频 Codec BCLK (位时钟) LRCK (帧时钟 / 44.1kHz) SD (串行数据) I2S 数据帧时序(左声道 16bit + 右声道 16bit) 16 个 BCLK 周期(左声道) LRCK = 高 (左声道) LRCK = 低 (右声道) SD: [15:0] 左声道样本 SD: [15:0] 右声道样本 注意:MSB 先传输,数据在 BCLK 上升沿采样

2.1.2 驱动调试要点

  • 时钟极性(POL):I2S 有标准模式和左对齐模式,需确认 Codec 数据手册中的 BCLK 与 LRCK 相位关系。
  • 帧同步偏移:标准 I2S 中,SD 数据在 LRCK 切换后延迟一个 BCLK 开始传输。若驱动配置为“左对齐”,则无此延迟,导致数据错位。
  • 主/从模式:CPU 通常作为主设备提供 BCLK 和 LRCK,Codec 作为从设备。若双方都配置为主模式,总线将冲突。

2.2 PCM(脉冲编码调制)接口

PCM 接口与 I2S 类似,但更灵活,支持时分复用(TDM),可在一个数据线上传输多达 16 个通道。常用于多通道音频系统或数字麦克风阵列。

2.2.1 与 I2S 的核心差异

特性I2SPCM 接口
通道数固定 2 通道(左右)1~16 通道(TDM 模式)
帧同步信号LRCK(50% 占空比)FSYNC(短脉冲,一个 BCLK 宽度)
数据对齐MSB 先传,延迟 1 BCLKMSB 先传,无延迟(通常)
典型应用立体声 Codec、Hi-Fi 音频蓝牙音频、数字麦克风、多通道 DSP
常见陷阱: 许多 SoC 的 PCM 接口与 I2S 共用引脚,通过寄存器配置模式。驱动初始化时若误将 PCM 模式配置为 I2S,会导致 FSYNC 信号被解释为 LRCK,造成通道数据错乱。
PCM 接口 TDM 帧结构(4 通道示例) FSYNC Slot 0 (CH0) Slot 1 (CH1) Slot 2 (CH2) Slot 3 (CH3) BCLK 每个 Slot 包含 16/20/24/32 位数据,FSYNC 脉冲标志帧起始

2.3 AC97 总线

AC97(Audio Codec '97)是 Intel 制定的早期音频标准,将 Codec 与数字控制器分离。它使用 5 线串行接口(包括复位和同步信号),支持 48kHz 固定采样率。

2.3.1 协议特点

  • 固定帧率:48kHz 帧同步,每帧包含 12 个输出时隙和 12 个输入时隙。
  • 控制通道:通过时隙 0 传输寄存器读写命令,支持 64 个 16 位控制寄存器。
  • 可变位宽:音频数据时隙支持 16/18/20 位。
时隙编号功能方向
Slot 0帧同步与 Codec ID双向
Slot 1命令地址端口控制器 → Codec
Slot 2命令数据端口控制器 → Codec
Slot 3状态地址端口Codec → 控制器
Slot 4状态数据端口Codec → 控制器
Slot 5~11PCM 音频数据(左右声道)双向
调试提示: AC97 驱动探测时,内核会尝试读取 Codec 的寄存器 0x00(Vendor ID)。若返回 0xFFFFFFFF 或 0x00000000,通常表示 BITCLK 或 SYNC 信号未正确建立,需检查电源和复位时序。
AC97 帧结构(48kHz 帧率) AC97 帧 (20.83µs @ 48kHz) Slot 0 Slot 1 Slot 2 Slot 3 Slot 4 Slot 5 Slot 6 Slot 7 Slot 8 Slot 9 Slot 0: 帧同步与 Codec 标签 | Slot 1-2: 命令通道 | Slot 3-4: 状态通道 | Slot 5-9: 音频数据 每个时隙 16 位数据,总帧长 12 × 16 = 192 位

2.4 HD Audio(高保真音频)总线

HD Audio 是 Intel 为替代 AC97 而推出的新一代音频总线,支持更高的带宽(24位/192kHz)、多 Codec 拓扑和动态电源管理。它采用 4 线串行接口:BCLK、SYNC、SDIN、SDOUT。

2.4.1 关键特性

  • 命令与数据分离:通过 SDOUT 发送命令帧,SDIN 接收响应帧。
  • 多 Codec 支持:每个 Codec 有唯一地址(0~15),通过 SYNC 信号同步。
  • 无标签(Tag)机制:HD Audio 使用“出栈-入栈”命令队列,驱动必须维护命令超时和重试逻辑。

2.4.2 命令帧格式

字段位宽描述
Codec 地址4 位目标 Codec 编号 (0~15)
节点 ID8 位Codec 内部功能节点
Verb ID8 位命令操作码(如 GET_PARAM、SET_AMP)
Payload12 位命令参数或数据
调试难点: HD Audio 驱动初始化时,控制器会发送 RESET 命令并等待 Codec 就绪。若 Codec 未在 521µs 内响应,控制器会报“RIRB 超时”错误。此时应检查 BCLK 频率(通常为 24MHz)和 SYNC 信号占空比。
HD Audio 命令-响应事务 HD Audio 控制器 Codec #0 SDOUT: 命令帧 (Verb) SDIN: 响应帧 (Response) 命令帧位布局 (SDOUT) Addr[3:0] Node ID[7:0] Verb ID[7:0] Payload[11:0] 总长度 32 位,BCLK 下降沿锁存,每个命令帧后紧跟一个响应帧

2.5 总线协议对比总结

协议最大采样率最大位宽通道数控制通道典型 Codec
I2S192 kHz32 位2外部 I2C/SPIWM8731, CS42L52
PCM (TDM)192 kHz32 位1~16外部 I2C/SPITLV320AIC3x, ADAU1761
AC9748 kHz20 位2~6内嵌于帧时隙AD1981B, ALC655
HD Audio192 kHz32 位2~16内嵌命令帧ALC888, CX20590
选型建议: 对于嵌入式 Linux 系统,I2S 是最灵活且资源消耗最低的选择;HD Audio 适合 PC 平台,但驱动复杂度高;AC97 已逐渐淘汰,仅维护旧平台时需关注。