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 × 采样周期。
  • 如果位深小于槽位宽度,低位补零。
I2S 标准时序图(Philips 模式) BCLK LRCK 左声道(L) 右声道(R) SD MSB ... MSB 数据在 BCLK 下降沿变化,上升沿采样;LRCK 在数据前一个 BCLK 切换 MSB 紧邻 LRCK 边沿,保证接收端同步

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 接口对比
特性 I2S PCM
典型应用 音频 Codec、HDMI、DAC 蓝牙、基带、VoIP
帧同步方式 LRCK 电平标识声道 SYNC 脉冲标识帧起始
数据对齐 MSB 在 LRCK 边沿后 MSB 与 SYNC 对齐
典型位深 16/24/32 bit 8/13/16 bit
多通道支持 需额外 TDM 模式 通过时隙扩展
PCM 短帧同步时序(8kHz / 16bit) PCM_CLK PCM_SYNC 帧同步脉冲 PCM_DOUT MSB ... 短帧同步:SYNC 仅持续 1 个 BCLK 周期,数据 MSB 与 SYNC 对齐 长帧同步:SYNC 持续多个 BCLK(通常为 8 个),用于标识时隙

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;
}
TDM 多通道配置示例(8 通道,32bit 时隙)
时隙编号 通道映射 位深 数据对齐
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 左对齐
TDM 8 通道数据帧结构(短帧同步) SYNC DATA Slot 0 Slot 1 Slot 2 Slot 3 Slot 4 Slot 5 Slot 6 Slot 7 FL FR C LFE RL RR SL SR TDM 帧结构要点 每个时隙宽度 = slot_width × BCLK 周期,本例为 32 BCLK 帧周期 = 采样率倒数,8 个时隙连续传输后进入下一帧 tx_mask / rx_mask 按位使能时隙,0xFF 表示 8 个时隙全部激活 未使用的时隙可保持高阻或输出 0,由 Codec 配置决定

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 硬件连接图 SoC I2S 控制器 (主模式) I2S0_BCLK I2S0_LRCK I2S0_SDI I2S0_SDO Codec (从模式) BCLK LRCK SDI SDO BCLK LRCK SDI (SoC→Codec) SDO (Codec→SoC) GPIO: 复位 / 电源 INT / 检测 控制/状态 主模式:SoC 产生 BCLK/LRCK;从模式:Codec 提供时钟,需在 dts 中配置
驱动适配检查清单:
  1. 确认 SoC 与 Codec 的 I2S/TDM 模式匹配(主/从)。
  2. 在 dts 中配置 pinctrl,确保引脚功能复用正确。
  3. 使用 snd_soc_dai_set_fmt() 设置格式(I2S / Left-J / DSP-A / DSP-B)。
  4. 使用 snd_soc_dai_set_tdm_slot() 配置 TDM 时隙。
  5. 用示波器或逻辑分析仪抓取 BCLK/LRCK/SD 波形,验证时序。

4.5 常见问题与调试方法

音频接口调试常见问题
现象 可能原因 排查方法
无声音输出 BCLK 或 LRCK 缺失 示波器测量时钟引脚;检查 dts 时钟配置
声音失真或噪声 位深/槽位宽度不匹配 核对 slot_width 与 Codec 寄存器配置
声道反转 LRCK 极性配置错误 检查 set_fmt 中的 SND_SOC_DAIFMT_NB_NF 参数 ← 上一章 📖 返回目录 下一章 →