1. MIPI DSI协议概述
MIPI DSI(Display Serial Interface)是移动设备与嵌入式系统中应用最广泛的显示串行接口标准。它由MIPI联盟定义,旨在以低功耗、高速串行总线传输显示像素数据与控制命令。理解DSI协议的分层架构是驱动开发的基础,也是后续深入长包校验与时钟配置的前提。
1.1 DSI协议分层架构
DSI协议采用经典的三层架构:物理层(Physical Layer)、协议层(Protocol Layer)与应用层(Application Layer)。各层职责清晰,层间通过标准接口交互,便于硬件实现与驱动软件分层设计。
关键设计原则:DSI的分层架构使得底层物理传输细节对上层应用透明,驱动开发者只需关注协议层与应用层的接口封装,无需直接操作差分信号时序。
驱动开发提示:在Linux内核中,DSI驱动通常对应
drivers/gpu/drm/mipi_dsi.c,其核心结构体struct mipi_dsi_device和struct mipi_dsi_host正是分层思想的体现。
1.1.1 分层架构总览
下表总结了DSI协议各层的功能定位与核心职责:
| 层次 | 功能定位 | 核心职责 | 驱动关注点 |
|---|---|---|---|
| 应用层 | 显示数据与命令的语义封装 | 像素格式转换、命令集解析、帧缓冲管理 | DRM/KMS框架集成、panel驱动回调 |
| 协议层 | 数据包封装与传输控制 | 长包/短包构造、ECC校验、CRC校验、虚拟通道管理 | 包类型选择、校验使能、传输模式切换 |
| 物理层 | 高速差分信号传输 | 时钟通道与数据通道的电气特性、LP/HS模式切换 | 时钟配置、lane数设定、时序参数 |
1.1.2 分层架构SVG图
下图展示了DSI协议的三层架构及其与主机处理器、显示面板的交互关系:
1.2 物理层(Physical Layer)
物理层基于MIPI D-PHY规范,定义了主机与显示设备之间的电气连接与信号传输方式。DSI物理层包含一个时钟通道(Clock Lane)和1~4个数据通道(Data Lane),所有通道均为差分信号对(Dp/Dn)。
1.2.1 物理层核心特性
- 差分信号传输:每个通道使用一对差分线(Dp/Dn),抗干扰能力强,适合高速传输。
- 两种工作模式:
- HS(High Speed)模式:高速差分信号,数据传输速率可达80 Mbps ~ 4.5 Gbps per lane。
- LP(Low Power)模式:单端信号,用于控制命令传输与总线状态管理,功耗极低。
- 通道扩展性:支持1、2、3或4条数据通道,带宽随通道数线性增加。
- 时钟通道独立:时钟通道始终以HS模式运行,为数据通道提供同步时钟参考。
驱动开发避坑:物理层的LP/HS模式切换时序(如HS-Exit、HS-Trail等参数)必须在驱动中精确配置。配置不当会导致链路不稳定、数据错位甚至面板无显示。这些参数通常由设备树(Device Tree)中的
mipi-phy-*属性指定。
1.2.2 物理层通道结构SVG图
下图展示了DSI物理层的典型通道连接结构:
1.3 协议层(Protocol Layer)
协议层是DSI驱动的核心关注点。它负责将应用层的数据与命令封装为符合DSI规范的数据包,并通过物理层发送。协议层定义了两种基本包类型:短包(Short Packet)和长包(Long Packet)。
1.3.1 短包(Short Packet)
短包固定为4字节,用于传输命令或少量数据。其结构如下:
| 字节偏移 | 字段 | 位宽 | 说明 |
|---|---|---|---|
| 0 | DI(Data Identifier) | 8 bits | 虚拟通道ID(VC, 2 bits)+ 数据类型(DT, 6 bits) |
| 1 | WC(Word Count)低字节 | 8 bits | 数据字段长度(短包中固定为0) |
| 2 | ECC(Error Correction Code) | 8 bits | 前3字节的汉明码校验,可纠正1位错误、检测2位错误 |
| 3 | — | — | 短包无数据负载,ECC后即结束 |
1.3.2 长包(Long Packet)
长包用于传输大量数据(如像素数据、初始化序列),其结构包含包头、数据负载和包尾校验:
| 组成部分 | 长度 | 字段 | 说明 |
|---|---|---|---|
| 包头(Packet Header) | 1 byte | DI | 虚拟通道ID + 数据类型 |
| 2 bytes | WC(Word Count) | 数据负载的字节数(0~65535) | |
| 1 byte | ECC | 包头的汉明码校验 | |
| 数据负载(Data Payload) | WC bytes | 用户数据 | 像素数据、命令参数等 |
| 包尾(Packet Footer) | 2 bytes | CRC(Cyclic Redundancy Check) | 数据负载的16位CRC校验(多项式:x¹⁶ + x¹² + x⁵ + 1) |
长包校验机制:长包通过ECC保护包头完整性,通过CRC保护数据负载完整性。驱动开发中,必须确保发送端正确生成校验码,接收端正确验证。校验失败时,协议层会触发错误报告或重传机制。
1.3.3 长包结构SVG图
下图详细展示了长包的字节布局与校验覆盖范围:
1.4 应用层(Application Layer)
应用层位于DSI协议栈的最上层,负责定义显示数据的语义与命令格式。在驱动开发中,应用层主要涉及以下内容:
- DCS(Display Command Set)命令集:MIPI定义的标准化显示控制命令,如
MIPI_DCS_SOFT_RESET、MIPI_DCS_SET_DISPLAY_ON等。 - 像素格式定义:RGB565、RGB666、RGB888等像素编码方式,决定数据负载的字节组织。
- 帧缓冲管理:与DRM/KMS框架交互,将GPU渲染的帧数据通过DSI发送至面板。
- 初始化序列:面板上电后需要发送的配置命令序列,通常以长包形式传输。
驱动开发提示:在Linux内核中,panel驱动通常实现
struct drm_panel的回调函数,在prepare()和enable()中通过DSI发送初始化命令。应用层的数据最终通过协议层封装为长包或短包,再经物理层发送。
1.5 本章小结
本章介绍了MIPI DSI协议的三层架构:
- 物理层定义了差分信号传输、LP/HS模式切换与通道结构,是驱动时钟配置的基础。
- 协议层负责数据包封装与校验,长包的ECC/CRC机制是传输可靠性的核心保障。
- 应用层定义了显示数据语义与命令集,是驱动与上层显示框架的接口。