2. DSI数据传输模式:Command Mode与Video Mode的区别、同步事件包与像素流、LP与HS模式切换机制
MIPI DSI协议定义了两种核心的数据传输模式:Command Mode(命令模式)和Video Mode(视频模式)。这两种模式决定了主机处理器(AP)如何将图像数据发送到显示面板,以及面板如何刷新屏幕。理解它们的区别、同步机制以及低功耗(LP)与高速(HS)模式的切换,是编写高效DSI驱动的基石。
2.1 Command Mode vs. Video Mode:核心架构对比
Command Mode将显示面板视为一个带有帧缓冲(Frame Buffer)的内存映射设备。主机通过DSI总线发送命令和数据来更新帧缓冲的内容,面板内部的时序控制器(TCON)负责从本地缓冲读取数据并刷新屏幕。Video Mode则将DSI总线视为一个实时像素流管道,主机必须按照严格的时序要求,持续不断地发送像素数据,面板实时显示,通常不依赖本地帧缓冲。
| 对比维度 | Command Mode(命令模式) | Video Mode(视频模式) |
|---|---|---|
| 面板帧缓冲 | 必需(面板内部自带GRAM) | 可选(通常无,或仅用于自刷新) |
| 数据刷新方式 | 主机写入GRAM,TCON自主刷新 | 主机实时发送像素流,面板同步显示 |
| 总线占用 | 仅在更新GRAM时占用,可间歇性休眠 | 持续占用,必须保持HS时钟 |
| 功耗 | 低(静态画面时总线可进入LP状态) | 高(即使画面静止,仍需持续传输) |
| 延迟 | 命令响应延迟较低,但帧更新有延迟 | 像素到显示延迟极低(实时性高) |
| 典型应用 | 智能手表、AMOLED手机主屏 | LCD手机、平板、车载信息屏 |
| 同步方式 | 通过TE(Tearing Effect)信号同步 | 通过HSA/HBP/HFP/VSA/VBP等同步包 |
struct mipi_dsi_device 的 mode_flags 字段通过 MIPI_DSI_MODE_VIDEO 和 MIPI_DSI_MODE_VIDEO_SYNC_PULSE 等标志位来配置模式。选择哪种模式,取决于面板数据手册和系统功耗要求。
2.2 Video Mode的同步事件包与像素流
Video Mode的核心是严格的时序同步。主机发送的数据流必须包含同步事件包(Sync Event Packets)和像素数据包(Pixel Stream Packets),以模拟传统的并行RGB接口时序(VSYNC、HSYNC、DE)。
DSI协议定义了三种Video Mode子类型,区别在于同步事件的编码方式:
- Non-Burst Mode with Sync Pulses: 使用独立的短包(Short Packet)作为VSS(VSYNC Start)、VSE(VSYNC End)、HSS(HSYNC Start)、HSE(HSYNC End)同步事件。这是最精确的同步方式。
- Non-Burst Mode with Sync Events: 使用长包(Long Packet)的包头或特定模式来编码同步事件,减少包数量。
- Burst Mode: 在消隐区(Blanking Period)不发送像素数据,但保持HS时钟运行,允许在有效数据区以更高速度“突发”传输像素,从而降低总线频率。
在Video Mode的一帧中,有效像素数据只在 HACT(Horizontal Active) 和 VACT(Vertical Active) 区域传输。其余区域为消隐区(HBP、HFP、VBP、VFP)。同步事件包(如HSS、VSS)正是在消隐区发送,用于指示行和帧的边界。
2.3 Command Mode的同步机制:TE信号
在Command Mode中,由于面板内部有自己的帧缓冲和TCON,主机更新GRAM的时机必须与面板的刷新周期对齐,否则会出现Tearing Effect(撕裂效应)——屏幕上半部分显示旧帧,下半部分显示新帧。
解决方案是使用TE(Tearing Effect)信号:
- 面板行为: 当TCON完成一帧的读取并开始刷新下一帧时,TE引脚输出一个脉冲(通常是上升沿或下降沿)。
- 主机行为: 驱动注册TE中断。在收到TE信号后,主机才启动DMA,通过DSI总线向面板GRAM写入新一帧数据。
- 同步效果: 确保主机写入操作发生在面板帧缓冲的消隐期(VBP或VFP),避免读写冲突。
drm_panel 框架通过 drm_panel_enable_backlight 和 drm_panel_prepare 等回调来协调TE的使能时序。务必在面板初始化序列中正确配置TE引脚方向。
2.4 LP与HS模式切换机制
DSI物理层支持两种信号状态:LP(Low Power,低功耗) 和 HS(High Speed,高速)。LP模式使用单端信号,电压摆幅低(约1.2V),速率低(最大10Mbps),用于传输命令和同步信息。HS模式使用差分信号,电压摆幅高(约200mV),速率高(最高可达4.5Gbps/lane),用于传输大量像素数据。
模式切换由主机控制器通过特定的 Escape Mode Entry 和 HS Entry Sequence 控制:
| 状态 | 信号电平(Dp/Dn) | 传输速率 | 典型用途 |
|---|---|---|---|
| LP-00 | Dp=0, Dn=0 | N/A | 控制状态(Stop状态) |
| LP-01 | Dp=0, Dn=1 | N/A | HS Request / Escape Mode Entry |
| LP-10 | Dp=1, Dn=0 | N/A | HS Ready / Turnaround |
| LP-11 | Dp=1, Dn=1 | N/A | Idle / Stop状态 |
| HS-0 | Dp-Dn 差分 = -200mV | 80Mbps ~ 4.5Gbps | 传输数据0 |
| HS-1 | Dp-Dn 差分 = +200mV | 80Mbps ~ 4.5Gbps | 传输数据1 |
切换流程(以LP→HS为例):
- LP状态: 总线处于LP-11(Idle)。
- HS Request: 主机驱动Dn为0,Dp保持1(LP-01),持续TLPX(通常50ns)。
- HS Prepare: 主机驱动Dp为0,Dn为0(LP-00),持续THS-PREPARE。
- HS Zero: 主机启动HS驱动器,发送HS-0序列(差分0),持续THS-ZERO。
- HS Sync: 发送同步序列(00011101),进入HS数据传输。
- 数据传输: 以HS速率发送数据包。
- HS Trail: 数据结束后,发送HS Trail序列,然后关闭HS驱动器。
- LP状态恢复: 总线回到LP-11。
transfer() 回调函数内部会处理LP/HS切换。对于Video Mode,主机控制器硬件通常自动管理HS时钟的启停;对于Command Mode,驱动需要根据数据包类型(命令包用LP,数据包用HS)手动设置 MIPI_DSI_MSG_USE_LPM 标志位。例如:struct mipi_dsi_msg msg = {
.type = MIPI_DSI_DCS_WRITE,
.tx_buf = cmd,
.tx_len = 1,
.flags = MIPI_DSI_MSG_USE_LPM, // 强制使用LP模式发送命令
};
mipi_dsi_device_transfer(dsi, &msg);
2.5 模式选择对性能的影响
在实际项目中,选择Command Mode还是Video Mode,直接影响系统功耗、内存带宽和显示延迟:
- 功耗敏感场景(如智能手表): 优先选择Command Mode。利用面板内部GRAM,主机可以在更新完一帧后,将DSI总线切换到LP状态,甚至关闭HS时钟,大幅降低功耗。配合TE中断,主机CPU也可以进入更深度的睡眠。
- 高帧率/低延迟场景(如游戏手机): 优先选择Video Mode Burst Mode。它消除了GRAM写入延迟,像素直接从主机到面板,延迟最低。但代价是总线必须持续工作,功耗较高。
- 带宽计算: Video Mode的像素时钟频率必须满足:
PCLK = (HACT + HBP + HFP + HSA) × (VACT + VBP + VFP + VSA) × FPS。如果DSI Lane速率不足,会导致画面撕裂或闪烁。Command Mode则只需保证GRAM写入带宽大于等于显示刷新带宽即可。
/sys/kernel/debug/dri/0/ 下可以查看DSI控制器的寄存器状态和当前模式。使用 perf top 观察 mipi_dsi_host_transfer 的调用频率,如果Video Mode下该函数调用过于频繁且占用CPU过高,考虑增大DMA缓冲区或调整Burst Mode的消隐区设置。