ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MIPI DSI屏调试:彻底搞懂Video Mode与Command Mode的区别与选型

MIPI DSI屏调试:彻底搞懂Video Mode与Command Mode的区别与选型 做MIPI DSI屏调试这行你早晚会遇到一个绕不开的问题这款屏到底走video mode还是command mode我第一次从RGB并口转过来时就被这两个词搞晕过。当时屏点不亮驱动代码反复核对没毛病最后发现是初始化序列把panel配成了command mode而SoC的DSI控制器按video mode在发包两边根本聊不到一块去。今天就把这两种模式从头到尾说透顺便把点屏调试中常踩的坑也一起整理了。做嵌入式显示这几年我统计过团队里所有MIPI相关的故障至少有三成和“模式不匹配”有关。而且这类问题最难查的地方在于软件、硬件、初始化代码看着都没错实际上矛盾已经埋在时序里了。所以这篇文章不只是做名词解释而是把两种模式的机制、时序参数、平台配置和波形排查串起来讲清楚适合刚接手MIPI屏的驱动工程师、硬件工程师也适合想用FPGA自己做MIPI输出的同学。1. 两种模式的核心区别一个是直播流一个是发邮件1.1 用生活化的方式先建立直觉要理解video mode和command mode不要一上来就啃协议先用两个场景建立直觉。Video mode可以理解成电视台直播。主机端的GPU或显示控制器把像素数据连续不断地推到屏幕上屏幕这边没有自己的“记忆”播到哪一帧就是哪一帧。数据流一旦中断画面就闪、花、黑因为屏幕根本没有东西可以兜底。这种模式下屏幕只是个“显示器”所有时序都由主机控制什么时候发行同步、什么时候发场同步、每行留多少空白全部听主机的。Command mode更像是“发邮件 本地播放”。主机先把一帧画面的像素数据打包成命令通过MIPI总线写进屏幕驱动IC自带的GRAM图形随机存取存储器。写完之后主机就可以撒手不干了屏幕内部的控制器会自己反复从GRAM读数据刷新显示面板。你可以把GRAM理解成屏幕自带的“相册”主机负责往相册里塞照片屏幕负责自己翻页给大家看。主机想改显示内容只需要再发一封新邮件把相册里的某张照片替换掉。这两种模式最直观的差异就出来了video mode没有帧缓存必须持续供流command mode有一整帧的缓存可以“断供”但画面依然不变。这个差异决定了后面几乎所有行为和选型。1.2 关键差异对比表我把日常项目里最关心的几个维度列成一张表方便你快速决策。对比维度Video modeCommand mode数据流向主机持续推流无帧缓存主机一次性写入GRAM面板自刷新时序控制方主机SoC/FPGA决定全部时序面板内部TCON决定刷新时序总线占用持续占用刷新率越高占用越高只在更新画面时占用静态时可休眠功耗表现相对偏高总线始终活跃静态画面下极低适合低功耗色彩深度支持RGB888/RGB666/RGB565等同样支持但取决于GRAM带宽局部刷新不支持整帧推流支持可以只改GRAM的部分区域撕裂Tearing一般不会主机就是时钟源可能出现需要TE信号同步成本面板IC相对便宜无大缓存面板IC需要集成GRAM成本更高典型场景手机导航、视频、车载、工业HMI穿戴设备、AOD息屏显示、低功耗IoT这张表不是绝对的因为现在很多中高端屏把两种模式都做进去了但底层逻辑确实是这样一个分水岭。1.3 为什么同一个协议里要同时保留两种模式很多人会问既然MIPI DSI是同一个协议族为什么非要搞两种视频路径直接统一成一种不行吗这个问题要回到显示面板的历史。早期智能手机屏幕分辨率不高但非常在意功耗。如果采用video mode即使显示的是静态时钟界面主机也得不断推流总线一直跑高速功耗根本降不下来。于是command mode出现了主打一个“写完一帧就睡觉”非常适合当时待机功耗要求极严的手机产品。到了后来屏幕分辨率一路从720P干到2K、4K刷新率也从60Hz卷到120Hz甚至144Hz显示内容也从“静态为主”变成“视频为主”。这时候video mode的优势越来越明显实现简单不需要面板内置大容量GRAM成本可控而且画面实时变化时总线也不会成为瓶颈。所以现在大屏、高刷、车载屏基本都走video mode而手环、手表这类对功耗极度敏感的小屏依然大量使用command mode。协议在设计之初就保留两种模式本质上是给“功耗”和“成本”这两个互相拉扯的诉求留出了选择空间。对驱动工程师来说搞清楚你手上的屏幕属于哪一类是点屏的第一步。2. 工作机制和时序细节看懂这些才算入门2.1 video mode的时序参数与burst模式Video mode下主机必须按非常精准的节奏发送像素数据。屏幕数据手册里通常会给出HSA、HFP、HBP、VSA、VFP、VBP这样一组参数很多人第一次看到就懵了。其实它们就是行同步和场同步前后的消隐区。说直白点显示一帧画面不是把有效像素一行一行发完就结束了。每一行有效像素前面要留一段水平前肩HFP后面要留一段水平后肩HBP行同步信号本身还有一段宽度HSA。垂直方向也一样每一帧有效行前后分别有VFP和VBP帧同步本身有VSA。屏幕的数据手册会给出这些参数的推荐值主机端必须严格按照推荐范围设置。MIPI DSI在video mode下还分三种子模式Non-burst mode with sync pulses每一行都会单独发同步开始和同步结束包时序和传统RGB接口最接近容易理解但包开销最大。Non-burst mode with sync events不单独发行同步开始包只发同步事件包比上一种省掉一些字节。Burst mode空白期不做“歇口气”的动作直接把有效像素数据压紧连续发送传输效率最高也允许主机在消隐区降低时钟频率是当前手机和车载平台最常用的模式。在配置burst mode时需要算一下DSI时钟频率。举个例子一块720x1280的屏幕24bit RGB60Hz刷新率。假设H_total为880含消隐V_total为1330含消隐那么像素时钟就是880×1330×60约70.22MHz。总比特率等于像素时钟乘以每个像素的位数约1685Mbps。如果使用4条数据lane每lane速率约421Mbps。算完之后还要留10%到15%的裕量因为DSI包还有头、尾、校验等开销所以实际配置在450Mbps到500Mbps附近比较稳妥。我见过不少人直接从别人工程里抄一个“每lane速率”完全不看屏的原始时序结果就是换一块分辨率稍微不同的屏就开始闪或者出现水平细线。正确的做法永远是先拿屏规格书里的时序参数自己算一遍再去填平台配置。2.2 command mode的GRAM写入流程与TE同步Command mode的核心动作是“往GRAM里写数据”。正常流程是这样的主机先通过DCSDisplay Command Set命令设置显示窗口常见的是CASETColumn Address Set和PASETPage Address Set也就是告诉屏幕“我要往哪个列范围、哪个行范围写”。然后发Write Memory Start0x2C后面跟着的就是实际的像素数据。数据量取决于你写的窗口大小如果只改一个时钟图标你只需要更新那个小区域的GRAM而不用整帧推流这就是command mode局部刷新的基础。但这里有个隐藏问题——撕裂。屏幕内部TCON在不停地从GRAM读数据去刷新面板。如果主机在屏幕正在读GRAM的中途写入新数据那这一帧就会出现上半部分是新内容、下半部分是旧内容的情况画面从中间撕开一条线。为了解决这个问题面板会提供一个TETearing Effect信号通常是一个垂直同步脉冲主机收到TE后在安全的窗口期内写入新数据保证写GRAM和面板读取之间错开。TE信号的同步非常关键。我在项目里遇到过一次诡异现象屏幕大部分时间正常但偶尔顶部闪一下细线。最后用逻辑分析仪抓TE和帧写入时间发现主机是在TE上升沿后立刻开始写而面板要求的是TE下降沿后延迟一段特定时间才允许写厂商代码里根本没做那个延迟。所以调试command mode时一定不要只盯着像素数据TE时序和写窗口的配合才是重点。另外command mode的“功耗低”是有前提的画面更新频率越低总线休眠时间越长功耗优势越明显。如果你用command mode跑60fps的实时视频那总线照样全程高速干活功耗优势几乎消失反而因为GRAM带宽限制可能还不如video mode流畅。所以指挥棒应该交给应用场景。2.3 一个常见误区模式不是你随意能选的在实际选型和调试中我发现一个高频误区有人以为video mode和command mode是主机端想用哪个就用哪个。真实情况是屏幕驱动IC必须先被初始化成对应的工作模式主机端才能发对应的数据流。如果屏的初始化序列把寄存器配置成了command mode那主机必须以command mode发包反之亦然。像ST7701S这类常见MIPI DSI驱动IC手册里就有一段指令是配置扫描方向、分辨率和工作模式的内部寄存器会决定这个panel是“自刷新模式”还是“外部驱动模式”。初始化序列里还经常伴随延时等待因为IC内部上电、DCDC稳定、PLL锁定都需要时间太快发后续命令会导致命令被丢弃。这也是为什么很多人从原厂拿到的初始化序列是“一条命令 一个延时”循环的结构。所以调试的第一步永远是先确认屏支持什么模式然后通过初始化序列把IC配置成目标模式再让SoC或FPGA的主机端按同一个模式工作。两边不一致的时候症状往往是命令模式回读正常但画面不更新或者video mode下能点亮但刷新一会儿就花屏。3. 选型决策与平台配置从RK到VBT再到FPGA3.1 不同应用场景下怎么选模式选模式其实是选架构。我把真实项目中常见的几类需求归纳一下。如果你的产品是手环、手表、电子价签这类以静态界面为主、对电池续航极为敏感的设备那command mode基本是必选。它支持局部刷新更新一次内容后MCU可以进入深睡眠屏幕继续显示这种能力是video mode给不了的。如果你的产品是平板、车载中控、工业触摸屏这类需要持续交互和视频显示的设备那优先考虑video mode。理由很简单高分辨率高帧率下实时推流功耗并不比“写GRAM再自刷新”高太多而且省掉了面板GRAM的成本。车载屏还要考虑可靠性video mode由主机统一控制时序在复杂温度环境下比屏内自刷新更可控。有一种折中方案我也见过屏本身支持video mode但显示静态内容时主机切到低功耗模式并降低刷新率。很多SoC的DSI控制器支持这种动态切换但切换时机和面板寄存器配合必须做充分测试否则容易出现切换瞬间闪屏。我的建议是项目初期架构评审时就把工作模式定死别留“两边都配一下”的模糊空间。3.2 RK平台点亮MIPI屏幕的流程与初始化序列如果你用的是RK系列平台点亮一块MIPI屏幕的流程基本是设备树里配好DSI节点、面板节点、时序参数驱动加载后通过I2C或DSI命令向屏幕发送初始化序列最后启动显示流。RK平台在设备树里一般会看到这样的结构dsi_panel节点里包含compatible、status、enable-gpios、reset-gpios、backlight、init-sequence以及display-timings节点。init-sequence的格式就是把原厂给的寄存器配置翻译成数组每一组包含命令类型、延时、命令长度和命令数据。在实际点亮ST7701S这类屏的时候有几个容易踩的坑。第一是重置时序复位引脚拉低后必须保持足够时间再拉高拉高后要延时再走初始化命令很多点不亮问题其实是复位时序太短。第二是初始化序列里的延时给得太短命令会被IC吞掉尤其PLL相关的配置命令延时不足会导致整块屏起来后色彩不对或闪烁。第三是display-timings里的参数和面板规格书要一致如果HFP配错了显示区域会偏移或者出现竖条。RK平台的另一个常见坑是MIPI DSI的lane数和byte clock配置。设备树里配了4 lane但PCB实际只走2 lane就会出现时序完全不收敛、点屏时好时坏的现象。硬件设计时lane数必须和软件配置严格一致还要在设备树里同时检查>
返回列表