4. CSI-2 协议分层模型:物理层、协议层(LLP)、应用层(像素/字节打包)
CSI-2(Camera Serial Interface 2)协议采用清晰的三层分层架构,将物理信号传输、数据包封装与图像语义处理解耦。理解这三层模型是驱动开发与调试的基础,也是后续配置 D-PHY 速率、解析 LLP 包头、处理像素格式的前提。
核心要点:CSI-2 的分层设计遵循 OSI 思想,物理层负责比特流传输,协议层(LLP)负责包结构定义与错误检测,应用层负责像素/字节的语义打包。驱动开发中,物理层对应 D-PHY 配置,协议层对应包解析与 CRC 校验,应用层对应格式转换与帧缓冲管理。
4.1 物理层(D-PHY)
CSI-2 物理层基于 MIPI D-PHY 标准,采用差分信号传输,包含一个时钟 Lane 和 1~4 条数据 Lane。物理层负责将协议层的包数据编码为高速串行比特流,并在接收端完成时钟恢复与数据采样。
| 参数 | 说明 | 典型值 |
|---|---|---|
| 时钟 Lane | DDR 双沿采样,提供位时钟 | 200 MHz ~ 1 GHz |
| 数据 Lane | 每 Lane 独立传输,可配置 1/2/4 条 | 4 Lane 常见于 1080p@60 |
| HS 模式速率 | 高速模式下每 Lane 数据率 | 80 Mbps ~ 2.5 Gbps |
| LP 模式 | 低功耗控制信号,用于握手与电源管理 | ~10 Mbps |
| 电压摆幅 | HS 模式下差分电压 | 200 mV ~ 400 mV |
驱动开发提示:物理层配置通常在设备树中完成,包括 Lane 数、连续时钟模式、HS 速率等。错误配置会导致链路不稳定,表现为帧错位或 CRC 错误。建议在 probe 阶段读取 D-PHY 状态寄存器确认锁定状态。
4.2 协议层(LLP - Low Level Protocol)
LLP 层定义了 CSI-2 的数据包结构,包括短包(Short Packet)和长包(Long Packet)两种类型。所有包都包含数据标识(DI)、ECC 校验码,长包额外包含 CRC 校验。
4.2.1 短包结构(8 字节)
短包用于传输帧起始(FS)、帧结束(FE)、行起始(LS)等控制信息,不携带像素数据。
| 字节偏移 | 字段 | 位宽 | 说明 |
|---|---|---|---|
| 0 | DI(Data Identifier) | 8 bit | VC[1:0] + DT[5:0] |
| 1 | WC(Word Count)低字节 | 8 bit | 短包中固定为 0x00 |
| 2 | WC 高字节 | 8 bit | 短包中固定为 0x00 |
| 3 | ECC | 8 bit | 6 位纠错码 + 2 位填充 |
| 4~7 | 数据负载 | 32 bit | 帧号、行号等控制信息 |
4.2.2 长包结构(包头 4 字节 + 数据 + 包尾 2 字节)
长包用于传输像素数据,包含包头(PH)、数据负载和包尾(PF)。
| 部分 | 字段 | 位宽 | 说明 |
|---|---|---|---|
| 包头(PH) | DI | 8 bit | VC + DT |
| WC(Word Count) | 16 bit | 数据负载字节数(0~65535) | |
| ECC | 8 bit | 对 PH 前 3 字节的纠错码 | |
| 包头共 4 字节 | |||
| 数据负载 | 像素数据 | WC 字节 | 按 DT 格式打包的像素 |
| 包尾(PF) | CRC 低字节 | 8 bit | 对数据负载的 16 位 CRC |
| CRC 高字节 | 8 bit | 多项式:x¹⁶ + x¹² + x⁵ + 1 | |
4.3 应用层(像素/字节打包)
应用层负责将传感器输出的原始像素数据按照特定格式打包成字节流,并插入帧/行同步标记。数据类型(DT)字段决定了应用层如何解释数据负载中的字节序列。
4.3.1 常见数据类型(DT)
| DT 值(Hex) | 格式名称 | 每像素位数 | 典型应用 |
|---|---|---|---|
| 0x2A | RAW8 | 8 | 低端摄像头、灰度图像 |
| 0x2B | RAW10 | 10 | 手机摄像头、ISP 输入 |
| 0x2C | RAW12 | 12 | 工业相机、医疗成像 |
| 0x1E | YUV422 8-bit | 16 | 视频流、预览 |
| 0x24 | RGB565 | 16 | 显示缓冲、GUI |
| 0x40 | JPEG | 可变 | 压缩图像传输 |
4.3.2 像素打包示例:RAW10
RAW10 格式每像素占用 10 位,4 个像素打包为 5 字节(40 位)。这种打包方式在驱动中需要特殊处理,不能直接按字节对齐读取。
/* RAW10 打包示例:4 像素 → 5 字节 */
/* 像素 P0[9:0], P1[9:0], P2[9:0], P3[9:0] */
Byte[0] = P0[9:2] /* P0 高 8 位 */
Byte[1] = P1[9:2] /* P1 高 8 位 */
Byte[2] = P2[9:2] /* P2 高 8 位 */
Byte[3] = P3[9:2] /* P3 高 8 位 */
Byte[4] = (P0[1:0] << 6) | (P1[1:0] << 4) |
(P2[1:0] << 2) | P3[1:0] /* 4 像素低 2 位拼接 */
常见陷阱:RAW10/RAW12 的非字节对齐打包是驱动开发中容易出错的地方。如果直接按 8 位字节读取并传递给 V4L2,会导致图像错位。必须在驱动中实现 unpack 函数,将打包数据转换为标准格式(如 RAW16)再提交到帧缓冲。
4.4 三层模型在驱动中的映射
在 Linux 内核 V4L2 子系统中,CSI-2 三层模型对应不同的驱动模块:
| CSI-2 层 | V4L2 驱动组件 | 关键操作 |
|---|---|---|
| 物理层 | PHY 驱动 / 时钟控制器 | 配置 D-PHY 速率、Lane 数、HS/LP 切换 |
| 协议层(LLP) | CSI-2 接收器驱动(如 Cadence、Synopsys IP) | 解析包头、校验 ECC/CRC、提取 VC/DT |
| 应用层 | Sensor 驱动 + V4L2 子设备 | 设置像素格式、帧尺寸、打包/解包 |
实践建议:调试 CSI-2 链路时,建议从物理层开始排查:先确认 D-PHY 是否锁定(检查 PLL 锁定寄存器),再检查 LLP 层 ECC/CRC 错误计数,最后验证应用层像素格式是否正确。逐层排查可以快速定位问题根源。