2. MIPI DSI 协议基础:分层架构与数据包格式
MIPI DSI(Display Serial Interface)是移动设备与嵌入式显示领域最广泛采用的串行显示接口标准。在移植 RK3588 的 MIPI DSI 驱动之前,深入理解其协议分层、物理层特性以及数据包格式是必不可少的。本章将从 DSI 的分层架构出发,逐层剖析 D-PHY 物理层、协议层以及核心的数据包结构。
2.1 DSI 分层架构概述
MIPI DSI 协议遵循 OSI 参考模型的思想,将整个通信栈划分为四个清晰的层次。每一层都封装了特定的功能,并为上层提供标准化的服务接口。这种分层设计使得驱动开发者可以独立地处理物理层配置、协议解析和应用层控制。
核心要点: DSI 的分层架构从下至上依次为:D-PHY 物理层(电气特性与时钟/数据恢复)、协议层(数据包封装与拆解)、应用层(像素数据与命令流生成)。驱动移植时,通常需要从物理层开始配置,逐步向上验证。
2.2 D-PHY 物理层
D-PHY 是 MIPI 联盟定义的物理层标准,专门为摄像头和显示接口设计。它采用差分信号传输,具有低功耗、高抗干扰能力的特点。在 RK3588 平台上,D-PHY 通常集成在 SoC 内部,但需要外部匹配电阻和 PCB 走线控制。
2.2.1 物理层关键特性
- 差分信号对: 每个 Lane 由 Dp(正极)和 Dn(负极)两根线组成,通过差分电压摆幅传输数据。
- 两种工作模式:
- 高速模式 (HS - High Speed): 用于传输像素数据和命令,电压摆幅约 200mV,速率可达 1.5 Gbps/Lane。
- 低功耗模式 (LP - Low Power): 用于控制信号和总线仲裁,电压摆幅约 1.2V,速率较低但功耗极低。
- 时钟 Lane: 提供差分时钟信号,数据 Lane 在时钟的上升沿和下降沿均采样数据(DDR 模式)。
2.2.2 状态定义与总线状态
D-PHY 定义了四种 LP 状态,通过 Dp 和 Dn 的电平组合来表示:
| 状态 | Dp 电平 | Dn 电平 | 说明 |
|---|---|---|---|
| LP-00 | 0 | 0 | 桥接状态 (Bridge) |
| LP-01 | 0 | 1 | HS 请求 (HS Request) |
| LP-10 | 1 | 0 | LP 请求 (LP Request) |
| LP-11 | 1 | 1 | 停止状态 (Stop State) |
驱动移植提示: 在 RK3588 的 D-PHY 初始化序列中,必须正确配置 HS 传输前的 LP-11 → LP-01 → LP-00 状态切换时序。错误的时序会导致 PHY 无法进入高速模式,表现为屏幕无显示或花屏。
2.3 协议层与数据包格式
DSI 协议层负责将应用层的数据封装成标准的数据包,通过物理层进行传输。数据包分为两种基本类型:短包和长包。
2.3.1 短包 (Short Packet)
短包固定为 4 字节,主要用于传输命令和同步信号,不携带数据负载。其格式如下:
| 字节偏移 | 字段 | 位宽 | 说明 |
|---|---|---|---|
| 0 | DI (Data Identifier) | 8 bits | 包含虚拟通道 ID (VC) 和数据类型 (DT) |
| 1 | WC (Word Count) 低字节 | 8 bits | 对于短包,此字段为命令参数或数据 |
| 2 | WC 高字节 | 8 bits | 同上 |
| 3 | ECC (Error Correction Code) | 8 bits | 对前 3 个字节进行纠错保护 |
2.3.2 长包 (Long Packet)
长包用于传输大量数据,如像素数据或长命令序列。其结构包含包头、数据负载和包尾:
| 部分 | 字段 | 长度 | 说明 |
|---|---|---|---|
| 包头 (Packet Header) | DI | 1 字节 | 数据标识符 (VC + DT) |
| WC (Word Count) | 2 字节 | 数据负载的字节数 (0 ~ 65535) | |
| ECC | 1 字节 | 对包头进行纠错 | |
| 数据负载 (Data Payload) | 用户数据 | WC 字节 | 像素数据或命令参数 |
| 包尾 (Packet Footer) | CRC | 2 字节 | 对数据负载进行循环冗余校验 |
常见错误: 在移植过程中,如果遇到屏幕显示内容错位或颜色异常,首先检查长包的 WC 字段是否与显示时序的 HACT 宽度匹配。WC 值错误会导致数据边界错乱,引发显示撕裂。
2.4 数据类型与虚拟通道
数据包中的 DI 字段决定了数据包的类型和路由。DI 的高 2 位用于虚拟通道(VC),低 6 位用于数据类型(DT)。
2.4.1 虚拟通道 (Virtual Channel)
DSI 支持最多 4 个虚拟通道(VC0 ~ VC3),允许在同一物理链路上复用多个显示流。在 RK3588 中,通常只使用 VC0 作为主显示通道。
2.4.2 常见数据类型 (Data Type)
| DT 值 (Hex) | 类型 | 说明 |
|---|---|---|
| 0x01 | 短包 | 同步事件:V Sync Start |
| 0x02 | 短包 | 同步事件:V Sync End |
| 0x03 | 短包 | 同步事件:H Sync Start |
| 0x04 | 短包 | 同步事件:H Sync End |
| 0x05 | 短包 | 同步事件:End of Transmission (EoT) |
| 0x29 | 长包 | RGB 像素数据 (24-bit, 每像素 3 字节) |
| 0x2A | 长包 | RGB 像素数据 (18-bit, 每像素 2.25 字节) |
| 0x06 | 短包 | DCS 写命令 (无参数) |
| 0x23 | 长包 | DCS 写命令 (带参数) |
驱动调试技巧: 当屏幕无法点亮时,可以使用逻辑分析仪抓取 DSI 总线上的数据包。检查是否出现了正确的 V Sync / H Sync 短包,以及像素数据长包的 DT 值是否与显示面板的配置一致。例如,24-bit RGB 面板必须发送 DT=0x29 的长包。