4. CSI-2/DPHY 接口详解:MIPI CSI-2 协议、Lane 配置、HS/LP 模式、时钟与数据恢复、Linux 下的 PHY 驱动

MIPI CSI-2(Camera Serial Interface 2)是当前移动与嵌入式平台最主流的摄像头图像数据传输接口。它基于 MIPI D-PHY 物理层,采用差分串行传输,在极少的引脚数下实现 Gbps 级带宽。本章深入解析 CSI-2 协议栈、Lane 配置策略、HS/LP 模式切换机制、时钟数据恢复(CDR)原理,以及 Linux 内核中 PHY 驱动的实现框架。

4.1 MIPI CSI-2 协议分层与数据包结构

CSI-2 协议分为三层:应用层、协议层、物理层。物理层由 D-PHY 实现,协议层定义数据包格式,应用层承载像素数据与元数据。

关键概念: CSI-2 使用“小数据包”传输,每个包由 32 位包头(PH)、可变长度数据负载、16 位包尾校验(ECC/CRC)组成。长包用于传输像素数据,短包用于帧同步与行同步。
CSI-2 协议分层与数据包结构 应用层(Application Layer) 像素格式转换、元数据封装、帧/行同步信号生成 协议层(Protocol Layer) 长包/短包封装、ECC 生成与校验、CRC 校验、虚拟通道 物理层(D-PHY Layer) 差分信号驱动、HS/LP 模式切换、时钟 Lane 与数据 Lane 管理 PH(4B) 数据负载(可变长度) PF(2B) 包头部:虚拟通道 ID、数据类型、字计数、ECC 像素数据 / 嵌入式数据 包尾部:CRC 校验

4.1.1 长包与短包

包类型用途结构示例
长包(Long Packet)传输像素数据、嵌入式数据PH + 数据负载 + PFRAW10 图像行数据
短包(Short Packet)帧同步、行同步、帧计数仅 PH(无负载与 PF)帧开始(FS)、帧结束(FE)、行开始(LS)

4.2 Lane 配置与带宽计算

CSI-2 支持 1/2/3/4 条数据 Lane,每条 Lane 独立传输数据位。时钟 Lane 提供 DDR 时钟,数据 Lane 在时钟双边沿采样。Lane 配置直接影响最大带宽与 PCB 布线复杂度。

工程经验: 4-Lane 配置下,单条 Lane 速率 1.5 Gbps 时,总带宽可达 6 Gbps,足以支持 4K@60fps 的 RAW12 数据流。实际项目中需预留 20% 带宽余量用于协议开销与 ECC/CRC。

4.2.1 带宽计算公式

总带宽 = Lane 数 × 单 Lane 速率(Gbps)
有效像素带宽 = 总带宽 × (8 / 像素位深) × (1 - 协议开销比例)
协议开销 ≈ 12% ~ 15%(含 PH、PF、LP 间隔)

4.2.2 常见 Lane 配置对比

Lane 数典型速率(Gbps/Lane)总带宽(Gbps)适用分辨率PCB 复杂度
1-Lane1.01.01080p@30fps RAW8低
2-Lane1.53.04K@30fps RAW10中
4-Lane2.08.04K@60fps RAW12 / 8K@30fps高

4.3 HS/LP 模式与状态切换

D-PHY 定义两种工作模式:高速模式(HS)用于数据传输,低功耗模式(LP)用于控制信号与省电。HS 模式下差分摆幅约 200mV,LP 模式下单端摆幅 1.2V。模式切换由 LP 状态序列控制。

D-PHY HS/LP 模式状态机 LP-11(停等) HS 预备 HS 传输 LP 停止 LP-11 → LP-01 → LP-00 SoT 序列 EoT 序列 LP-00 → LP-10 → LP-11

