ARTICLE DETAIL

资讯详情

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

全志T527平台MIPI DSI调试全流程:从黑屏到正常出图

全志T527平台MIPI DSI调试全流程:从黑屏到正常出图 全志T527平台上的MIPI DSI调试是我最近做BSP调试时花时间比较多的一块。前后折腾了两三天从完全黑屏到正常出图中间踩了不少坑也积累了不少经验。这篇文章把整个调试链路完整复盘一遍包括设备树配置、初始化序列、时序计算和排查技巧给后面接手T527或者其他全志平台屏幕调试的朋友一份可以直接参考的实操手册。如果你手上正好有块MIPI DSI屏要配T527或者只是对Linux下显示调试链路感兴趣这篇文章都值得花几分钟看完。全文不依赖平台封装库纯从设备树、驱动、寄存器层面展开理解了这套流程换到其他SoC上也能举一反三。1. 调屏之前必须搞懂的显示通路1.1 T527的显示链路到底怎么走全志T527是一颗8核Cortex-A55的工业级SoC显示接口上给了RGB、MIPI DSI、LVDS、DP等选择。MIPI DSI在平板、工控、车载等场景里用得最频繁因为它引脚少、速率高还支持DCS命令控制屏幕。从SoC出来到屏幕点亮中间要经过这样一条链路DEDisplay Engine负责图像合成和叠加生成图像数据TCONTiming Controller负责把图像数据转成具体的像素时序DSI Controller按照MIPI DSI协议把并行的图像数据串行化DPHY负责物理层的高速差分信号传输经过排线、FPC之后数据最终进到屏幕面板的驱动IC里。这条链路里任何一个环节配置错结果都是黑屏或者花屏。我调试时最深的体会是最好先从数据流的角度把链路理清楚再去动手改设备树。如果你连TCON和DSI Controller都分不清出了问题很容易乱试。在T527的BSP里这部分的驱动通常长这样display_subsystem作为总入口下面挂tcon、dsi、panel这些节点panel是最后端的一个抽象。驱动加载的顺序是从后往前先注册panel驱动再注册dsi host最后把整条链路绑定到display_subsystem上。1.2 MIPI DSI协议的三个核心概念MIPI DSI调试绕不开三个概念lane、时钟模式、传输模式。lane就是物理差分线对一组时钟lane加一组或几组数据lane。常见的是4数据lane加1时钟lane也就是所谓4-lane DSI。lane数越多同样的分辨率下每条lane跑的速率就越低对PCB布线、连接器、屏幕排线就越友好。T527上一般是1、2、4 lane可选具体用几条看屏幕规格书常见的1080P屏幕基本都跑4-lane。时钟模式里要搞懂HSHigh Speed和LPLow Power两种状态。图像数据基本都在HS模式下传输高速差分信号速率动辄几百Mbps到1Gbps以上DCS命令、初始化序列通常在LP模式下传输速率低但是抗干扰好状态切换的时候DPHY要遵循严格的时序要求这也是为什么初始化序列里经常会有延时等待。传输模式分Video Mode和Command Mode。Video Mode就是边传数据边显示屏幕不需要帧缓存数据流是持续的适合普通TFT屏Command Mode需要面板带RAM主控把数据写到面板内部的缓存里屏幕自己刷新适合OLED这类需要自刷新控制的屏。T527驱动的常规屏幕基本都是Video Mode调试时先确认屏厂给的规格书推荐哪种模式。1.3 屏幕规格书里的关键参数清单接手一块新屏不要急着接线刷系统先把规格书翻透。我整理了一份必看参数清单分辨率、bpp色深比如800x1280、24bit主频同步参数HActive、HBackPorch、HFrontPorch、HSyncPulse以及V方向的对应参数像素时钟DCLK或者pixel clock屏厂会给有时只给行场同步算好的推荐值DSI lane数、DSI传输速率、是否支持Burst Mode初始化序列init sequence一般屏厂会提供一段配置寄存器用的命令序列上下电时序power on/off sequence包括reset信号、电源等需要保持的先后顺序和延时工作电压包括logic供电和背光供电有时还有VCOM、VSP/VSN这些辅助电压我见过不少新手拿到规格书只看分辨率和接口定义就开干结果要么画面偏色要么黑屏。其实花半小时把上述参数整理成一张表后面调试会省很多时间。我自己是习惯把关键参数直接填到一个Excel模板里每调一块屏就更新一份后面出什么问题都能快速对参数。2. 设备树、驱动与初始化序列的正确姿势2.1 设备树里panel节点怎么填T527的Linux BSP现在基本走的是DRM/KMS框架设备树里会有一个display_subsystem节点再往下是tcon、dsi、panel这些子节点。我调试用的panel节点大概长这样dsi { status okay; #address-cells 1; #size-cells 0; panel0 { compatible myvendor,mipi-800x1280; reg 0; pinctrl-names default; pinctrl-0 dsi_dp_rm; /* 按BSP提供的引脚配置填 */ reset-gpios pio 2 10 GPIO_ACTIVE_LOW; enable-gpios pio 2 9 GPIO_ACTIVE_HIGH; vcc-supply reg_dldo1; backlight backlight; port { panel_in_dsi: endpoint { remote-endpoint dsi_out_panel; }; }; }; };panel节点里比较关键的几个属性compatible要跟驱动里match的字符串对应reset-gpios和enable-gpios控制屏幕的复位和使能供电逻辑一般通过regulator框架管理backlight节点用来控制背光。有些屏不需要独立的reset引脚有些屏的电源不止一路这些都要根据规格书来。我建议先把GPIO规格确认清楚比如是GPIO_ACTIVE_HIGH还是GPIO_ACTIVE_LOWreset信号通常低有效enable信号通常高有效接反了表现就是屏幕没反应或者上电时序不对。设备树里的port节点用于和dsi controller绑定这是DRM框架下panel连接到dsi的方式。如果port接错了驱动的probe可能直接失败屏幕连初始化命令都发不出去。2.2 panel-init-sequence的正确写法面板初始化序列是调试中最容易出bug也最耗时间的一块。屏厂给的初始化序列一般是几十条DCS命令格式五花八门有的给一串HEX有的给一张表有的甚至直接从屏厂FAE那里拿一个调试工具的配置文件。全志BSP的panel节点里初始化序列一般写成panel-init-sequence属性格式大致是每行为“命令类型数据”。举个简单例子panel-init-sequence [ 0x00 0x00 0x96 0x00 0x05 0xB9 0xF1 0x12 0x83 0x05 0xB0 0x03 0x0F 0x05 0xBA 0x01 0x83 ];这里的0x00 0x00表示延时一个单位0x96 0x00表示延时150us左右0x05开头通常表示一次短写命令。不同SDK版本对这段序列的解析规则略有差异但逻辑都是一样的延时、发命令、延时、再发命令。写这段序列时有几个坑一是延时时间不能随意删除很多初始化步骤是要求等内部电路稳定后才执行下一步二是命令长度必须正确少一个字节会导致整条命令解析错位屏幕大概率初始化失败三是有些屏幕需要在初始化序列最后额外发一条sleep out命令规格书里叫11h、29h之类的漏了就会一直黑屏。我调试的时候会先在uboot阶段跑一遍初始化序列能点亮再进内核这样能快速排除是设备树解析的问题还是驱动时序的问题。另外初始化序列一旦确定下来千万别在设备树里随手动顺序调整顺序可能触发屏幕保护或者状态异常。2.3 上下电时序为什么要单独测设备树里除了初始化序列还有power-on-sequence和power-off-sequence这样的属性用来定义屏幕供电和reset的先后关系。很多黑屏问题其实不是图像数据不对而是上电时序不满足要求。常见要求是先给逻辑电源稳定几十毫秒之后再拉高resetreset拉高之后等一些时间再发初始化序列。如果reset上电时序反了屏幕内部驱动IC可能处于锁死状态命令发过去没反应。我在调一块工控屏时遇到了一个很隐蔽的问题背光先亮了画面一直出不来。后来用示波器看了电源和reset波形才发现reset释放的瞬间vcc还在爬升电平没到阈值导致屏幕没有正常复位。修改了reset延时后问题立刻消失。所以调试黑屏时不要一开始就怀疑驱动代码先用示波器量一下各路电源、reset、backlight enable的波形把时序对齐了再谈其他的。这一步看起来费时间但能省下后面大量排查时间。3. 从黑屏到出图完整调试过程记录3.1 第一步u-boot阶段先验证通路全志的BSP在u-boot里就会做显示初始化如果u-boot阶段屏幕能亮至少说明硬件连接、电源、复位、时钟这些基础条件是通的问题多半出在Linux内核的设备树配置上。我调试T527时第一件事就是打开u-boot的logo开关在环境变量里设置好内核启动参数和显示输出选项然后重新编译u-boot。启动后如果屏幕上能出现logo就说明从TCON到DSI再到屏的这条链路基本没问题接下来专心调内核侧。如果u-boot阶段就黑屏那优先检查这些点屏幕排线是否插到位会不会存在虚焊电源电压是否正常背光是否独立供电reset、enable引脚有没有接反u-boot里配置的panel参数是否跟屏幕匹配示波器确认DSI时钟lane上是否有周期性信号我遇到过一种情况u-boot阶段屏幕能亮但内核起来后黑屏。这种往往是设备树里panel节点没有被正确probe或者初始化序列被驱动再次发送时出了错。可以在内核启动参数里加一些DRM/KMS打印选项把panel驱动probe过程的关键log抓出来。3.2 第二步用devmem确认DPHY状态如果u-boot能亮内核黑屏我一般先确认DSI控制器和DPHY是否正常工作。T527的datasheet里会列出DSI controller的寄存器基地址我用devmem工具直接读寄存器状态不需要重新编译内核非常方便。比如可以读DSI控制器的控制器使能位、时钟lane状态、数据lane状态看看传输是否处于HS模式。正常的链路读到状态应该是各lane处于运行状态而且数据在持续传输。# 假设DSI controller基地址为0x5450000按实际SoC手册为准 devmem 0x5450000 devmem 0x5450010如果寄存器状态不对比如lane一直处于LP状态或者没使能那大概率是设备树里lane配置有问题或者驱动没有成功初始化DPHY。有人会问为什么不用示波器量示波器当然最直接但高速差分信号不是每块开发板旁边都躺着高速示波器的。devmem读寄存器能在软件层面快速判断有没有数据在走先把软件问题排除掉再上示波器去验证物理层时序这样效率最高。3.3 第三步逐步排除问题定位黑屏原因一次典型的黑屏排查流程我是按下面这个顺序来的每步排查完都能缩小范围。第一背光是否亮。如果背光不亮查背光供电和使能引脚跟DSI链路无关如果背光亮但无画面说明电源通路正常问题在显示数据链路上。第二DSI是否有信号。用devmem或示波器看时钟lane有没有翻转。没有信号就用devmem确认DSI controller是否使能、TCON是否输出数据。第三panel是否正确初始化。看内核日志里panel驱动有没有probe成功初始化序列是否完整执行命令。初始化失败一般表现为背光亮但纯白屏或纯黑屏。第四时序是否匹配。如果逻辑正确但画面有偏移、撕裂多半是porch参数或像素时钟跟屏幕实际需求有出入。有一次调试中我读取内核日志发现panel驱动probe是成功的初始化序列也发出去了但屏幕就是黑屏。最后用demo板直接验证初始化序列才发现其中有一条命令长度标错了屏厂规格书里写的是写3个字节实际命令必须带5个参数。核对屏厂FAE后改了序列屏幕立刻点亮。这类问题有一个共同点设备树和驱动代码表面上都没报错实际上就是命令细节不对。所以不要只看日志级别要对照规格书逐条核对初始化序列。3.4 显示参数微调亮度、对比度和色彩屏幕点亮只是第一步画面偏色、亮度异常、对比度不对还要在驱动层做调整。普通LTPS屏幕一般会在初始化序列里设置VCOM、VSP、VSN电压和gamma曲线。VCOM是液晶偏压调大会偏白调小会偏黑需要根据屏厂推荐的寄存器值去设置。gamma曲线影响灰阶过渡一般屏厂会提供一组推荐的gamma命令。如果你发现屏幕暗部细节丢失或者亮部过曝多半是gamma没设置对。这类参数在全志BSP里通常也放在初始化序列里。我在调试一块屏时发现红绿蓝三色不平衡查了半天发现是初始化序列只发了RGB的顺序命令没有设置color format驱动默认是RGB888但屏幕内部实际是RGB666格式。补上color format设置后偏色问题立刻解决。所以屏点亮后先把红、绿、蓝、白、黑几个纯色画面依次显示一遍快速判断色序和色深设置是否正确再谈gamma校准。4. 常见问题速查与避坑经验4.1 黑屏类问题的排查流程现象可能原因排查方法背光不亮背光供电、背光使能引脚问题量背光电压检查GPIO配置背光亮、白屏屏未初始化或初始化序列错误核对DCS初始化序列、检查时序背光亮、黑屏无信号或DSI lane异常devmem查DPHY状态示波器量时钟屏幕闪一下后熄灭上电时序不满足或过流保护检查power-on-sequence、硬件短路画面偏移/撕裂porch参数或像素时钟不对对照规格书核对时序参数黑屏问题的排查核心就是背光、信号源、初始化、时序这四件事不要一下子跳到最后一步。很多工程师一上来就去翻驱动代码其实不如先量一下电源和GPIO物理层没问题再往上排查顺序对了效率翻倍。4.2 花屏、闪屏、波纹的成因分析花屏和黑屏机理不一样黑屏大多是链路不通花屏是链路通了但数据或时序不一致。常见的花屏原因有lane顺序不对。数据lane的物理连接顺序跟软件配置不一致导致数据错位画面像拼图碎片一样。像素时钟偏快或偏慢。画面会出现斜向条纹或者左右漂移调时钟能解决。数据位宽不对。屏幕内部是RGB666驱动按RGB888送数据颜色就会色调偏移或出现噪点。DSI速率过高信号完整性不足。高分辨率屏尤其容易这样出现噪点、波纹、间歇性闪屏。屏幕初始化序列里没配置好的扫描方向画面可能是倒的或者镜像的。闪屏还需要检查是不是背光PWM频率过低导致人眼看到闪烁这种情况把背光PWM频率调到1kHz以上就能缓解。另一种是主控端负载过高导致DSI时钟抖动屏幕显示就会一抖一抖的需要用devmem或perf确认带宽占用情况。4.3 调试排雷清单我自己在多次调屏里总结了一些容易踩的坑这里集中列一下帮你少走弯路。设备树里GPIO配置别想当然。reset信号是不是低有效、enable是不是高有效必须看具体屏幕主控的规格不能照抄别的屏幕配置。初始化序列必须严格按屏厂文档发。尤其注意延时。有些屏幕在初始化命令中间某个步骤必须等待几十毫秒否则后续命令被忽略。背光的开关尽量独立控制。如果背光和屏幕enable绑在一起调试时不好区分是屏幕问题还是背光问题。比如我习惯在设备树里用独立的backlight节点调试时可以单独开背光看状态。像素时钟要算对。这也是我建议一定要做的一个动作。以1920x108060Hz为例假设porch参数是HActive1920, HBackPorch120, HFrontPorch120, HSync8VActive1080, VBackPorch30, VFrontPorch150, VSync4那么像素时钟大概等于(1920 120 120 8) x (1080 30 150 4) x 60 2168 x 1264 x 60 ≈ 164.4 MHz如果是24bit、4-lane那DSI每条lane的速率下限是164.4 x 24 / 4 ≈ 986.4 Mbps屏厂推荐值一般取整到1Gbps左右实际配置时还要考虑时钟余量通常比这个下限高一些。如果设备树或者驱动里填的DSI速率比屏的实际能力和PCB走线质量所能承受的高很多那花屏和闪屏就随之而来。内核日志别只看error级别。很多初始化问题只表现为warn或者debug日志把DRM、DSI、panel相关的调试开关都打开能省很多猜测时间。5. 最后再分享一点调屏经验每次调屏幕我习惯先用最基本的配置把屏幕点亮不做任何花哨的功能。也就是说先把分辨率、时钟、lane数、初始化序列这几样最小配置搞定确认能稳定出图之后再去加backlight调节、睡眠唤醒、色彩增强这些功能。这样每次改动只引入一个变量出问题能立刻定位到是哪个改动引起的。我踩过最深的一个坑就是在一开始就相信了某个模板配置把大量时间花在对比模板和驱动差异上。后来重新开始从规格书出发自己配了一份最小设备树不到半天就点亮了。这让我养成了一个习惯每个项目的第一版显示驱动坚持自己从头写不复制粘贴。T527的MIPI DSI调试说难也难说简单也简单。难就难在链路长、参数多任何一个细节错了都出不来图简单是真的理解了链路每一级在干什么之后排查范围非常清晰。希望这篇调试记录对你有所帮助有机会的话后面我还会写写T527上DP显示接口和触摸屏调优的经验。
返回列表