2. MIPI CSI-2 物理层与协议层基础:D-PHY、C-PHY、Lane、Data Type、长包与短包格式

MIPI CSI-2 是摄像头与处理器之间最主流的图像传输接口。本章深入剖析其物理层(D-PHY / C-PHY)与协议层(长包/短包、Data Type)的核心机制,为后续 V4L2 驱动开发打下坚实的硬件协议基础。

学习目标:理解 D-PHY 与 C-PHY 的差分信号原理、Lane 配置与同步机制、Data Type 的映射关系,以及长包与短包的字节级格式。

2.1 物理层:D-PHY 与 C-PHY

MIPI CSI-2 物理层定义了数据在物理线缆上的传输方式。目前主流方案为 D-PHY(1.2 / 1.4),而 C-PHY(1.0 / 1.1)在高端移动 SoC 中逐渐普及。

特性 D-PHY (1.2) C-PHY (1.1)
信号线 差分对(Dp / Dn),每 Lane 2 线 三线(A / B / C),每 Trio 3 线
时钟 独立差分时钟 Lane 无独立时钟,数据嵌入时钟
每 Lane 速率 最高 2.5 Gbps(DDR) 最高 5.7 Gbps(每 Trio)
信号摆幅 200 mV(差分) 300 mV(三线)
功耗 较低 略高,但带宽密度更高
适用场景 主流摄像头、中低带宽 高分辨率、高帧率旗舰
驱动开发提示:在设备树中,D-PHY 通常通过 phy-names = "csi-dphy" 引用;C-PHY 则需要额外配置 mipi-cphy-mode 属性。确认 SoC 的 CSI 控制器是否同时支持两种 PHY 模式。

2.1.1 D-PHY 差分信号与 Lane 结构

D-PHY 使用 差分信号(Dp - Dn)传输数据,抗共模干扰能力强。每个 Lane 包含一对差分线,外加一个独立的差分时钟 Lane。数据 Lane 在时钟的上升沿和下降沿各采样一次(DDR),实现双倍数据速率。

D-PHY 4-Lane 连接示意图 发送端 Sensor / AP 接收端 CSI 控制器 时钟 Lane (CLKp / CLKn) Data Lane 0 (Dp0 / Dn0) Data Lane 1 (Dp1 / Dn1) Data Lane 2 (Dp2 / Dn2) Data Lane 3 (Dp3 / Dn3) 每个数据 Lane 独立传输字节流,接收端通过 Lane 同步头对齐

2.1.2 C-PHY 三线编码

C-PHY 使用 三线(A / B / C) 传输数据,每 Trio 可同时传输 2.28 bit/UI(符号)。三线状态机在 6 种合法状态间跳转,每个跳变携带 2.28 bit 信息,无需独立时钟线。

  • 优势:无时钟 Lane,节省引脚;带宽密度高(每 Trio 等效 5.7 Gbps)。
  • 劣势:接收端需要 CDR(时钟数据恢复)电路,功耗略高。
  • 驱动适配:V4L2 子设备中通过 V4L2_MBUS_CSI2_CPHY 标志位声明。

2.2 协议层:Lane 映射与同步

无论使用 D-PHY 还是 C-PHY,CSI-2 协议层将图像数据拆分为 字节流,并分配到多个 Lane 上传输。接收端必须根据 Lane 同步序列 重新对齐字节。

2.2.1 Lane 分配与去偏斜

发送端将 8-bit 数据按 轮询方式 分配到各 Lane:

// 假设 4-Lane 配置,字节序列 B0, B1, B2, B3, B4, B5, B6, B7 ...
Lane 0: B0, B4, B8, B12, ...
Lane 1: B1, B5, B9, B13, ...
Lane 2: B2, B6, B10, B14, ...
Lane 3: B3, B7, B11, B15, ...

接收端通过检测 同步短包(Sync Short Packet) 中的固定模式(0xB8 / 0xE0)来对齐各 Lane 的起始位置,消除 PCB 走线长度差异导致的 skew(偏斜)。

常见问题:如果设备树中 data-lanes 属性配置的 Lane 数量与传感器实际输出不匹配,接收端将无法正确同步,导致图像撕裂或完全无数据。务必核对传感器数据手册与 SoC CSI 控制器的 Lane 映射。

2.3 长包与短包格式

CSI-2 协议定义了两种包类型:短包(Short Packet) 和 长包(Long Packet)。所有包都在数据 Lane 上传输,时钟 Lane(D-PHY)或嵌入时钟(C-PHY)提供位同步。

2.3.1 短包格式(4 字节)

短包用于传输 帧同步、行同步、事件标记 等控制信息,不携带图像数据。

