2. MIPI CSI-2 物理层与协议层基础:D-PHY、C-PHY、Lane、Data Type、长包与短包格式
MIPI CSI-2 是摄像头与处理器之间最主流的图像传输接口。本章深入剖析其物理层(D-PHY / C-PHY)与协议层(长包/短包、Data Type)的核心机制,为后续 V4L2 驱动开发打下坚实的硬件协议基础。
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(三线) |
| 功耗 | 较低 | 略高,但带宽密度更高 |
| 适用场景 | 主流摄像头、中低带宽 | 高分辨率、高帧率旗舰 |
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),实现双倍数据速率。
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 长包格式(可变长度)
长包用于传输 图像像素数据、嵌入式数据、用户定义数据。格式分为三部分:包头、数据负载、包尾。
包头字段详解:
| 字段 | 宽度 | 说明 |
|---|---|---|
| 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 元数据) | 需厂商扩展驱动 |
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 总线。