3. MIPI D-PHY 物理层:差分信号、高速模式与低功耗模式、时钟通道与数据通道

MIPI D-PHY 是摄像头与 SoC 之间最底层的物理传输接口,它定义了差分信号电气特性、两种工作模式(高速/低功耗)以及通道拓扑(时钟+数据)。理解 D-PHY 是理解 CSI 驱动中时序控制、电压切换和 Lane 管理的前提。

3.1 差分信号与电气特性

D-PHY 采用 低压差分信号(LVDS-like)传输,每个 Lane 由一对互为正负的走线组成:Dp(正极)和 Dn(负极)。接收端通过比较 Dp − Dn 的差值来恢复数据,而非对地电压。

参数高速模式 (HS)低功耗模式 (LP)
电压摆幅200 mV(差分峰峰值)1.2 V(单端)
共模电压200 mV0 V / 1.2 V
传输速率80 Mbps ~ 4.5 Gbps≤ 10 Mbps
信号类型差分对连续翻转单端电平编码
功耗高(驱动电流大)极低(CMOS 电平)
驱动设计要点: 差分信号对 PCB 走线等长要求极高(通常 ≤ 5 mil 偏差),否则会导致码间干扰(ISI)和眼图闭合。驱动初始化时需先等待 D-PHY 进入 HS 稳定状态(HS-Settle),再启动 DMA 传输。
避坑: 不要将 Dp/Dn 接反。虽然部分 PHY 支持极性翻转(通过寄存器配置),但默认情况下反接会导致数据全错,且 CRC 无法通过。

3.2 高速模式与低功耗模式

D-PHY 在两种模式间动态切换,驱动需要精确控制模式转换时序。

3.2.1 高速模式(HS)

  • 用途: 传输像素数据、帧头、行有效信号。
  • 电气: 差分对持续翻转,电流驱动,终端电阻 100 Ω。
  • 时序: 进入 HS 前需经历 HS-Prepare + HS-Zero 状态;退出时需经历 HS-Trail + LP-11 状态。

3.2.2 低功耗模式(LP)

  • 用途: 传输控制指令(如帧同步、行同步、Escape 命令)、总线空闲。
  • 电气: 单端 CMOS 电平,无需终端电阻。
  • 状态编码: LP-00、LP-01、LP-10、LP-11 四种组合,用于握手和总线周转(BTA)。
关键时序约束: 从 LP 切换到 HS 时,驱动必须保证 HS-Prepare 时间 ≥ 40 ns + 4 × UI,HS-Zero 时间 ≥ 100 ns + 10 × UI。若 DMA 提前启动,PHY 尚未锁定,将产生 CRC 错误。
D-PHY 模式切换状态机(HS ↔ LP) LP-11 空闲 HS-Prepare HS-Zero HS-Data HS-Trail 驱动需在 HS-Prepare 阶段禁止 DMA 请求,待 HS-Zero 完成后才允许数据 FIFO 写入

3.3 时钟通道与数据通道

D-PHY 采用 源同步时钟 架构:发送端(摄像头 Sensor)同时发送差分时钟和差分数据。接收端(SoC CSI)使用时钟通道的边沿来采样数据通道。

3.3.1 通道拓扑

  • 时钟通道(Clock Lane): 单向,从 Sensor 到 SoC。始终工作在 HS 模式(即使数据通道在 LP 状态,时钟也保持翻转)。
  • 数据通道(Data Lane): 单向(CSI-2)或双向(CCI)。每个通道独立进行 HS/LP 切换。
通道类型方向典型速率驱动关注点
Clock LaneSensor → SoC同数据速率 × 1/2(DDR)时钟恢复、抖动容限、HS 连续翻转
Data Lane 0Sensor → SoC同 Clock Lane像素数据、帧头、行同步
Data Lane 1~NSensor → SoC同 Clock Lane多通道拆分(Byte 交错)

3.3.2 多通道映射与 DMA 协同

当使用 2-Lane 或 4-Lane 时,Sensor 将像素数据按 Byte 交错分配到各 Data Lane。CSI 接收端需将各 Lane 数据重新对齐(Deskew),再送入 DMA Engine。

4-Lane D-PHY 通道架构与数据流 Camera Sensor Clock Lane Data Lane 0 Data Lane 1 Data Lane 2 Data Lane 3 CSI Receiver Deskew Byte Merge DMA Engine DMA 配置的 Line Stride 必须与合并后的 Byte 宽度对齐,否则产生数据错位

3.4 驱动初始化时序与 DMA 触发点

在 Linux 或 RTOS 驱动中,D-PHY 初始化通常按以下步骤进行:

  1. 配置 PHY 寄存器: 设置 HS 摆幅、终端电阻、LP 驱动强度。
  2. 使能 Clock Lane: 等待 Clock Lane 输出稳定(PLL Lock)。
  3. 使能 Data Lane: 进入 LP-11 状态,等待 Sensor 发送帧同步。
  4. 检测 HS 进入: 当检测到 HS-Prepare 时,启动 PHY 接收端。
  5. 触发 DMA: 在 HS-Zero 完成后,使能 DMA 请求,开始搬运数据。
代码片段:D-PHY 模式切换与 DMA 使能(伪代码)
// 等待 PHY 进入 HS 模式
while (!(phy_status & PHY_HS_READY)) {
    udelay(1);
}

// 配置 DMA 描述符
dma_desc->src_addr = csi_fifo_addr;
dma_desc->dst_addr = frame_buffer;
dma_desc->length   = line_width * lines_per_frame;

// 使能 DMA(必须在 HS-Zero 之后)
dma_enable(DMA_CHANNEL_0);

// 等待帧结束中断
while (!(csi_status & CSI_FRAME_END)) {
    // 轮询或等待中断
}

// 禁用 DMA
dma_disable(DMA_CHANNEL_0);
常见错误: 若在 HS-Prepare 阶段就使能 DMA,FIFO 中会混入无效数据,导致 CRC 错误和帧丢弃。务必在 HS-Zero 完成后(PHY 锁定)再启动 DMA。