4.3.1 模式切换时序关键点

  • SoT(Start of Transmission): LP-11 → LP-01 → LP-00 → HS-0 序列,进入 HS 模式。
  • EoT(End of Transmission): HS 模式结束后,驱动进入 LP-11 状态,完成一次 HS 突发。
  • LP 间隔: 每帧或每行之间插入 LP 状态,用于省电与同步恢复。

4.4 时钟与数据恢复(CDR)

D-PHY 使用源同步时钟架构:发送端提供 DDR 时钟,接收端利用 PLL/DLL 对时钟进行相位调整,在时钟双边沿捕获数据。CDR 的关键指标是 建立时间(t_setup) 与 保持时间(t_hold),它们决定了数据眼图的裕量。

常见问题: 当 PCB 走线长度不匹配导致 Lane 间 skew 超过 0.2 UI 时,接收端 CDR 可能锁定失败,表现为图像花屏或帧丢失。解决方法是等长布线(误差 < 5mm)或使用 PHY 内置的 deskew 校准。

4.4.1 CDR 工作流程

  1. PLL 锁定输入时钟,产生多相位时钟(通常 0°/90°/180°/270°)。
  2. 相位选择器根据数据跳变沿选择最佳采样相位。
  3. 数据采样器在时钟上升沿与下降沿各采样一次,恢复出 2 倍速数据流。
  4. 串并转换器将 2 位并行数据转换为字节流,送入协议层解析。

4.5 Linux 下的 PHY 驱动

Linux 内核中,MIPI D-PHY 驱动位于 drivers/phy/ 目录,遵循通用 PHY 框架(Generic PHY Framework)。驱动需要实现 phy_ops 结构体中的初始化、电源管理、速率配置等回调函数。

4.5.1 核心数据结构

struct phy_ops {
    int (*init)(struct phy *phy);
    int (*exit)(struct phy *phy);
    int (*power_on)(struct phy *phy);
    int (*power_off)(struct phy *phy);
    int (*set_mode)(struct phy *phy, enum phy_mode mode, int submode);
    int (*set_speed)(struct phy *phy, unsigned long speed);
};

4.5.2 驱动注册流程

步骤函数/操作说明
1devm_phy_create()创建 PHY 设备,绑定 phy_ops
2phy_set_drvdata()设置私有数据(寄存器基址、时钟句柄等)
3of_phy_provider_register()注册为 PHY 提供者,供 CSI 主机控制器查找
4phy_init() / phy_power_on()由 CSI 主机控制器在启动流时调用

4.5.3 设备树绑定示例

dphy0: dphy@ff470000 {
    compatible = "rockchip,rk3399-dphy";
    reg = <0x0 0xff470000 0x0 0x1000>;
    clocks = <&cru SCLK_DPHY0_CFG>;
    clock-names = "pclk";
    #phy-cells = <0>;
    status = "disabled";
};

csi2_host: csi2@ff4c0000 {
    compatible = "rockchip,rk3399-csi2";
    reg = <0x0 0xff4c0000 0x0 0x4000>;
    phys = <&dphy0>;
    phy-names = "dphy";
    status = "disabled";
};
调优要点: PHY 驱动中 set_speed 回调需根据目标速率配置 PLL 倍频系数与分频器,同时调整预加重(Pre-emphasis)与均衡(Equalization)参数以优化信号完整性。建议在 probe 阶段读取 phy-params 属性获取 Lane 数与速率。

4.6 本章小结

  • CSI-2 协议层通过长包/短包实现像素数据与同步信号的可靠传输,ECC/CRC 保证链路完整性。
  • Lane 配置需平衡带宽需求与硬件成本,4-Lane 是高性能 ISP 系统的首选。
  • HS/LP 模式切换由 LP 状态序列控制,SoT/EoT 时序必须严格满足 D-PHY 规范。
  • CDR 模块的相位选择与 deskew 校准是高速传输稳定性的关键。
  • Linux PHY 驱动通过通用框架与设备树绑定,实现 CSI 主机控制器与 D-PHY 的解耦管理。