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等同步包
驱动开发提示: 在Linux内核中,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)正是在消隐区发送,用于指示行和帧的边界。
Video Mode 帧结构与同步事件包 Video Mode 一帧数据流结构 VSA (Vertical Sync Active) - 发送VSS/VSE同步包 VBP (Vertical Back Porch) - 消隐区,可发LP或保留HS VACT (Vertical Active) - 有效行区域 HSS | HBP | HACT (像素数据包) | HFP | HSE 每行包含:同步开始、消隐前肩、有效像素、消隐后肩、同步结束 VFP (Vertical Front Porch) - 消隐区 帧同步方向

2.3 Command Mode的同步机制:TE信号

在Command Mode中,由于面板内部有自己的帧缓冲和TCON,主机更新GRAM的时机必须与面板的刷新周期对齐,否则会出现Tearing Effect(撕裂效应)——屏幕上半部分显示旧帧,下半部分显示新帧。

解决方案是使用TE(Tearing Effect)信号:

  1. 面板行为: 当TCON完成一帧的读取并开始刷新下一帧时,TE引脚输出一个脉冲(通常是上升沿或下降沿)。
  2. 主机行为: 驱动注册TE中断。在收到TE信号后,主机才启动DMA,通过DSI总线向面板GRAM写入新一帧数据。
  3. 同步效果: 确保主机写入操作发生在面板帧缓冲的消隐期(VBP或VFP),避免读写冲突。
常见陷阱: 如果TE信号处理不当(例如中断延迟过高,或写入速度慢于面板刷新率),撕裂仍然会发生。在Linux内核中,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为例):

  1. LP状态: 总线处于LP-11(Idle)。
  2. HS Request: 主机驱动Dn为0,Dp保持1(LP-01),持续TLPX(通常50ns)。
  3. HS Prepare: 主机驱动Dp为0,Dn为0(LP-00),持续THS-PREPARE。
  4. HS Zero: 主机启动HS驱动器,发送HS-0序列(差分0),持续THS-ZERO。
  5. HS Sync: 发送同步序列(00011101),进入HS数据传输。
  6. 数据传输: 以HS速率发送数据包。
  7. HS Trail: 数据结束后,发送HS Trail序列,然后关闭HS驱动器。
  8. LP状态恢复: 总线回到LP-11。
LP 与 HS 模式切换时序 LP ↔ HS 模式切换状态机 LP-11 (Idle) LP-01 (Req) LP-00 (Prep) HS Data HS Trail → LP-11 (返回Idle) TLPX THS-PREPARE
驱动实现要点: 在Linux DSI主机控制器驱动中,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的消隐区设置。