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(高速)模式的切换。以下是标准发送流程:
- LP → HS 模式切换: 发送端先进入高速模式,通过 SoT(Start of Transmission)序列同步时钟与数据 Lane。
- 发送包头: 依次发送 Data ID、Word Count、ECC。接收端在收到 ECC 后立即进行校验,若 ECC 错误则丢弃整个包。
- 发送数据负载: 按 Word Count 指定的字节数连续发送 Payload 数据。
- 发送校验尾: 发送 2 字节 Checksum,接收端计算 CRC 并与接收值比对。
- HS → LP 模式切换: 发送 EoTp(End of Transmission Packet)或直接进入 LP 模式。
驱动提示: 在 Linux DSI 驱动中,长包发送通常通过
mipi_dsi_dcs_write_buffer() 或 mipi_dsi_generic_write() 实现。驱动无需手动构造 ECC 和 Checksum,这些由 DSI 主机控制器硬件自动完成。
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)
- ECC 错误计数寄存器(ECC_ERR_CNT)
- CRC 错误计数寄存器(CRC_ERR_CNT)
- 超时状态寄存器(TIMEOUT_STAT)
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 时序参数。