4. 音频硬件接口规范(I2S/PCM/TDM)
在 Android 音频 HAL 驱动适配中,理解数字音频接口的物理层与时序规范是基础。本章聚焦三种最常用的同步串行接口:I2S(Inter-IC Sound)、PCM(Pulse Code Modulation)和 TDM(Time Division Multiplexing)。掌握它们的协议细节、时序差异以及多通道配置方法,是正确编写 ALSA 驱动和 dts 节点的前提。
4.1 I2S 协议详解
I2S 由 Philips 公司制定,专用于数字音频设备间的数据传输。它使用三根主要信号线:
- BCLK(位时钟,Bit Clock):每个脉冲对应一个数据位。
- LRCK(左右声道时钟,Left-Right Clock):也称帧时钟(FS),频率等于采样率,高电平表示左声道,低电平表示右声道(或相反)。
- SD(串行数据,Serial Data):以二进制补码形式传输音频样本。
关键时序参数: BCLK 频率 = 采样率 × 位深 × 通道数。例如 48kHz / 24bit / 2ch 时,BCLK = 48k × 24 × 2 = 2.304MHz。
I2S 标准时序要求数据在 BCLK 的下降沿变化,在上升沿被接收端采样。LRCK 在数据发送前一个 BCLK 周期切换,保证接收端能提前识别声道。
I2S 数据格式(标准 Philips 模式):
- MSB 先传输,紧跟在 LRCK 切换之后。
- 数据位宽可配置为 16/24/32 位,但 LRCK 周期固定为 2 × 采样周期。
- 如果位深小于槽位宽度,低位补零。
4.2 PCM 接口时序
PCM 接口与 I2S 类似,但通常用于语音通信(如蓝牙免提、蜂窝基带)。PCM 接口有四种主要信号:
- PCM_CLK:位时钟,频率通常为 512kHz、1.024MHz 或 2.048MHz。
- PCM_SYNC:帧同步信号,频率等于采样率(8kHz 语音常用)。
- PCM_DIN / PCM_DOUT:数据输入/输出。
I2S 与 PCM 的核心区别:
- I2S 的 LRCK 在数据之前切换,PCM 的 SYNC 通常与数据第一位对齐。
- PCM 支持长帧同步(SYNC 持续多个 BCLK)和短帧同步(SYNC 仅一个 BCLK)。
- PCM 常用于单声道或双声道语音,I2S 更适用于高保真立体声音乐。
| 特性 | I2S | PCM |
|---|---|---|
| 典型应用 | 音频 Codec、HDMI、DAC | 蓝牙、基带、VoIP |
| 帧同步方式 | LRCK 电平标识声道 | SYNC 脉冲标识帧起始 |
| 数据对齐 | MSB 在 LRCK 边沿后 | MSB 与 SYNC 对齐 |
| 典型位深 | 16/24/32 bit | 8/13/16 bit |
| 多通道支持 | 需额外 TDM 模式 | 通过时隙扩展 |
4.3 TDM 多通道配置
TDM(时分复用)将多个音频通道的数据按时间片(时隙,Slot)在同一条数据线上传输。TDM 本质上是 PCM 接口的扩展,广泛应用于多麦克风阵列、多声道音频系统(如 8 通道 HDMI 或车载音响)。
TDM 关键配置参数:
- 时隙数(Slot Count):决定总通道数,通常为 2/4/8/16。
- 时隙宽度(Slot Width):每个时隙的 BCLK 周期数,必须 ≥ 位深。
- 帧同步模式:短帧(1 BCLK)或长帧(8/16 BCLK)。
- 数据对齐:左对齐(MSB 在时隙起始)或右对齐(LSB 在时隙结束)。
在 Android 内核 ALSA 驱动中,TDM 配置通过 snd_soc_dai_set_tdm_slot() 函数设置:
/* 配置 TDM:8 时隙,每时隙 32bit,左对齐 */
int ret = snd_soc_dai_set_tdm_slot(codec_dai,
0xFF, /* tx_mask: 8 个时隙全使能 */
0xFF, /* rx_mask */
8, /* slots */
32, /* slot_width */
0); /* 0 = 左对齐, 1 = 右对齐 */
if (ret < 0) {
dev_err(dev, "Failed to set TDM slot\n");
return ret;
}
| 时隙编号 | 通道映射 | 位深 | 数据对齐 |
|---|---|---|---|
| Slot 0 | Front Left (FL) | 24 bit | 左对齐 |
| Slot 1 | Front Right (FR) | 24 bit | 左对齐 |
| Slot 2 | Center (C) | 24 bit | 左对齐 |
| Slot 3 | LFE (Subwoofer) | 24 bit | 左对齐 |
| Slot 4 | Rear Left (RL) | 24 bit | 左对齐 |
| Slot 5 | Rear Right (RR) | 24 bit | 左对齐 |
| Slot 6 | Side Left (SL) | 24 bit | 左对齐 |
| Slot 7 | Side Right (SR) | 24 bit | 左对齐 |
4.4 硬件连接图绘制
在 Android 音频 HAL 适配中,硬件连接图是驱动开发与硬件调试的桥梁。以下是一个典型的 SoC + Codec I2S/TDM 连接示例:
连接图关键要素:
- SoC 端 I2S 控制器(如 Samsung I2S、QCOM MI2S)与外部 Codec 的引脚映射。
- 时钟源选择:主模式(SoC 提供 BCLK/LRCK)或从模式(Codec 提供时钟)。
- GPIO 控制:复位、电源使能、中断检测。
- 多路复用:同一组引脚可能复用为 I2S 或 TDM,需在 dts 中配置 pinctrl。
驱动适配检查清单:
- 确认 SoC 与 Codec 的 I2S/TDM 模式匹配(主/从)。
- 在 dts 中配置 pinctrl,确保引脚功能复用正确。
- 使用
snd_soc_dai_set_fmt()设置格式(I2S / Left-J / DSP-A / DSP-B)。 - 使用
snd_soc_dai_set_tdm_slot()配置 TDM 时隙。 - 用示波器或逻辑分析仪抓取 BCLK/LRCK/SD 波形,验证时序。
4.5 常见问题与调试方法
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 无声音输出 | BCLK 或 LRCK 缺失 | 示波器测量时钟引脚;检查 dts 时钟配置 |
| 声音失真或噪声 | 位深/槽位宽度不匹配 | 核对 slot_width 与 Codec 寄存器配置 |
| 声道反转 | LRCK 极性配置错误 | 检查 set_fmt 中的 SND_SOC_DAIFMT_NB_NF 参数
|