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。
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 的核心差异
| 特性 | I2S | PCM 接口 |
|---|---|---|
| 通道数 | 固定 2 通道(左右) | 1~16 通道(TDM 模式) |
| 帧同步信号 | LRCK(50% 占空比) | FSYNC(短脉冲,一个 BCLK 宽度) |
| 数据对齐 | MSB 先传,延迟 1 BCLK | MSB 先传,无延迟(通常) |
| 典型应用 | 立体声 Codec、Hi-Fi 音频 | 蓝牙音频、数字麦克风、多通道 DSP |
常见陷阱: 许多 SoC 的 PCM 接口与 I2S 共用引脚,通过寄存器配置模式。驱动初始化时若误将 PCM 模式配置为 I2S,会导致 FSYNC 信号被解释为 LRCK,造成通道数据错乱。
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~11 | PCM 音频数据(左右声道) | 双向 |
调试提示: AC97 驱动探测时,内核会尝试读取 Codec 的寄存器 0x00(Vendor ID)。若返回 0xFFFFFFFF 或 0x00000000,通常表示 BITCLK 或 SYNC 信号未正确建立,需检查电源和复位时序。
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) |
| 节点 ID | 8 位 | Codec 内部功能节点 |
| Verb ID | 8 位 | 命令操作码(如 GET_PARAM、SET_AMP) |
| Payload | 12 位 | 命令参数或数据 |
调试难点: HD Audio 驱动初始化时,控制器会发送 RESET 命令并等待 Codec 就绪。若 Codec 未在 521µs 内响应,控制器会报“RIRB 超时”错误。此时应检查 BCLK 频率(通常为 24MHz)和 SYNC 信号占空比。
2.5 总线协议对比总结
| 协议 | 最大采样率 | 最大位宽 | 通道数 | 控制通道 | 典型 Codec |
|---|---|---|---|---|---|
| I2S | 192 kHz | 32 位 | 2 | 外部 I2C/SPI | WM8731, CS42L52 |
| PCM (TDM) | 192 kHz | 32 位 | 1~16 | 外部 I2C/SPI | TLV320AIC3x, ADAU1761 |
| AC97 | 48 kHz | 20 位 | 2~6 | 内嵌于帧时隙 | AD1981B, ALC655 |
| HD Audio | 192 kHz | 32 位 | 2~16 | 内嵌命令帧 | ALC888, CX20590 |
选型建议: 对于嵌入式 Linux 系统,I2S 是最灵活且资源消耗最低的选择;HD Audio 适合 PC 平台,但驱动复杂度高;AC97 已逐渐淘汰,仅维护旧平台时需关注。