2. 长包与短包概念
在 MIPI DSI 协议中,数据包是主机(Host)与外设(Peripheral)之间信息交换的基本单元。根据包的长度和格式,DSI 协议将数据包分为长包(Long Packet)和短包(Short Packet)两种类型。理解这两种包的格式定义、区分方法及用途,是掌握 DSI 驱动开发的基础。
2.1 短包格式定义
短包是 DSI 协议中最简洁的数据包格式,固定为 4 字节长度。它主要用于传输命令、控制信息和同步信号,不携带大量像素数据。
短包结构(4 字节):
字节 0: 数据标识符 (DI) —— 包含虚拟通道 ID (VC) 和数据类型 (DT)
字节 1: 数据低字节 (Data Low Byte)
字节 2: 数据高字节 (Data High Byte)
字节 3: 错误校验码 (ECC) —— 对前 3 个字节进行校验
短包各字段说明:
| 字段 | 位宽 | 描述 |
|---|---|---|
| VC (Virtual Channel) | 2 bits | 虚拟通道标识,支持 4 个独立通道(0~3) |
| DT (Data Type) | 6 bits | 数据类型,决定包的具体用途(如命令、同步、应答) |
| Data Low/High | 16 bits | 2 字节数据负载,用于传递命令参数或状态信息 |
| ECC | 8 bits | 单比特纠错、双比特检错码,保护 DI 和 2 字节数据 |
驱动开发提示:短包的 ECC 校验由硬件自动生成和检查,驱动开发者通常只需关注 DI 字段中的 VC 和 DT 配置。ECC 错误会导致包被丢弃,驱动应通过中断状态寄存器监控 ECC 错误计数。
2.2 长包格式定义
长包是 DSI 协议中用于传输大量数据的包格式,长度可变。它由 4 字节包头、可变长度数据负载和 2 字节包尾组成。长包主要用于传输显示像素数据、大块命令参数或固件更新数据。
长包结构:
包头 (4 字节):
- 字节 0: 数据标识符 (DI) —— VC + DT
- 字节 1: 数据长度低字节 (WC_L)
- 字节 2: 数据长度高字节 (WC_H)
- 字节 3: 错误校验码 (ECC)
数据负载 (0~65535 字节):
- 实际传输的数据内容
包尾 (2 字节):
- 字节 0: 校验和低字节 (CS_L)
- 字节 1: 校验和高字节 (CS_H)
长包各字段说明:
| 字段 | 位宽 | 描述 |
|---|---|---|
| DI (Data Identifier) | 8 bits | 包含 VC (2 bits) 和 DT (6 bits),与短包定义相同 |
| WC (Word Count) | 16 bits | 数据负载的字节数,范围 0~65535 |
| ECC | 8 bits | 保护 DI 和 WC 字段,单比特纠错/双比特检错 |
| Data Payload | 可变 | 实际传输的数据,长度由 WC 指定 |
| CS (Checksum) | 16 bits | 对数据负载的 16 位 CRC 校验和,检测传输错误 |
常见驱动错误:长包的 WC 字段表示数据负载的字节数,而非字(Word)数。在配置 DMA 传输时,务必根据 WC 值设置正确的传输长度,否则会导致数据错位或 CRC 校验失败。
2.3 包类型区分与用途
DSI 协议通过 数据类型(DT, Data Type)字段来区分短包和长包。DT 字段的高位(bit 5)决定了包的类型:
- DT[5] = 0:短包(Short Packet),固定 4 字节。
- DT[5] = 1:长包(Long Packet),可变长度。
常见数据类型及用途:
| DT 值 | 包类型 | 名称 | 典型用途 |
|---|---|---|---|
| 0x01 | 短包 | V-Sync Start | 垂直同步开始信号,帧同步 |
| 0x05 | 短包 | H-Sync Start | 水平同步开始信号,行同步 |
| 0x09 | 短包 | End of Transmission (EoT) | 传输结束包,关闭 LP 模式 |
| 0x15 | 短包 | Generic Short Write | 通用短写命令,带 2 字节参数 |
| 0x29 | 长包 | Generic Long Write | 通用长写命令,传输大块数据 |
| 0x2E | 长包 | Pixel Data (RGB888) | 24 位 RGB 像素数据流 |
| 0x3E | 长包 | Pixel Data (RGB666) | 18 位 RGB 像素数据流 |
驱动开发要点:在初始化显示控制器时,需要根据显示面板的规格配置正确的像素格式 DT。例如,RGB888 面板使用 DT=0x2E,RGB666 面板使用 DT=0x3E。错误的 DT 配置会导致显示颜色异常或黑屏。
2.4 长包与短包对比总结
| 对比项 | 短包 | 长包 |
|---|---|---|
| 总长度 | 固定 4 字节 | 可变(6 ~ 65541 字节) |
| 数据负载 | 2 字节(Data Low/High) | 0 ~ 65535 字节 |
| 校验机制 | ECC(覆盖包头+数据) | ECC(包头)+ CRC-16(数据负载) |
| 主要用途 | 同步信号、命令、应答 | 像素数据、大块命令、固件 |
| 传输效率 | 低(校验开销占比高) | 高(数据占比大) |
| 驱动配置关注点 | VC、DT、ECC 中断 | WC、DMA 传输长度、CRC 校验 |
核心记忆点:
- 短包 = 4 字节,DT[5]=0,用于控制/同步。
- 长包 = 包头(4) + 数据(可变) + 包尾(2),DT[5]=1,用于数据/像素。
- ECC 保护包头,CRC-16 保护长包数据负载。
- 驱动开发中,短包通常由硬件自动发送(如同步信号),长包需要驱动配置 DMA 和 WC。