4. CSI-2 协议层:长包格式、短包格式、数据类型
CSI-2 协议层位于 D-PHY 物理层之上,负责将图像传感器输出的像素数据封装为符合 MIPI 标准的包结构,并通过虚拟通道(Virtual Channel, VC)和数据类型(Data Type, DT)实现多路复用与传输控制。理解长包(Long Packet)与短包(Short Packet)的格式,以及 RAW、YUV、JPEG 等数据类型的编码规则,是驱动开发者配置 CSI 接收控制器与 DMA 引擎协同工作的基础。
4.1 包结构总览
CSI-2 传输的基本单元是包(Packet)。每个包由以下部分组成:
- 包首(Packet Header, PH):固定 4 字节,包含数据标识符(DI)、字计数(WC)和错误校正码(ECC)。
- 包数据(Packet Data):仅长包包含,长度由 WC 指定,单位为字节。
- 包尾(Packet Footer, PF):仅长包包含,固定 2 字节,为校验和(Checksum)。
4.2 短包格式(Short Packet)
短包长度为 4 字节,不包含数据负载。其结构如下:
| 字节偏移 | 位域 | 宽度(bit) | 描述 |
|---|---|---|---|
| 0 | Data ID | 8 | 高 2 位为虚拟通道 ID(VC),低 6 位为数据类型(DT) |
| 1 | Data Field 1 | 8 | 短包数据低 8 位 |
| 2 | Data Field 2 | 8 | 短包数据高 8 位 |
| 3 | ECC | 8 | 前 3 字节的错误校正码 |
短包的数据类型(DT)主要用于帧同步与行同步:
- 0x00:帧开始(Frame Start, FS)
- 0x01:帧结束(Frame End, FE)
- 0x02:行开始(Line Start, LS)
- 0x03:行结束(Line End, LE)
Data Field 1 和 Data Field 2 组合为一个 16 位值,在 FS/ FE 中表示帧序号,在 LS/ LE 中表示行序号。
4.3 长包格式(Long Packet)
长包用于传输像素数据,其结构包含首部、数据负载和尾部:
+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| Data ID | Word Count (低8位) | Word Count (高8位) | ECC | Data Byte 0 | Data Byte 1 | ... | Checksum (低8位) | Checksum (高8位) |
+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| <--- Packet Header (4 bytes) ---> | <--- Packet Data (WC bytes) ---> | <--- Packet Footer (2 bytes) ---> |
+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
各字段说明:
| 字段 | 长度 | 说明 |
|---|---|---|
| Data ID | 1 字节 | 高 2 位 VC,低 6 位 DT(数据类型) |
| Word Count (WC) | 2 字节 | 数据负载的字节数,范围 0~65535 |
| ECC | 1 字节 | 对 PH 前 3 字节的汉明码校验,可纠正 1 位错误 |
| Data | WC 字节 | 像素数据,按数据类型编码 |
| Checksum | 2 字节 | 对 Data 字段的 CRC-16 校验 |
4.4 数据类型(Data Type)详解
数据类型(DT)是 6 位字段,定义在 Data ID 的低 6 位。CSI-2 规范定义了多种图像格式,驱动开发中最常遇到的是 RAW 系列、YUV 系列和 JPEG 压缩数据。
4.4.1 RAW 系列(RAW8/10/12)
RAW 数据直接来自传感器像素阵列,每个像素对应一个原始值。位深决定了每个像素占用的比特数:
| 数据类型 | DT 值 | 像素位深 | 存储格式 | 每行字节数(1920 像素) |
|---|---|---|---|---|
| RAW8 | 0x2A | 8 bit | 1 像素 = 1 字节 | 1920 |
| RAW10 | 0x2B | 10 bit | 4 像素打包为 5 字节 | 2400 |
| RAW12 | 0x2C | 12 bit | 2 像素打包为 3 字节 | 2880 |
RAW10 和 RAW12 采用打包(Packed)格式以节省带宽。以 RAW10 为例,4 个像素(P0~P3)占用 5 字节:
Byte 0: P0[9:2] // 高 8 位
Byte 1: P1[9:2] // 高 8 位
Byte 2: P2[9:2] // 高 8 位
Byte 3: P3[9:2] // 高 8 位
Byte 4: P3[1:0] P2[1:0] P1[1:0] P0[1:0] // 4 个像素的低 2 位
4.4.2 YUV 系列
YUV 格式将亮度(Y)与色度(UV)分离,常见于视频传输。CSI-2 支持多种 YUV 采样格式:
| 数据类型 | DT 值 | 采样格式 | 每像素平均比特数 | 典型应用 |
|---|---|---|---|---|
| YUV420 8-bit | 0x1E | 4:2:0 | 12 bpp | 视频通话、监控 |
| YUV422 8-bit | 0x1E | 4:2:2 | 16 bpp | 高清视频、相机预览 |
| YUV444 8-bit | 0x24 | 4:4:4 | 24 bpp | 专业图像处理 |
YUV422 在 CSI-2 中通常以 UYVY 或 YUYV 交错顺序传输。例如 UYVY 顺序:
Byte 0: U0
Byte 1: Y0
Byte 2: V0
Byte 3: Y1
// 每 2 个像素共享 U/V 分量
4.4.3 JPEG 压缩数据
JPEG 数据在 CSI-2 中被视为一种用户定义数据类型(User Defined Data Type),DT 值为 0x37。与 RAW/YUV 不同,JPEG 数据是变长的,每个长包的 WC 值可能不同。
- 特点: 数据负载为 JPEG 码流,不包含像素对齐约束。
- 传输方式: 通常一帧 JPEG 图像由多个长包组成,每个包携带 JPEG 码流的一个片段。
- DMA 策略: 驱动需要为每个长包单独配置 DMA 传输,并将数据连续写入内存缓冲区,由 JPEG 解码器后续解析。
4.5 数据类型与 DMA 配置映射
不同的数据类型直接影响 DMA 引擎的配置参数。下表总结了关键映射关系:
| 数据类型 | 像素对齐 | DMA 数据宽度 | 突发长度建议 | 是否需要解包 |
|---|---|---|---|---|
| RAW8 | 1 字节 | 8/16/32 bit | 16 | 否 |
| RAW10 | 5 字节 | 32 bit + 8 bit | 8 | 是(软件解包) |
| RAW12 | 3 字节 | 16 bit + 8 bit | 8 | 是(软件解包) |
| YUV422 | 2 字节 | 16/32 bit | 16 | 否 |
| JPEG | 1 字节 | 32 bit | 32 | 否 |
4.6 协议层与 DMA 协同流程
下图展示了 CSI-2 协议层解析与 DMA 引擎之间的典型协同工作流程:
4.7 常见问题与避坑指南
- WC 解析错误: 如果 ECC 校验失败,不要信任 WC 值,应丢弃整个包并复位接收状态机。
- RAW10 解包性能: 在 ARM Cortex-A 系列上,软件解包 RAW10 每像素需要约 5~8 个周期。如果帧率要求高,建议使用 ISP 硬件解包或 NEON 指令优化。
- JPEG 变长包: 不要假设 JPEG 每包大小固定。DMA 描述符链表必须支持动态长度更新。
- 虚拟通道隔离: 多传感器场景下,每个 VC 的数据类型可能不同。DMA 引擎需要为每个 VC 分配独立的缓冲区。