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)组成。长包用于传输像素数据,短包用于帧同步与行同步。
4.1.1 长包与短包
| 包类型 | 用途 | 结构 | 示例 |
|---|---|---|---|
| 长包(Long Packet) | 传输像素数据、嵌入式数据 | PH + 数据负载 + PF | RAW10 图像行数据 |
| 短包(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-Lane | 1.0 | 1.0 | 1080p@30fps RAW8 | 低 |
| 2-Lane | 1.5 | 3.0 | 4K@30fps RAW10 | 中 |
| 4-Lane | 2.0 | 8.0 | 4K@60fps RAW12 / 8K@30fps | 高 |
4.3 HS/LP 模式与状态切换
D-PHY 定义两种工作模式:高速模式(HS)用于数据传输,低功耗模式(LP)用于控制信号与省电。HS 模式下差分摆幅约 200mV,LP 模式下单端摆幅 1.2V。模式切换由 LP 状态序列控制。
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 工作流程
- PLL 锁定输入时钟,产生多相位时钟(通常 0°/90°/180°/270°)。
- 相位选择器根据数据跳变沿选择最佳采样相位。
- 数据采样器在时钟上升沿与下降沿各采样一次,恢复出 2 倍速数据流。
- 串并转换器将 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 驱动注册流程
| 步骤 | 函数/操作 | 说明 |
|---|---|---|
| 1 | devm_phy_create() | 创建 PHY 设备,绑定 phy_ops |
| 2 | phy_set_drvdata() | 设置私有数据(寄存器基址、时钟句柄等) |
| 3 | of_phy_provider_register() | 注册为 PHY 提供者,供 CSI 主机控制器查找 |
| 4 | phy_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 的解耦管理。