3. DSI 协议层详解:数据包格式与虚拟通道
MIPI DSI 协议层定义了主机(Host)与外设(Peripheral)之间传输数据的具体格式。理解数据包结构、数据类型以及虚拟通道机制,是进行屏幕驱动移植和显示异常排查的基础。本章将深入剖析 DSI 协议层的核心要素。
3.1 数据包格式:长包与短包
DSI 协议层的数据传输以数据包(Packet)为基本单位。根据数据负载的长度,数据包分为两种类型:短包(Short Packet)和长包(Long Packet)。所有数据包都通过 DSI 链路在高速模式下传输。
3.1.1 短包(Short Packet)
短包主要用于传输命令或少量数据,其总长度为 4 字节。短包结构紧凑,传输效率高,常用于 DCS 命令、同步信号等场景。
| 字节偏移 | 字段 | 长度(bit) | 描述 |
|---|---|---|---|
| 0 | DI (Data Identifier) | 8 | 包含虚拟通道 ID(VC)和数据类型(DT) |
| 1 | WC (Word Count) / Data0 | 8 | 短包的数据低字节或命令参数字节 |
| 2 | ECC (Error Correction Code) | 8 | 对前 2 个字节的校验码,支持单比特纠错 |
3.1.2 长包(Long Packet)
长包用于传输大量数据,如像素数据、初始化序列等。其结构包含包头、可选的负载数据和包尾。
| 部分 | 字段 | 长度(字节) | 描述 |
|---|---|---|---|
| 包头(Packet Header) | DI (Data Identifier) | 1 | 包含虚拟通道 ID(VC)和数据类型(DT) |
| WC (Word Count) | 2 | 指定负载数据的字节数(0~65535) | |
| ECC (Error Correction Code) | 1 | 对包头 3 个字节的校验码 | |
| 负载(Payload) | Data | 0~65535 | 实际传输的数据内容 |
| 包尾(Packet Footer) | Checksum | 2 | 对负载数据的 16 位 CRC 校验 |
3.1.3 长包与短包对比
| 特性 | 短包 | 长包 |
|---|---|---|
| 总长度 | 4 字节(固定) | 4 + 负载长度 + 2 字节(可变) |
| 负载能力 | 最多 2 字节数据 | 最多 65535 字节数据 |
| 错误检测 | ECC(纠错) | ECC(包头)+ CRC(负载) |
| 主要用途 | 命令、同步、读请求 | 像素流、大块初始化数据 |
3.2 数据类型(DT)与 DCS 命令
数据包中的 DI(Data Identifier) 字段包含一个 6 位的 数据类型(DT, Data Type) 代码,用于指示包内数据的含义。DSI 标准定义了丰富的数据类型,涵盖命令、像素数据、同步信号等。
3.2.1 常见数据类型分类
| 类别 | DT 值(Hex) | 名称 | 说明 |
|---|---|---|---|
| 同步信号 | 0x01 | V Sync Start | 垂直同步开始 |
| 0x11 | V Sync End | 垂直同步结束 | |
| 0x21 | H Sync Start | 水平同步开始 | |
| 0x31 | H Sync End | 水平同步结束 | |
| DCS 命令 | 0x05 | DCS Short Write (0 param) | 无参数 DCS 写命令(短包) |
| 0x15 | DCS Short Write (1 param) | 带 1 字节参数 DCS 写命令(短包) | |
| 像素数据 | 0x3E | Packed Pixel Stream, 24-bit RGB | 24 位 RGB 像素流(长包) |
| 0x2E | Packed Pixel Stream, 16-bit RGB | 16 位 RGB 像素流(长包) | |
| 读操作 | 0x06 | DCS Read (0 param) | DCS 读命令(短包) |
3.2.2 DCS 命令详解
DCS(Display Command Set) 是 MIPI 联盟为显示面板定义的标准命令集。驱动开发者通过 DCS 命令控制屏幕的初始化、休眠、唤醒、显示模式切换等。DCS 命令通常通过短包或长包传输。
- 短包 DCS 命令:适用于无参数或单参数命令,如
0x28(显示关闭)、0x29(显示开启)、0x11(退出睡眠模式)。 - 长包 DCS 命令:适用于多参数命令,如设置伽马曲线、写显存数据。命令本身作为负载的第一个字节,后续字节为参数。
mipi_dsi_dcs_write() 函数发送 DCS 命令。该函数会自动根据参数长度选择短包或长包格式。例如,发送 0x11(退出睡眠)时,内核会构造一个 DT=0x05 的短包。
3.3 虚拟通道(Virtual Channel)机制
虚拟通道(VC, Virtual Channel)是 DSI 协议层实现多路复用的关键技术。它允许在单条 DSI 链路上同时传输属于不同显示控制器或不同数据流的数据包。
3.3.1 虚拟通道 ID
每个数据包的 DI 字段中包含一个 2 位的 VC(Virtual Channel) 标识符,取值范围为 0~3。接收端(如显示控制器)根据 VC ID 将数据包路由到对应的处理逻辑。
| VC ID | 典型用途 |
|---|---|
| 0 | 主显示通道(Primary Display) |
| 1 | 辅助显示通道(Secondary Display)或命令通道 |
| 2 | 触摸控制器数据(如果集成在 DSI 总线上) |
| 3 | 保留或自定义用途 |
3.3.2 虚拟通道的工作流程
- 发送端:主机在构造数据包时,将目标虚拟通道的 ID 填入 DI 字段的高 2 位。
- 链路传输:所有 VC 的数据包在物理链路上按时间片交错传输,互不干扰。
- 接收端:显示控制器解析每个数据包的 VC ID,将数据分发到对应的内部缓冲区或处理单元。
3.4 协议层与显示异常排查
在屏幕移植过程中,协议层配置错误是导致显示异常的主要原因之一。以下是一些常见问题及其排查思路:
| 异常现象 | 可能原因 | 排查方向 |
|---|---|---|
| 屏幕无显示(黑屏) | DCS 初始化命令未正确发送,或长包 CRC 错误 | 使用逻辑分析仪抓取 DSI 总线数据,检查命令序列和包格式 |
| 显示花屏/条纹 | 像素数据类型(DT)不匹配,或虚拟通道 VC 配置错误 | 核对屏幕规格书中的 DT 值(如 0x3E 或 0x2E),确认 VC ID 一致 |
| 屏幕闪烁 | 同步信号(V/H Sync)的短包丢失或时序错误 | 检查同步包的数据类型和发送间隔 |
| 部分区域显示异常 | 长包负载长度(WC)与预期不符,导致数据错位 | 验证初始化序列中每个长包的 WC 值 |
drivers/gpu/drm/drm_mipi_dsi.c 中的 mipi_dsi_packet_format_is_short() 和 mipi_dsi_create_packet() 函数来验证数据包格式。建议在发送前打印 DI、WC 和 ECC 字段,与规格书进行比对。
3.5 本章小结
- DSI 协议层使用短包和长包两种格式传输数据,短包适用于命令和同步信号,长包适用于像素流和大块数据。
- 数据类型(DT)定义了包内数据的含义,DCS 命令是控制屏幕的核心手段。
- 虚拟通道(VC)机制允许在单条链路上复用多个数据流,通过 DI 字段中的 VC ID 进行路由。
- 协议层配置错误(如 DT 不匹配、VC 冲突、CRC 错误)是导致显示异常的常见原因,排查时应从数据包格式入手。