3. 长包传输流程:数据包发送序列与 EoTp 机制

在 MIPI DSI 协议中,长包(Long Packet)用于传输大块数据,如视频帧、图像数据或大量命令参数。与短包不同,长包包含数据负载(Payload)和完整的校验机制。本章深入解析长包的发送序列、数据包结构以及 EoTp(End of Transmission Packet)机制,帮助驱动开发者理解底层传输时序与校验逻辑。

3.1 长包数据包结构

一个完整的 MIPI DSI 长包由以下部分组成:

字段 长度(字节) 说明
Data ID (DI) 1 包含虚拟通道号(VC)与数据类型(DT)
Word Count (WC) 2 数据负载的字节数(小端序)
ECC 1 对 DI + WC 的纠错码(单比特纠错,双比特检测)
Data Payload 0~65535 实际传输的数据内容
Checksum 2 对 Payload 的 16 位 CRC 校验
关键点: ECC 保护包头(DI + WC),Checksum 保护数据负载。两者独立校验,确保传输可靠性。

3.2 长包发送序列

长包的发送遵循严格的时序序列,包括 LP(低功耗)模式与 HS(高速)模式的切换。以下是标准发送流程:

  1. LP → HS 模式切换: 发送端先进入高速模式,通过 SoT(Start of Transmission)序列同步时钟与数据 Lane。
  2. 发送包头: 依次发送 Data ID、Word Count、ECC。接收端在收到 ECC 后立即进行校验,若 ECC 错误则丢弃整个包。
  3. 发送数据负载: 按 Word Count 指定的字节数连续发送 Payload 数据。
  4. 发送校验尾: 发送 2 字节 Checksum,接收端计算 CRC 并与接收值比对。
  5. HS → LP 模式切换: 发送 EoTp(End of Transmission Packet)或直接进入 LP 模式。
驱动提示: 在 Linux DSI 驱动中,长包发送通常通过 mipi_dsi_dcs_write_buffer() 或 mipi_dsi_generic_write() 实现。驱动无需手动构造 ECC 和 Checksum,这些由 DSI 主机控制器硬件自动完成。
长包发送序列流程图 长包发送序列流程图 LP → HS 切换 发送包头 发送 Payload 发送 Checksum HS → LP 切换 EoTp 可在 HS→LP 切换前发送,也可直接进入 LP 模式(取决于主机控制器配置)

3.3 EoTp(End of Transmission Packet)机制

EoTp 是 MIPI DSI 协议中用于标记传输结束的特殊包。它通常由主机控制器在长包或短包传输完成后发送,用于通知接收端数据发送完毕,并触发 HS 模式到 LP 模式的切换。

3.3.1 EoTp 的作用

  • 明确传输结束: 接收端通过检测 EoTp 确认当前传输已完成,避免因数据截断导致解析错误。
  • 模式切换同步: EoTp 为 HS→LP 切换提供明确的时序参考点,确保接收端在正确时刻退出高速模式。
  • 错误检测辅助: 若接收端在预期位置未收到 EoTp,可判定传输异常并触发错误恢复流程。

3.3.2 EoTp 的格式

EoTp 是一个特殊的短包,其 Data Type 固定为 0x08(EoTp)。它不包含数据负载,仅由 Data ID 和 ECC 组成:

字段 值 说明
Data ID VC + 0x08 虚拟通道号(VC)与 EoTp 类型组合
ECC 由 Data ID 计算 单比特纠错码
注意: 并非所有 DSI 主机控制器都强制发送 EoTp。部分控制器在长包传输后直接进入 LP 模式,此时 EoTp 可省略。驱动开发时需查阅芯片手册确认 EoTp 的使能配置。

3.4 长包校验机制

长包的校验分为两个独立阶段:

3.4.1 ECC 校验(包头保护)

ECC 覆盖 Data ID 和 Word Count 共 3 字节。MIPI DSI 使用汉明码(Hamming Code)实现单比特纠错和双比特检测。ECC 计算由硬件自动完成,驱动开发者通常无需干预。

3.4.2 CRC 校验(数据负载保护)

Checksum 字段使用 16 位 CRC(Cyclic Redundancy Check)算法,多项式为 x^16 + x^12 + x^5 + 1(标准 CRC-16-CCITT)。接收端对 Payload 计算 CRC 并与接收值比较,若不一致则丢弃数据包。

驱动调试技巧: 若在调试中发现长包传输失败,可检查以下寄存器:
- ECC 错误计数寄存器(ECC_ERR_CNT)
- CRC 错误计数寄存器(CRC_ERR_CNT)
- 超时状态寄存器(TIMEOUT_STAT)
长包校验机制架构图 长包校验机制架构图 发送端(Host) 构造包头 + ECC 构造 Payload + CRC 传输通道 D-PHY 高速信号 可能引入比特错误 接收端(Device) 校验 ECC → 纠错/丢弃 校验 CRC → 丢弃/确认 ECC 保护包头(3 字节),CRC 保护 Payload(最多 65535 字节) 两者独立工作,任一校验失败都会导致数据包被丢弃

3.5 长包传输时序参数

在驱动配置中,长包传输涉及以下关键时序参数:

参数 描述 典型值
THS-PREPARE HS 模式准备时间 40 ns ~ 100 ns
THS-ZERO HS 模式建立时间 100 ns ~ 300 ns
THS-TRAIL HS 模式结束拖尾时间 60 ns ~ 200 ns
TEOT EoTp 发送时间(若使能) 1 个短包周期
配置建议: 在 Linux DSI 驱动中,这些时序参数通常在设备树(Device Tree)中通过 dsi-host 节点下的 clock-names 和 phy-timing 属性配置。错误的时序设置可能导致长包传输失败或显示异常。

3.6 长包传输常见问题与排查

  • ECC 错误频繁: 检查 D-PHY 信号质量,确认时钟 Lane 和数据 Lane 的 skew 是否在允许范围内。
  • CRC 校验失败: 确认 Payload 长度与 Word Count 一致,检查数据负载是否被意外截断。
  • EoTp 未收到: 确认主机控制器是否使能了 EoTp 发送,检查接收端是否支持 EoTp 检测。
  • HS→LP 切换失败: 检查 THS-TRAIL 时序是否满足接收端要求,尝试调整 D-PHY 时序参数。