2. MIPI DSI 协议基础:分层架构与数据包格式

MIPI DSI(Display Serial Interface)是移动设备与嵌入式显示领域最广泛采用的串行显示接口标准。在移植 RK3588 的 MIPI DSI 驱动之前,深入理解其协议分层、物理层特性以及数据包格式是必不可少的。本章将从 DSI 的分层架构出发,逐层剖析 D-PHY 物理层、协议层以及核心的数据包结构。

2.1 DSI 分层架构概述

MIPI DSI 协议遵循 OSI 参考模型的思想,将整个通信栈划分为四个清晰的层次。每一层都封装了特定的功能,并为上层提供标准化的服务接口。这种分层设计使得驱动开发者可以独立地处理物理层配置、协议解析和应用层控制。

核心要点: DSI 的分层架构从下至上依次为:D-PHY 物理层(电气特性与时钟/数据恢复)、协议层(数据包封装与拆解)、应用层(像素数据与命令流生成)。驱动移植时,通常需要从物理层开始配置,逐步向上验证。
MIPI DSI 四层协议架构 应用层 (Application Layer) 像素流打包 / 命令集解析 / DCS 命令 协议层 (Protocol Layer) 数据包格式 / 长包与短包 / ECC 与 CRC 通道管理层 (Lane Management Layer) 多通道分发 / 通道合并 / 数据交错 D-PHY 物理层 (D-PHY Physical Layer) 高速差分信号 / 时钟与数据 Lane / LP 与 HS 模式 驱动 关注 点 时序 配置 包 解析 Lane 映射 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 无法进入高速模式,表现为屏幕无显示或花屏。
D-PHY 高速传输状态切换序列 LP-11 停止态 LP-01 HS 请求 LP-00 桥接态 HS 传输 高速数据 T_LPX (低功耗周期) T_HS-PREPARE T_HS-ZERO T_HS-TRAIL 关键时序参数(需在 DTS 中配置) clk-post / clk-pre / hs-prepare / hs-zero / hs-trail / lpx

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 值错误会导致数据边界错乱,引发显示撕裂。
DSI 数据包结构对比 短包 (4 字节固定长度) DI Data0 Data1 ECC 长包 (可变长度) DI WC (2B) ECC Payload (WC 字节) CRC └───── 包头 (4B) ─────┘ └── 数据负载 ──┘ └─ 包尾 ─┘ DI 字段结构:Bit[7:6] = 虚拟通道 ID (VC) | Bit[5:0] = 数据类型 (DT)

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 的长包。

2.5 本章小结