
最近在调全志T527的MIPI DSI屏前前后后折腾了差不多一周总算把这块硬骨头啃下来了。抽空把整个调试过程整理出来既是给自己做个备忘也希望能给后面在这块平台上调屏的兄弟省点时间。先交代一下背景。项目用的主控是T527这是一颗8核的ARM SoC里面集成了全志自研的显示引擎DE2和MIPI DSI控制器。屏幕模组是一块1080x1920的5.5寸MIPI屏4 lane时钟频率跑在891Mbps左右。整套方案在硬件上其实已经比较成熟主要的工作量集中在软件适配和调试上。1. 调试前的准备工作1.1 确认硬件通路拿到板子先别急着写代码第一步永远是确认硬件通路是否正常。MIPI DSI的硬件通路说复杂也复杂说简单也简单无非就是控制器 - PHY - 排线/走线 - 屏幕模组。但这条链路上任何一个环节出问题表现都是黑屏或者花屏排查起来非常折腾。我的习惯是先用万用表确认以下关键节点的供电和信号VDDIIO电压T527的DSI PHY电平一般配1.2V或者1.8V要跟屏幕模组的IO电平匹配。我们这块模组用的是1.2V接反了轻则显示异常重则直接烧PHY。VCC模拟电源PHY的模拟供电通常1.2V纹波要求比较高最好示波器确认一下上电瞬间有没有大的跌落。VDD_LED背光供电这个电压一般5V到12V不等需要注意背光驱动的使能引脚和PWM引脚有没有接对很多黑屏其实是背光没亮并非信号问题。RESET脚屏幕的复位引脚必须确认SoC这边有对应的GPIO控制而且电平逻辑要对。有的模组是低有效有的高有效一定要看模组的规格书。确认完供电和GPIO之后还需要拿示波器看一下MIPI的时钟和数据走线有没有断路或者短路。经验之谈排线座虚焊、FPC排线折痕处断线这两类问题占了硬件故障的八成以上。如果有条件最好把CLK lane和每个data lane的对地阻抗都量一下MIPI差分线对地阻抗一般在100欧姆左右偏差不超过10%偏差大了就要怀疑layout或者贴片有没有问题。1.2 确认屏幕模组参数硬件通路没问题之后就要仔细研究屏幕模组的规格书和初始化代码了。MIPI屏跟以前老的RGB接口屏有一个很大的区别RGB屏是并行接口行场同步信号由控制器直接给出屏幕本身不需要太多配置而MIPI屏是串行接口屏幕内部带有一颗TCON时序控制器上电之后必须先通过DSI命令把TCON初始化好屏幕才会正常工作。因此屏幕模组的初始化序列变得格外重要。一般模组厂会提供一份初始化代码格式类似39 02 00 00 00 00 06 FC 01 00 02 00 00含义是包类型39表示DCS长写、通道02表示VC 0、数据类型00表示DCS、等待时间00表示不等待、参数长度和参数内容。拿到初始化代码后第一件事不是直接往驱动里塞而是先人工分析一遍。重点看几个关键命令B0开头的命令一般是进入扩展命令模式的开关很多屏幕需要先发B0命令解锁才能发后续的寄存器配置命令否则后面命令全部被忽略。C2、C6等命令配置TCON内部的时序参数包括HFP、HBP、HSA等。这些参数异常会导致显示偏移、撕裂甚至花屏。3C命令如果是写入Gamma曲线一般放在初始化序列的最后参数比较多需要对照规格书确认有没有写反。这些命令如果有含糊的地方宁可多花时间跟模组厂确认也不要猜。因为猜错一个参数后面排查问题可能要花好几倍的时间。我在这块屏上就吃过亏模组厂给的初始化代码缺了B0解锁命令直接塞进去屏幕完全没反应排查了半天最后发现是第一行命令没执行。2. T527平台上MIPI DSI的关键配置2.1 DTS配置解析全志平台用设备树来描述显示相关的硬件配置T527也一样。在开始调试前先把设备树里跟显示相关的节点理清楚。T527的显示路径从底层到顶层大概是TCON-DSI-DWC_MIPI_DSI-LCD整体架构跟全志上一代平台基本一致但寄存器细节有差异。先从LCD节点说起它在设备树里通常长这样lcd0 { lcd_used 1; lcd_if 4; // 4表示MIPI DSI接口 lcd_x 1080; lcd_y 1920; lcd_width 68; // 屏幕物理宽度mm lcd_height 121; // 屏幕物理高度mm lcd_dclk_freq 162; // pixel clock单位MHz lcd_pwm_used 1; lcd_pwm_ch 7; lcd_pwm_freq 20000; // 背光PWM频率20KHz lcd_pwm_pol 0; lcd_dsi_if 0; // DSI接口类型0为video模式1为command模式 lcd_dsi_lane 4; // DSI lane数 lcd_dsi_format 0; // 0为RGB888 lcd_dsi_bits 0; // 每通道bit数0表示8bit lcd_dsi_te 0; // TE引脚控制 };这里面有四个参数直接决定了屏幕能不能点亮我逐个说一下。第一个是lcd_if代表接口类型。全志平台里4是MIPI DSI2是RGB3是LVDS1是CPU接口。这个参数很好理解但很容易被忽略。第二个是lcd_dclk_freq这是像素时钟频率。它的计算方式是用屏幕的刷新率乘以总像素数。以1080x1920为例如果刷新率60Hz那么dclk 60 * (1080 HFP HBP HSA) * (1920 VFP VBP VSA)注意这里不是直接用1080和1920相乘而是要加上消隐blanking时间。具体时序参数要从模组规格书或者初始化代码里找。我们这块屏的时序比较常规HFP32HBP32HSA4VFP16VBP16VSA4算下来dclk大概在160MHz到162MHz之间。如果你算出来的dclk和屏幕规格书推荐的差很多先别急着改配置回头检查一下时序参数是否读错了。第三个是lcd_dsi_lane。T527最多支持4 lane如果屏是4 lane就是42 lane就填2。lane数不要随便填因为DSI的带宽计算跟lane数直接相关。第四个是lcd_dsi_if。T527的DSI控制器支持video模式和command模式两种工作方式。绝大多数屏用的是video模式也就是SoC这边通过持续的数据传输把画面刷新到屏幕上。command模式则是屏幕内部有帧缓存SoC只把变化的部分刷新过去。command模式对带宽要求低、省电但是对TCON的要求高而且驱动复杂度也更高一般不太常用。除了LCD节点还要看DSI控制器的节点dsi0 { status okay; pinctrl-0 dsi0_pins; pinctrl-names default; };这里的pinctrl引出了DSI的物理引脚。如果引脚没有配置好DSI的时钟和lane都出不来信号屏幕自然不亮。T527的DSI引脚一般是专用的需要确认是否有和其他外设复用冲突这个问题在之前的项目中踩过无数次了。2.2 DSI时钟链路配置T527的显示时钟链路比较复杂它是多层PI调节API/DPI/CCI的结果调试时最容易出问题的就是时钟频率对不上。大致流程是PLL - DSI_PHY_CLK - MIPI_DSI_CLK - HS时钟其中PLL用的是系统里专门的MLA/MB模块需要设一个合理的频率。DSI控制器内部要对这个PLL的输出做分频和倍频最终算出DSI的bit clock。对4 lane的1080x1920-60Hz屏来说理论上需要的DPHY bit clock可以这样估算每lane的data rate dclk × 24 / lane数 162 × 24 / 4 972Mbps不过这只是理想值实际还要考虑DSI包的包头、ECC、CRC等额外开销最终出来的数值往往要比理论值高一点。T527平台在设置硬件时钟时一般要求你直接把最终的bit clock配进去然后硬件自动推导出PLL分频。如果你的DTS里填的dclk和实际配置的bit clock逻辑对不上最常见的现象是屏幕有画面但画面偏斜、上下滚条或者画面很难看。这里提一个调试小技巧全志平台有disp这个sysfs节点可以用来查看当前的显示时钟信息。cat /sys/class/disp/disp/attr/sys_info如果看到输出里显示的dsi_rate、lcd_dclk这些值和DTS里配置的不一致就说明时钟链路计算逻辑有问题。这种问题多半不是DTS没配对而是驱动版本里对时钟的配置逻辑有bug或者固件里隐藏了别的覆盖机制。2.3 屏幕初始化时序确认拿到屏幕的初始化代码后需要把关键的时序命令和规格书对应起来看这一步是决定成功或者失败的核心。大部分MIPI屏幕的初始化代码最后面都会有一段35 02 00 00 00 00 05 2A 00 00 01 37之类设置显示窗口的命令2A和2B命令分别是设置列地址和行地址。如果你的屏幕没有设窗口或者窗口设错画面会只显示部分内容或者内容移位了这不算真正的黑屏是那种一眼能看出问题的异常。初始化代码里还有两类命令需要特别留意C0/C1/C2这类命令配置的是TCON内部时序。如果这几条命令参数写错了屏幕虽然能亮但是显示会有撕裂、横条纹、闪烁之类的现象非常难排查。遇到这类问题我建议先把刷新率降下来比如从60Hz降到48Hz试试如果问题减轻或者消失大概率就是时序参数的问题。E1/E2这类命令配置的是DPHY的训练参数包括HS settle时间等。这类参数如果不对屏幕会随机性闪屏、偶发性黑屏有时候一模一样的配置这版固件好的下版就坏了原因就在这。模组厂给的初始化代码一般都比较保守很多参数留的余量比较大只要能点亮能正常工作建议优先使用原始参数不要自己瞎调。2.4 背光控制与上下电时序屏幕的背光虽然不是DSI信号的一部分但是在实际调试中背光的时序经常是导致黑屏的元凶。T527平台一般由一个PWM控制器负责背光亮度调节由一个GPIO负责背光使能。调试中务必测量一下背光的上下电时序是否符合屏幕规格书要求。以常见的MIPI屏为例典型的上电顺序是VDD数字电源上电稳定10ms后拉高RESET完成复位等待10ms初始化MIPI信号初始化完成后再点亮背光问题通常出在背光亮得太早。如果屏幕还没完成MIPI初始化就点亮背光你看到的不是正常图像而是白屏或者花屏而且这种异常往往会在开机瞬间出现过一秒又恢复正常特别迷惑。T527平台在驱动里用lcd_pwm_enable和lcd_bl_enable两个回调函数来控制背光的先后顺序调试时可以在函数入口打印日志确认执行顺序。3. T527 DSI控制器与驱动适配3.1 控制器内部结构T527的DSI控制器从软件角度来看可以分成三个主要模块DWC MIPI DSI Host这是IP内部的核心控制逻辑负责把像素数据打包成DSI协议包发送给PHY。DWC MIPI DSI PHY负责高速信号的物理层收发把并行数据转成差分串行信号。TCON时序控制器负责把DE2引擎输出的像素流转换成符合屏幕时序要求的数据流。这三个模块分工明确调试时排查问题也可以按这个顺序来先确认TCON输出是否正常再检查DSI Host的包格式是否正常最后看PHY的物理信号是否正常。T527的驱动代码在drivers/video/fbdev/sunxi/disp2/disp/lcd/目录下LCD驱动是一个独立文件屏幕初始化代码一般直接写在lcd_open_flow函数里调用LCD_OPEN_FLOW宏或者LCD_SET_TIMING宏。全志平台的驱动架构长期维护虽然跨越了几代芯片但基本框架没变如果你之前调过A64、T507的屏上手T527会很快。3.2 驱动中初始化序列的写法屏幕的初始化序列在驱动里通常是一个结构体数组每一项表示一个命令包。以全志平台的写法为例static LCD_EXTEND_INIT_PARAM lcd0_mipi_init[] { // 命令类型参数长度参数 {LCD_EXTEND_INIT_DCS, 6, {0xFC, 0x01, 0x00, 0x02, 0x00, 0x00}}, {LCD_EXTEND_INIT_DCS, 5, {0xB0, 0x00, 0x00, 0x00, 0x04}}, {LCD_EXTEND_INIT_DCS, 2, {0xB1, 0x00}}, {LCD_EXTEND_INIT_DCS, 2, {0xB2, 0x00}}, // ... 后续更多初始化命令 {LCD_EXTEND_INIT_DCS, 1, {0x29}}, // Display On };写初始化序列时有几个常见错误需要特别注意一是命令类型不要写错。全志驱动里有LCD_EXTEND_INIT_DCS、LCD_EXTEND_INIT_GPIO、LCD_EXTEND_INIT_DELAY等类型DCS是标准的Display Command Set直接发给屏幕GPIO类型是控制SoC引脚的DELAY类型是延时。很多人第一次写的时候把DELAY命令写成了DCS结果初始化序列在驱动里全部按DCS发出屏幕完全不知道你想干嘛。二是命令长度和参数数量必须严格匹配。驱动根据长度字段决定发几个字节如果长度写多了会把后面几条命令的参数一并吃掉写少了命令不完整屏幕根本不会理会这条命令。三是屏的Sleep Out命令要谨慎。模组初始化代码里的第一条命令往往就是11Sleep Out表示让屏幕从睡眠状态唤醒。在驱动里11命令需要在MIPI时钟稳定之后再发否则屏幕没收到相当于初始化失败。有些驱动里在Sleep Out后面还会要求一个29Display On这两条命令的位置和间隔很重要建议严格按照模组厂给的时序来。3.3 DSI包格式与Video模式时序T527的DSI控制器在video模式下需要把TCON输出的数据按照屏幕分辨率切分成DSI包。具体来说每一行的像素会被封装成多个blkblock每个blk又分成HSA、HBP、HACT等多种包类型。这些参数的配置在驱动对应的lcd_dsi_timing结构体里通常由模组厂给出或者通过工具计算得出。如果配置错误最典型的现象就是屏幕两侧出现黑色竖条或者整个画面水平偏移并且伴随着细噪点。我调试中遇到过一种比较隐蔽的情况HSA和HBP配错了但数值恰好很接近屏幕表面上看一切正常只有播放视频或者滚动界面时屏幕顶部偶尔出现一条细线。这种问题用肉眼盯着看很难发现排查了一段时间后我回头又仔细看了时序参数对比规格书发现HSA应该是4配置里写成了5修正之后一切正常了。这类问题提醒我们MIPI DSI调试时物理层的时序参数必须一丝不苟。这些参数不像软件逻辑那样可以通过打印日志定位它们完全靠计算和对比错了就是错了没有任何debug输出会告诉你。4. 实测问题与排查记录4.1 屏幕不亮这是最基础也最让人沮丧的问题屏幕一点反应都没有背光也不亮或者亮了但无图像。排查这个问题我有一套固定的套路供大家参考第一步确认电源。量VDD、VDDI、VCC是否都有电电压值是否在屏的规格范围内。第二步确认复位。用示波器抓RESET引脚的波形确认它有从低到高的跳变而且高电平时间满足要求。第三步确认初始化代码执行了。在驱动初始化函数里加printk确认开机过程中初始化函数确实被调用调用顺序是否正确。第四步确认MIPI信号。用示波器或者逻辑分析仪抓DSI lane上的信号。如果屏完全没有响应CLK lane上应该有持续的HS时钟信号如果没有信号说明DSI控制器没有正常工作或者PHY没有power up。在这四步里第四步其实是很多人的盲区。我见过不少同事屏幕不亮就反复调初始化代码折腾了一整天后发现是MIPI CLK lane根本没信号因为设备树里DSI节点的status没有设置成okay。这种低级错误特别容易犯所以每次排查都要提醒自己先确认信号在不在再谈要不要改代码。4.2 花屏屏幕上能看到内容但是画面花掉、颜色不对、有条纹或者有噪点。这类问题通常不是硬件失效而是信号质量或者时序配置的问题。花屏的第一类是颜色完全不对画面发绿或者发紫。这种情况大概率是lcd_dsi_format配错了。0是RGB8881是RGB6662是RGB565看模组规格书确认屏是几位的配错之后颜色通道错乱画面看起来就是奇怪的偏色。花屏的第二类是画面有颗粒感或者噪点这个通常跟HS时钟的建立时间有关。DSI的HS信号在lane上传输时有严格的上升/下降时间要求如果PHY的驱动能力不足或者布线太长信号在接收端就无法正确采样结果就是屏幕上随机出现噪点。这种情况可以通过调整PHY的HS校准寄存器来缓解比如T527平台驱动里会有一个类似hstx_cklp_sel这样的参数适当增大可以改善信号质量。但要注意这个参数不是越大越好增大到一定程度反而会因为过度驱动导致信号振铃效果更差。调整好后需要反复压测确认长时间运行不花屏。花屏的第三类是画面撕裂tearing。T527的DE2引擎和DSI控制器分工不同如果两者之间的同步没有配合好画面更新过程中就可能出现上半帧和下半帧来自不同画面的情况。这需要开启te同步功能或者在驱动里配置VSYNC同步。T527平台可以通过lcd_dsi_te参数控制TE引脚的配置调试时可以先关闭TE确认撕裂现象是否消失。如果关闭TE后不撕裂了说明问题确实出在同步上再回头检查TE引脚的接线和配置。4.3 屏幕亮一会儿后黑掉这个现象比前两个更折磨人开机的时候屏幕正常显示可能是几秒钟也可能几分钟后屏幕突然黑了或者出现异常之后怎么按都没反应。这种问题多半是电源方面的问题。T527的显示链路对电源的纹波比较敏感尤其是PHY的VCC如果纹波过大会导致PHY工作不稳定出现随机性关断。用示波器抓一下屏幕点亮期间VCC上的纹波如果超过100mV就有点危险了。但也不能排除软件因素。有一种可能是初始化超时问题DSI控制器在启动后有一个内部超时机制如果屏幕没有在预期时间内完成应答控制器会主动关断输出。这种情况在驱动日志里可以看到类似link timeout或者crc error的输出。遇到这种问题检查初始化序列是否正确、屏幕是不是没有正确进入video模式然后检查总线上的ESD保护或者信号线连接。4.4 屏幕闪烁/水波纹显示内容可以看清但是会周期性闪烁或者画面中有类似水波纹的纹路。这种问题通常跟PWM频率或者刷新率和显示内容的交互有关。背光PWM频率太低了会让人眼感觉到闪烁。一般建议PWM频率至少要在20KHz以上T527平台的PWM控制器支持到比较高的频率把lcd_pwm_freq设到20K到30K都没问题。如果用的还是默认的几百Hz或者几KHz的频率屏幕亮起来就是明显可见的闪烁。还有一种闪烁跟背光无关是屏幕内部的VCOM电压偏移问题。这种问题一般没法通过软件彻底解决只能说尽量避免屏在低亮度下工作或者调整Gamma曲线来掩盖。如果屏在最高亮度下闪烁那可能是屏本身的质量问题找模组厂解决吧。5. T527 DSI常见参数速查与踩坑总结5.1 调试中建议的时序配置调试期间建议把屏幕的刷新率稍微降低一点比如从标准的60Hz降到50Hz这样HS时钟变慢信号质量余量更大可以先确保能点亮、能显示再逐步把参数调回标准值。如果降低刷新率之后屏幕还是完全不亮问题就基本不是时序参数而是更底层的时钟或者电源问题。5.2 这轮调试踩过的坑这次调T527屏幕踩了三个比较有代表性的坑在这里如实分享一下。第一个坑是第一版设备树里lcd_dsi_format写成了RGB666但屏幕实际是RGB888。结果画面整体偏绿检查了半天没找到原因后来偶然发现是format不对。为什么会偏绿RGB666是18位色数据位比RGB888少了6位颜色分量错位之后画面就会有明显的色偏。这种问题看画面表现就能猜到方向但最好还是仔细核对自己写的每一个配置。第二个坑是屏幕初始化代码里缺失了B0解锁命令。模组厂初始给的代码里漏了这一条屏幕收到后续所有命令都直接忽略画面一片漆黑。后来对比新版文档发现了问题在初始化序列开头补上B0命令屏幕立刻点亮。这让我深刻体会到模组厂给的初始化代码也要带着怀疑的眼光去看不能全盘接受。第三个坑跟时钟计算有关。T527平台在DTS里配置的dclk和实际驱动用到的bit clock之间有一层换算关系一开始我们直接套用了之前T507平台的计算方式结果屏幕显示只有半边另外半边是噪点。后来跟踪驱动打印的时钟信息才发现是bit clock不对重新计算之后显示正常。不同平台的时钟链路细节有所不同不能盲目复用。5.3 调试工具与检查清单对于T527平台上的MIPI DSI调试我的日常调试工具比较简单示波器必备最好带宽1GHz以上用来确认MIPI信号质量。如果没有足够的带宽抑制不住信号的高频噪声测量就不准确可能导致误判。万用表和直流电源分析仪确认各路电源的电压和纹波。逻辑分析仪要支持差分信号用来抓DSI的命令包时序。下面是我整理的一份调试前的检查清单每次调新屏之前过一遍可以减少很多不必要的返工检查项说明屏幕供电VDD、VDDI、VCC电压和电平匹配复位引脚RESET电平逻辑和时序背光使能和PWM背光引脚接法正确PWM频率不低于20KHzDSI lane数屏是4 lane还是2 laneDTS必须一致像素格式RGB888还是RGB666颜色通道对应关系DCLK频率根据屏幕时序计算确认和屏规格一致初始化序列确认B0解锁命令存在命令长度正确Video/Command模式确认屏幕支持的DSI工作模式TE引脚确认屏幕是否使用TE同步引脚接法和配置上下电时序确认背光点亮晚于初始化完成5.4 后续还可以扩展的内容这次的调试目标是把屏幕点亮、能正常显示内容至于更深入的优化还有不少可以做的方向。比如全志平台的显示引擎有ust微码调度相关的调节参数可以用来优化刷新率和功耗再比如画面增强相关的色彩饱和度调节、动态背光等功能配置起来又是一块不小的工程。这些后续项目有需要的时候再单独展开写。最后再分享一个小技巧调试MIPI DSI屏最怕的问题就是初始化序列改动后看不到任何效果因为你不确定屏幕到底有没有按预期执行。T527平台在显示驱动里有一个隐藏的接口可以dump当前DSI总线上实际发送的数据调试时用这个看一下实际发出去的命令跟预期一对比就知道问题出在哪一步了。这个接口具体的位置在驱动代码的disp_dsi_ops结构体里有兴趣的可以顺着这个线索翻翻代码调屏会轻松很多。