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 个字节的校验码,支持单比特纠错
关键点:短包没有独立的负载(Payload)和校验和(Checksum)字段。其数据字段(WC/Data0 和 Data1)直接嵌入在包结构中,用于传递命令参数或 16 位数据。

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 校验
常见错误:在移植屏幕时,如果长包的 WC(Word Count)与实际负载长度不匹配,或者 CRC 校验错误,会导致屏幕无响应或显示花屏。务必核对初始化序列中每个长包的数据长度。

3.1.3 长包与短包对比

特性 短包 长包
总长度 4 字节(固定) 4 + 负载长度 + 2 字节(可变)
负载能力 最多 2 字节数据 最多 65535 字节数据
错误检测 ECC(纠错) ECC(包头)+ CRC(负载)
主要用途 命令、同步、读请求 像素流、大块初始化数据
DSI 数据包结构对比 短包 (4 Bytes) DI (1B) Data0 (1B) Data1 (1B) ECC (1B) 长包 (可变长度) DI (1B) WC (2B) ECC (1B) Payload (0~65535B) CRC (2B) Packet Header Packet Payload Packet Footer 长包通过 WC 字段指定负载长度,CRC 字段保证数据完整性;短包则依赖 ECC 保护整个包。

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 命令:适用于多参数命令,如设置伽马曲线、写显存数据。命令本身作为负载的第一个字节,后续字节为参数。
实战案例:在 Linux 内核中,通过 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 虚拟通道的工作流程

  1. 发送端:主机在构造数据包时,将目标虚拟通道的 ID 填入 DI 字段的高 2 位。
  2. 链路传输:所有 VC 的数据包在物理链路上按时间片交错传输,互不干扰。
  3. 接收端:显示控制器解析每个数据包的 VC ID,将数据分发到对应的内部缓冲区或处理单元。
虚拟通道(VC)多路复用机制 主机 (Host) VC 0: 主显示 VC 1: 命令 VC 2: 触摸 MUX DSI 物理链路 DEMUX 外设 (Peripheral) VC 0 VC 1 VC 2 虚拟通道通过 DI 字段中的 VC ID 实现数据包的路由,支持多数据流复用同一条物理链路。

3.4 协议层与显示异常排查

在屏幕移植过程中,协议层配置错误是导致显示异常的主要原因之一。以下是一些常见问题及其排查思路:

异常现象 可能原因 排查方向
屏幕无显示(黑屏) DCS 初始化命令未正确发送,或长包 CRC 错误 使用逻辑分析仪抓取 DSI 总线数据,检查命令序列和包格式
显示花屏/条纹 像素数据类型(DT)不匹配,或虚拟通道 VC 配置错误 核对屏幕规格书中的 DT 值(如 0x3E 或 0x2E),确认 VC ID 一致
屏幕闪烁 同步信号(V/H Sync)的短包丢失或时序错误 检查同步包的数据类型和发送间隔
部分区域显示异常 长包负载长度(WC)与预期不符,导致数据错位 验证初始化序列中每个长包的 WC 值
调试技巧:在 Linux 内核中,可以通过 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 错误)是导致显示异常的常见原因,排查时应从数据包格式入手。