2. CSI-2 数据流模型:像素数据包格式、长包与短包、虚拟通道与数据类型
MIPI CSI-2 协议定义了一套严格的分层数据流模型,确保从图像传感器到应用处理器的像素数据能够被准确、高效地传输。理解数据包格式、长包与短包的区别、虚拟通道的复用机制以及数据类型标识,是进行设备树 Lane 映射和 CSI 调试的基础。
2.1 CSI-2 协议分层架构
CSI-2 协议栈分为三层:应用层、协议层和物理层。物理层由 D-PHY 或 C-PHY 实现,负责比特流的串行传输;协议层负责数据包的封装、解封装、错误检测和虚拟通道管理;应用层则定义像素数据的格式和语义。
调试要点: 在设备树中配置的
data-lanes 和 clock-lanes 属于物理层映射,而 bus-type 和 remote-endpoint 则关联协议层的端点识别。两者必须匹配才能建立正确的数据流。
2.2 数据包格式:长包与短包
CSI-2 协议层定义了两种基本的数据包类型:长包 (Long Packet) 和 短包 (Short Packet)。所有传输都以数据包为单位进行。
2.2.1 长包 (Long Packet)
长包用于传输有效像素数据或嵌入式数据。其结构包含数据包头 (PH)、有效载荷 (Payload) 和数据包尾 (PF)。
| 字段 | 字节数 | 描述 |
|---|---|---|
| 数据标识 (DI) | 1 | 高 2 位为虚拟通道 ID (VC),低 6 位为数据类型 (DT) |
| 字计数 (WC) | 2 | 有效载荷的字节数 (16 位,小端序) |
| ECC | 1 | 对 DI 和 WC 的纠错码 (单比特纠错,双比特检测) |
| 有效载荷 | WC | 像素数据或嵌入式数据,按字节对齐 |
| 包尾 (PF) | 2 | CRC-16 校验码,覆盖整个有效载荷 |
调试技巧: 在逻辑分析仪抓取 CSI-2 数据时,首先检查 ECC 和 CRC 是否正确。ECC 错误通常指示物理层 Lane 映射或时钟问题;CRC 错误则可能指向协议层配置或传感器输出时序异常。
2.2.2 短包 (Short Packet)
短包只有 4 字节,没有有效载荷和 CRC。它主要用于传输帧同步、行同步或事件标记等控制信息。
| 字段 | 字节数 | 描述 |
|---|---|---|
| 数据标识 (DI) | 1 | VC + DT (短包的数据类型固定为 0x00-0x0F 范围) |
| 数据字段 | 2 | 16 位数据值,例如帧号、行计数或特定事件码 |
| ECC | 1 | 对 DI 和数据字段的纠错码 |
常见的短包数据类型包括:
- 帧开始 (Frame Start, FS):DT = 0x00,标记一帧图像的开始。
- 帧结束 (Frame End, FE):DT = 0x01,标记一帧图像的结束。
- 行开始 (Line Start, LS):DT = 0x02,标记一行像素的开始。
- 行结束 (Line End, LE):DT = 0x03,标记一行像素的结束。
2.3 虚拟通道 (Virtual Channel, VC)
虚拟通道机制允许在同一个 CSI-2 链路上传输最多 4 个独立的数据流。每个数据流通过数据标识 (DI) 字节的高 2 位进行区分,取值范围为 0-3。
虚拟通道的主要应用场景:
- 多传感器复用:多个图像传感器共享同一组 Lane,通过 VC 区分各自的数据流。
- 多数据流输出:单个传感器同时输出 RAW 图像和 YUV 缩略图,分别分配不同的 VC。
- 元数据通道:将传感器配置参数、统计信息等通过独立的 VC 传输,与主图像数据分离。
常见配置错误: 在设备树中,
remote-endpoint 节点通常只绑定一个 VC。如果传感器实际输出使用了多个 VC,但接收端只配置了 VC=0,则其他 VC 的数据会被丢弃,导致图像缺失或协议层解析错误。务必确认传感器数据手册中 VC 的分配策略。
2.4 数据类型 (Data Type, DT)
数据类型字段位于数据标识 (DI) 字节的低 6 位,用于标识有效载荷中数据的格式和语义。DT 值由 MIPI 联盟标准化,范围从 0x00 到 0x3F。
以下是嵌入式系统开发中常见的数据类型:
| DT 值 | 数据类型名称 | 描述 | 典型应用 |
|---|---|---|---|
| 0x00 | Frame Start | 帧开始短包 | 所有传感器 |
| 0x01 | Frame End | 帧结束短包 | 所有传感器 |
| 0x12 | RAW6 | 6 位原始 Bayer 数据 | 低端传感器 |
| 0x2A | RAW8 | 8 位原始 Bayer 数据 | 通用摄像头 |
| 0x2B | RAW10 | 10 位原始 Bayer 数据 | 高动态范围传感器 |
| 0x2C | RAW12 | 12 位原始 Bayer 数据 | 工业/医疗摄像头 |
| 0x1E | YUV422 8-bit | YUV 4:2:2 格式,每个分量 8 位 | 视频流 |
| 0x1F | YUV420 8-bit | YUV 4:2:0 格式,每个分量 8 位 | 视频压缩 |
| 0x30 | JPEG | JPEG 压缩图像数据 | 拍照模式 |
| 0x37 | User Defined 8-bit | 用户自定义数据类型 | 元数据/调试数据 |
设备树关联: 在 Linux 内核中,
media-ctl 工具通过 --set-v4l2 参数设置 pixelformat,该格式必须与传感器输出的 DT 值对应。例如,RAW10 对应 V4L2 像素格式 V4L2_PIX_FMT_SBGGR10。如果格式不匹配,应用层将无法正确解析像素数据。
2.5 数据流传输时序
一个完整的 CSI-2 数据流传输遵循严格的时序:
- 帧开始 (FS):发送短包,标记新帧的开始。
- 行传输:对于每一行,先发送行开始 (LS) 短包,然后发送包含像素数据的长包,最后发送行结束 (LE) 短包。
- 帧结束 (FE):发送短包,标记当前帧的结束。
- 消隐期 (Blank):在帧与帧之间或行与行之间,物理层进入 LP 模式或发送填充数据。
2.6 数据流模型与设备树配置的关联
在设备树中配置 CSI 接口时,以下属性直接对应本章的数据流模型概念:
| 设备树属性 | 对应数据流概念 | 配置说明 |
|---|---|---|
data-lanes |
物理层 Lane 映射 | 指定使用的 Lane 编号和顺序,必须与传感器输出一致 |
bus-type |
物理层协议类型 | 通常为 4 (CSI-2 D-PHY) 或 5 (CSI-2 C-PHY) |
remote-endpoint |
协议层端点绑定 | 连接发送端和接收端的端点,确保数据流方向正确 |
pixel-format |
应用层数据类型 (DT) | 在驱动中通过 V4L2 子设备接口设置,匹配传感器输出的 DT |
virtual-channel |
虚拟通道 (VC) | 部分驱动支持指定 VC 编号,用于多路复用场景 |
实战建议: 在调试初期,使用
media-ctl -p 命令查看当前 pipeline 的格式配置,确认每个节点的 pixelformat 和 width/height 是否与传感器规格书一致。如果出现“无图像”或“图像撕裂”,优先检查 DT 和 VC 的匹配性。