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 中表示行序号。

驱动提示: CSI 接收控制器通常通过检测 FS/ FE 短包来触发 DMA 传输的开始与结束。如果短包 ECC 校验失败,控制器应丢弃当前帧并等待下一个 FS。

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 校验
DMA 协同要点: 长包的 WC 字段直接决定了 DMA 需要搬运的数据量。驱动在解析 PH 后,应将 WC 值写入 DMA 控制器的传输长度寄存器,确保 DMA 在收到恰好 WC 字节后产生完成中断,避免数据错位。

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 位
DMA 对齐要求: RAW10 每 5 字节对齐,RAW12 每 3 字节对齐。DMA 控制器的地址对齐和突发传输长度必须适配这些非 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 解码器后续解析。
性能优化: JPEG 传输时,DMA 应使用 scatter-gather 模式,将多个长包的数据直接链接到预分配的环形缓冲区,避免 CPU 逐包拷贝。

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 引擎之间的典型协同工作流程:

CSI-2 协议层与 DMA 协同流程图 CSI-2 协议层与 DMA 协同流程 D-PHY 接收字节流 解析 Packet Header 判断 DT 短包 (FS/FE/LS/LE) 长包 (像素数据) 更新帧/行状态机 配置 DMA 传输 帧开始触发 DMA 使能 DMA 传输完成中断 校验 Checksum / 准备下一包 短包不触发 DMA 数据搬运 仅用于同步控制

4.7 常见问题与避坑指南

  • WC 解析错误: 如果 ECC 校验失败,不要信任 WC 值,应丢弃整个包并复位接收状态机。
  • RAW10 解包性能: 在 ARM Cortex-A 系列上,软件解包 RAW10 每像素需要约 5~8 个周期。如果帧率要求高,建议使用 ISP 硬件解包或 NEON 指令优化。
  • JPEG 变长包: 不要假设 JPEG 每包大小固定。DMA 描述符链表必须支持动态长度更新。
  • 虚拟通道隔离: 多传感器场景下,每个 VC 的数据类型可能不同。DMA 引擎需要为每个 VC 分配独立的缓冲区。
总结: CSI-2 协议层通过短包实现帧/行同步,通过长包承载像素数据。数据类型决定了像素编码格式和 DMA 配置参数。驱动开发者必须准确解析包首、提取 WC 和 DT,并将这些信息正确传递给 DMA 引擎,才能实现高效、无差错的图像数据传输。