字节偏移 字段 宽度 说明
0 Data ID 8 bit 高 2 位 = Virtual Channel (VC),低 6 位 = Data Type (DT)
1 Short Data 0 8 bit 低字节数据(如帧号低 8 位)
2 Short Data 1 8 bit 高字节数据(如帧号高 8 位)
3 ECC 8 bit 前 3 字节的纠错码(汉明码)

常见短包 Data Type:

  • 0x00:帧起始(Frame Start, FS)
  • 0x01:帧结束(Frame End, FE)
  • 0x02:行起始(Line Start, LS)
  • 0x03:行结束(Line End, LE)

2.3.2 长包格式(可变长度)

长包用于传输 图像像素数据、嵌入式数据、用户定义数据。格式分为三部分:包头、数据负载、包尾。

CSI-2 长包格式结构 包头 4 字节 Data ID + WC + ECC 数据负载 Word Count 字节(像素数据 / 嵌入式数据) 长度由包头中的 WC 字段指定 包尾 2 字节 CRC16 校验 长包必须按字节对齐,数据负载长度必须是 2 的倍数(填充字节 0x00) CRC16 覆盖从 Data ID 到负载最后一个字节

包头字段详解:

字段 宽度 说明
Data ID 8 bit 高 2 位 = Virtual Channel (VC),低 6 位 = Data Type (DT)
Word Count (WC) 16 bit 数据负载的字节数(不包括包头和包尾)
ECC 8 bit 对 Data ID + WC 的汉明码纠错

2.4 Data Type 详解

Data Type(DT)是 CSI-2 协议的核心字段,它告诉接收端当前长包中携带的数据格式。V4L2 驱动通过 DT 来配置 pixelformat 和 colorspace。

DT 值(Hex) 格式名称 描述 V4L2 像素格式
0x1E YUV420 8-bit YCbCr 4:2:0,8 位每分量 V4L2_PIX_FMT_NV12 / V4L2_PIX_FMT_YUV420
0x1F YUV420 10-bit YCbCr 4:2:0,10 位每分量 V4L2_PIX_FMT_NV12_10 / V4L2_PIX_FMT_YUV420_10
0x24 RGB888 RGB 8-8-8,24 位每像素 V4L2_PIX_FMT_RGB24
0x2A RAW8 Bayer 原始数据,8 位 V4L2_PIX_FMT_SBGGR8 / V4L2_PIX_FMT_SGBRG8 等
0x2B RAW10 Bayer 原始数据,10 位 V4L2_PIX_FMT_SBGGR10 / V4L2_PIX_FMT_SGBRG10 等
0x2C RAW12 Bayer 原始数据,12 位 V4L2_PIX_FMT_SBGGR12 / V4L2_PIX_FMT_SGBRG12 等
0x37 JPEG JPEG 压缩图像数据 V4L2_PIX_FMT_JPEG
0x3C ~ 0x3F 用户定义 厂商自定义数据(如 HDR 元数据) 需厂商扩展驱动
驱动开发关键:当传感器输出 JPEG 数据时,DT 必须为 0x37。V4L2 驱动在 s_fmt 回调中根据 DT 设置 fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG。如果 DT 与像素格式不匹配,接收端可能无法正确解码。

2.5 虚拟通道(Virtual Channel)

CSI-2 支持最多 4 个虚拟通道(VC0 ~ VC3),通过 Data ID 的高 2 位标识。多摄像头场景下,多个传感器可以共享同一组数据 Lane,通过 VC 区分数据流。

// 设备树中配置虚拟通道映射示例
&csi0 {
    port {
        csi0_ep: endpoint {
            remote-endpoint = &sensor_out;
            data-lanes = <1 2 3 4>;
            // 虚拟通道 0 对应主摄像头
            // 虚拟通道 1 对应深度传感器
        };
    };
};

V4L2 驱动通过 v4l2_subdev_call(sd, pad, set_routing, ...) 设置 VC 路由,将不同 VC 的数据流分发到不同的 video 节点。

2.6 本章小结

  • 物理层:D-PHY 使用差分对 + 独立时钟,C-PHY 使用三线嵌入时钟,两者在设备树和 V4L2 子设备中通过不同标志位区分。
  • Lane 同步:接收端通过同步短包对齐多 Lane 数据,去偏斜是驱动初始化的重要步骤。
  • 包格式:短包(4 字节)用于帧/行同步;长包(包头 + 负载 + CRC)用于传输像素数据。
  • Data Type:DT 字段直接映射到 V4L2 像素格式,JPEG 对应 DT 0x37。
  • 虚拟通道:支持多路复用,适合多摄像头共享 CSI 总线。