4. CSI-2 协议分层模型:物理层、协议层(LLP)、应用层(像素/字节打包)

CSI-2(Camera Serial Interface 2)协议采用清晰的三层分层架构,将物理信号传输、数据包封装与图像语义处理解耦。理解这三层模型是驱动开发与调试的基础,也是后续配置 D-PHY 速率、解析 LLP 包头、处理像素格式的前提。

核心要点:CSI-2 的分层设计遵循 OSI 思想,物理层负责比特流传输,协议层(LLP)负责包结构定义与错误检测,应用层负责像素/字节的语义打包。驱动开发中,物理层对应 D-PHY 配置,协议层对应包解析与 CRC 校验,应用层对应格式转换与帧缓冲管理。
CSI-2 协议三层模型架构 应用层(Application Layer) 像素/字节打包:RAW8/10/12、YUV422、RGB565、JPEG 帧格式定义:帧起始码(FS)、帧结束码(FE)、行有效(LINE) 数据虚拟通道(VCx)与数据类型(DT)映射 协议层 / LLP(Low Level Protocol) 包结构:短包(8字节)与长包(包头+数据+包尾) ECC 纠错码(6位)与 CRC 校验(16位) 数据标识(DI):虚拟通道 ID + 数据类型 物理层(Physical Layer / D-PHY) 差分信号:时钟 Lane(DDR) + 数据 Lane(1~4 条) 低功耗模式(LP)与高速模式(HS)切换 速率范围:80 Mbps ~ 2.5 Gbps / Lane 驱动关注点:物理层 → D-PHY 速率/电压配置;协议层 → 包解析/ECC/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
LLP 长包结构解析 包头(PH) DI + WC + ECC 4 字节 数据负载(Payload) 像素数据:RAW/YUV/RGB/JPEG WC 字节(0~65535) 包尾(PF) CRC 校验 2 字节 LLP 包解析关键点 • DI 字段:高 2 位为虚拟通道 ID(VC0~VC3),低 6 位为数据类型(DT) • ECC 纠错:可纠正 1 位错误,检测 2 位错误,保护包头完整性 • CRC 校验:覆盖整个数据负载,接收端计算后与 PF 比较,不一致则丢弃该包 • 驱动中通过检查 ECC/CRC 错误计数器判断链路质量

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 错误计数,最后验证应用层像素格式是否正确。逐层排查可以快速定位问题根源。