尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

高通平台UEFI XBL点亮LCD全流程解析与调试实战

高通平台UEFI XBL点亮LCD全流程解析与调试实战 做过高通平台底软的兄弟对“UEFI XBL 点亮LCD”这套流程应该都不陌生。开机logo能不能出来决定了这板子能不能从产线活着走到用户手里。很多人以为点屏就是把屏参填对、背光亮起来就完事了实际上从PBL到XBL再到kernel中间任何一个环节掉链子结果都是“黑屏交差”。这篇就把整条链路掰开揉碎从启动架构、硬件接口、驱动初始化到调试排错按实际项目的点屏流程走一遍给你一份能直接拿去对照排查的实操手册。不管是刚接手BSP的新人还是被点屏debug折磨过几轮的工程师这篇文章都值得存一份。1. 先把启动链捋清楚PBL、XBL和UEFI到底各管哪一段点屏这事之所以容易一头雾水是因为很多人没搞明白LCD是在哪个Boot阶段被“点亮”的。高通平台现在的启动架构基本是PBL到XBL再交棒给kernel中间这个UEFI阶段的显示初始化就是我们要聊的主角。1.1 PBL和XBL的分工别再把它们混为一谈PBLPrimary Boot Loader是固化在硬件里的只读引导代码上电后CPU第一段执行的就是它。它的任务非常纯粹初始化最基本的DDR、时钟然后把下一级bootloader加载到内存并跳转过去。PBL本身不碰显示、不碰触摸、不碰任何外设的中高级初始化你要指望PBL去点亮LCD那是不可能的它连显示控制器的寄存器映射都没建好。真正干活的是XBLeXtensible Boot Loader。XBL在高通平台上是UEFI架构的实现分为XBL_Sec、XBL_Loader等子模块。其中XBL_Loader会加载UEFI环境之后运行一系列DXE驱动显示驱动DisplayDxe就是在这个阶段被加载并执行的。也就是说你在开机瞬间看到的第一个logo画面就是XBL阶段的DisplayDxe点亮的。这里有一个容易混淆的点很多老工程师习惯说“LK阶段点屏”。在高通旧平台比如MSM8996之前确实是由LKLittle Kernel来负责splash logo显示。但新一代平台已经全面切到UEFI XBLLK基本被ABLUEFI Application Boot Loader取代。ABL负责加载kernel和dtb同时也承接了显示初始化的任务。所以现在再谈点屏讨论的语境就是“UEFI XBL”而不是LK。1.2 UEFI在点屏这件事上的角色定位UEFI本身是一套固件规范不是某一家公司的东西。在高通平台上UEFI环境提供了一系列Protocol服务显示驱动通过标准接口去操作GPU显示控制器、DSI控制器和电源管理芯片。从软件栈来看点屏的调用关系大致是这样DisplayDxeDXE驱动负责面板参数的解析和DSI初始化命令的发送。DisplayPilDisplay Power Island Library负责显示相关的时钟和电源域控制。QDCMQualcomm Display Command Mode库负责把面板初始化序列转成底层寄存器操作。这层架构的优点是把面板的碎片化差异不同厂商、不同分辨率、不同IC隔离在配置文件里驱动代码本身不用反复改。缺点是配置文件一旦填错debug起来链路太长日志不够直观很多人栽在这里。2. LCD为什么会“黑”从硬件接口看点亮的前提条件聊驱动之前得先清楚屏幕本身需要哪些东西才能亮。很多人点不亮第一反应是改代码其实问题往往出在硬件条件没满足。2.1 常见的LCD接口类型DSI、LVDS、RGB别搞混标题里带了“40pin LCD接口”这个热词这里顺便展开说一下。40pin接口多见于RGB并口或者LVDS接口的屏幕这类屏幕在工控、车载、消费类产品上很常见。但高通手机/平板平台的LCD绝大多数走的是MIPI DSI接口。MIPI DSI是串行接口时钟通道Clock Lane加数据通道Data Lane通常1个时钟通道配1到4个数据通道。点屏时要确认你的屏究竟走几组Lane是1-lane还是4-lane这直接影响带宽和初始化配置。区分接口类型为什么重要因为软件配置完全不一样。DSI接口需要在驱动里配置lane数、lane映射、DSI PLL频率RGB接口需要配置像素时钟和DE/HCLK等时序信号LVDS则需要配置转换芯片的映射格式。不看硬件原理图直接套配置十有八九要翻车。2.2 屏幕要亮四个供电条件缺一不可LCD能显示画面以下四个条件基本是硬性要求逻辑供电VDD/VDDIO一般1.8V或2.8V给屏的驱动IC供电。模拟供电VDDA/AVDD通常是5.8V左右的升压给面板内部电路用。背光供电VBL/LEDLED灯串供电串数不同电压不同常见6串2并的需要boost升压到20V以上。复位时序RESET面板IC需要复位信号复位时序不对命令发进去是无效的。在XBL阶段点屏这些供电大多由PMIC电源管理芯片的LDO或GPIO控的boost电路提供。DisplayDxe初始化时会按配置好的顺序给这些电源上电顺序不能乱一般是VDDIO先上其次AVDD最后是复位释放。这个顺序面板规格书里都有。注意有些项目为了省电背光供电和显示供电是分开控制的。XBL阶段如果只看到屏幕有背光但没画面大概率是逻辑供电没上或者DSI没起来如果连背光都不亮先查PMIC配置。2.3 背光亮度控制在UEFI阶段怎么做背光控制本身不影响“点亮”但影响“能看到”。XBL阶段的背光控制一般有两种方式一种是PWM直接输出另一种是I2C调光比如通过背光驱动IC。在高通平台UEFI阶段的背光通常让PMIC的GPIO输出固定PWM或者直接拉高使能脚先把屏幕点亮再说。之前见过一个项目XBL阶段的背光不是纯硬件PWM而是要通过I2C给背光IC写寄存器结果DisplayDxe里没有这段I2C读写逻辑导致开机logo阶段屏幕是暗的等kernel起来背光驱动加载后才亮。这种问题在XBL阶段排查起来比较费劲因为它不是不亮而是“晚亮”。遇到这种情况要么在XBL里补I2C背光控制要么就接受开机logo暗屏二选一。3. 点屏的核心细节时序参数和初始化序列一个都不能错硬件条件具备之后真正的重头戏来了软件参数配置。这是项目上花费时间最多的地方也是最容易出幺蛾子的环节。3.1 像素时钟怎么算为什么你的屏刷新率不对DSI屏显示需要给到面板一个精准的像素时钟这个时钟频率由分辨率、刷新率和时序参数共同决定。高频平台点屏时DisplayDxe会根据你填的panel参数去配置DSI PLL。计算方法很直接像素时钟 (水平有效宽度 H前肩 H后肩 H同步脉宽) × (垂直有效高度 V前肩 V后肩 V同步脉宽) × 刷新率举个例子一块1080×2400的屏幕60Hz刷新率假设h-front-porch80、h-back-porch80、h-pulse-width16v-front-porch60、v-back-porch100、v-pulse-width8水平总周期 1080 80 80 16 1256垂直总周期 2400 60 100 8 2568像素时钟 1256 × 2568 × 60 ≈ 193.5MHz这里算出来的数值可以作为参考实际项目中面板规格书会直接给出推荐的porch参数。如果参数填得不对屏幕画面会偏、闪烁、甚至完全无显示。有一个经验调试时先从规格书的推荐值开始不要去“优化”大多数问题都是自己乱改参数改出来的。3.2 DSI时钟和Lane带宽的关系光算像素时钟还不够还要算DSI传输需要的比特率。DSI链路的比特率必须大于所有数据Lane的总传输量否则带宽不够会导致花屏。比特率 ≈ 像素时钟 × 每像素比特数 ÷ Lane数假设RGB888每像素24bit4-lane像素时钟193.5MHz比特率 193.5MHz × 24 ÷ 4 ≈ 1.161Gbps这个值就是每条Lane需要跑的数据率。DSI PLL要锁定的目标频率就基于这个值来算。如果平台支持的DSI频率低于这个值就要考虑降分辨率、降刷新率或者加Lane数三选一都会影响体验。这里有个实际坑点有的屏支持1-lane但XBL阶段为了稳定会配2-lane到了kernel又改成4-lane中间切换时如果同步没做好屏幕从logo切到动画时会出现一闪绿屏或花屏。这个属于平台自身的显示一致性Display Handoff问题后面单独说。3.3 面板初始化序列Init Sequence为什么不能剪每一块LCD屏幕内部都有一个驱动IC上电后必须通过DSI命令把IC配置到正常工作状态。这块IC的寄存器初始化序列就是我们在配置里看到的on-command。这段指令序列每家屏厂提供的格式都不同有长有短。短的几十条长的几百条包含sleep out、gamma校正、电压设定、分辨率设置等。最怕的是有人觉得XBL阶段只需要显示个logo没必要发太多初始化命令“精简”掉一部分结果屏幕颜色偏紫、亮度不对或者闪烁。原因很简单DSI命令里的很多设置是面板工作必需的不是可选项。你看着没用的那条命令可能正是面板内部升压电路的启动时机设置。正确的做法是把屏厂给的完整on-command原封不动搬到XBL配置里一条都不要少。先保证能亮再谈优化。另外要注意on-command里的delay延迟参数。面板IC在接收到某些命令后需要时间内部切换状态比如sleep out之后需要等120msdelay写短了后续命令直接丢弃屏幕就是黑的。delay写长了开机会慢用户能感知到。这个值建议严格按规格书来别拍脑袋。4. 实操过程在XBL源码里把一块屏点亮理论讲完了来看实际操作。下面以高通平台UEFI工程为例走一遍XBL阶段配置LCD的完整流程。4.1 添加新panel配置的步骤第一步是找到显示面板配置文件所在的目录。不同平台路径略有差异大致在XBL_SRC/BOOT.XF.4.1/boot_images/QcomPkg/Settings/Display/目录下会有一堆panel配置文件命名规则一般包含分辨率和厂商信息。新屏的配置可以参考同分辨率已有文件进行拷贝修改。第二步是要确认这个配置文件会被编译进固件。display配置通过环境变量或者Build配置项控制在dsc或build脚本里确认对应的panel id被包含。有同事改完配置发现改动没生效检查半天发现是编译脚本选的是另一份panel文件这错误非常低级但非常常见。第三步是填写panel参数。把规格书里几个关键参数逐项填入参数项含义填错后果qcom,mdss-dsi-panel-width水平像素数画面比例变形或异常qcom,mdss-dsi-panel-height垂直像素数画面比例变形或异常qcom,mdss-dsi-h-front-porch行前肩画面水平偏移qcom,mdss-dsi-h-back-porch行后肩画面水平偏移qcom,mdss-dsi-v-front-porch帧前肩画面上下抖动qcom,mdss-dsi-v-back-porch帧后肩画面上下抖动qcom,mdss-dsi-lane-mapLane映射花屏或颜色错乱qcom,mdss-dsi-t-clk-post时钟后时序高频时闪屏qcom,mdss-dsi-t-clk-pre时钟前时序高频时闪屏这里特别说一下lane-map这个参数定义的是物理lane和逻辑lane的对应关系。PCB走线如果做了交叉lane-map就必须跟着换。遇到“画面有内容但像打翻了的调色盘”这种花屏先检查lane-map通常都是这里错了。4.2 在DisplayDxe里注册panel有了panel配置后还要确保DisplayDxe能识别这块屏。高通平台的识别方式有两种一种是通过屏幕ID读取面板IC内部有ID寄存器驱动通过DCS命令读回ID和配置里预设的ID匹配。这种方式在量产时做多屏兼容很有用一块主板可以从8寸到12寸换不同屏只要灌对应的配置就行。另一种是固定配置不分id直接按默认panel初始化。这种方式适合单屏项目简单粗暴但换屏后要改代码重新编译。XBL阶段推荐用固定配置减少一个读ID时序的不确定性。但如果你想做多屏兼容读ID的时序也要在XBL中验证一遍之前遇到过读ID命令时序太长导致开机变慢100ms的案例产线对开机时间是敏感的。4.3 编译、烧录和验证配置改完编译整个XBL镜像python build.py --variant LA --output_dir output烧录的话高通用fastboot烧ABL分区fastboot flash abl_a image.elf fastboot reboot开机观察现象主要看几个点背光是否亮起不亮先查背光供电GPIO和PMIC配置。logo是否出现不出现查DSI lane输出、面板复位时序。画面是否正常花屏/偏色查lane-map、初始化序列、时钟参数。这几个现象基本覆盖了90%的初期问题。每改一次参数重新编译可能要好几分钟debug效率很考验工程工具链的熟练度。4.4 开机logo内容怎么替换屏幕亮起来之后就要考虑logo内容了。高通XBL的splash logo一般通过SplashScreen工具生成或者直接把图像数据编进UEFI固件的一个section里。实际操作上先用工具把bmp转成splash格式python SplashGen.py --image logo.bmp --output splash.raw然后把生成的raw文件按平台文档的要求放进XBL源码的display目录下改一下资源ID重新编译烧录即可。这个步骤比较简单但有个细节值得提logo图片的尺寸不一定等于屏幕分辨率。平台默认会做背景色填充如果你想要完美的无缝显示建议图片尺寸和屏幕物理分辨率一致避免拉伸或黑边。5. 常见问题与排查技巧实录点屏debug是场持久战这里整理几个项目里反复出现的典型案例都是能直接套用的排查思路。5.1 黑屏但系统正常启动先分三路排查这是最常见的现象系统起来了串口能进shell但屏幕黑的。分三路排查先查背光。背光亮不亮如果亮说明电源部分基本正常问题大概率在显示链路如果不亮先查背光IC使能脚、boost升压输出是否正常。再查DSI数据。用示波器抓DSI clock lane在开机瞬间是否有波形。如果clock完全没输出说明DSI PLL没有lock时钟配置有问题如果有clock但data lane是空的说明命令没有发送成功查复位时序和初始化命令。最后查复位引脚逻辑。复位是高有效还是低有效规格书不同IC定义不同。有的复位时序是先拉低50ms再拉高结果配置里反了屏幕永远处于复位状态命令发进去也没用。5.2 花屏和偏色别急着改代码先抓波形花屏的原因优先级排列lane-map配置错误最容易被忽略PCB走线导致的lane交叉在实际项目中出现概率不低其次是porch时序不对导致的行场同步异常产生的条纹状花屏非常典型再就是初始化命令缺了ID地址或reset退出序列。偏色问题还可能是面板的rotated模式没配置。有的屏是竖屏在横屏设备上要用旋转命令有的屏RGB通道顺序和默认不一致需要发swap命令。这些信息都在面板规格书的初始化命令里屏厂为什么不给全因为这部分属于屏厂core code给不给看合作深度。确实拿不到时就根据显示颜色反推通道顺序比如“红绿互换”就查是否缺了bgr顺序配置。5.3 显示Handoff问题从logo到动画切换时闪一下XBL把屏幕点亮显示logokernel起来后要接管屏幕。这个交接过程在DisplayDxe和kernel DRM驱动之间进行。如果内核驱动重新初始化面板时和XBL阶段的状态不一致就会出现闪烁、黑屏一下再亮、画面残影等现象。解决思路是让kernel驱动读回XBL阶段的面板状态参数包括分辨率、时序、DSI频率、偏置电压等。高通平台对此有专门的handoff机制msm_drm驱动在probe时会检查UEFI传下来的display status如果检测到XBL已经初始化了panel就直接沿用现有配置不做重复初始化。遇到闪一下的问题先看内核日志里是否出现“continuous splash”相关字样。如果没有说明handoff没有生效检查UEFI传参的cmdline或者smc调用是否被裁剪了。5.4 温度对点屏的影响低温点不亮这是项目上比较头疼的稳定性问题。实验室常温没问题产线贴完片进冷柜测试就点不亮原因基本就那么两点。一是电源纹波。低温下面板IC内部电源管理电路启动电流变大如果PCB电源路径阻抗偏大瞬间压降拉垮了逻辑电压IC起不来。软件层面能做的就是调整上电时序增加上电延时给电源稳定留出更多时间。二是晶振起振慢。面板在每个数据通道旁边有一颗外部振荡器或者内部振荡器低温下起振时间明显变长DSI命令发送时IC的时钟还没稳定命令就丢了。处理办法是在on-command最前面增加一段延时让IC时钟稳定后再走初始化流程。这块的经验是XBL阶段的显示初始化宁可在上电时序上多等几十毫秒也要保证100%成功率。量产阶段的稳定性比那点开机速度重要得多。5.5 多屏兼容时怎么办在XBL里做动态选择终端产品往往有多个屏幕供应商同一分辨率不同品牌代码不能每次换屏都出一次固件。通用做法是在XBL里做panel动态选择。实现思路是设备树或环境变量里配置一个panel列表DisplayDxe上电后逐个尝试读面板ID匹配上的就按对应配置初始化。这个方案在kernel那边很成熟XBL这边也支持只是配置起来稍微麻烦点。需要注意的就是读ID的时序不能卡死系统。单屏失败后要超时跳过不能阻塞整个启动流程。之前见过一个项目某批次面板ID读不到模块停在读ID环节死循环直接导致不开机级别的问题。处理方式是给读ID增加超时阈值比如50ms读不到就跳到默认配置保证开机能过。6. 调试工具和方法别只会看串口日志真正点屏debug的时候串口日志只是最基础的。日志能告诉你驱动跑到了哪里但寄存器到底配成什么样了串口不会全量报给你。这时候手头有几样工具和方法就很关键。6.1 高通平台的显示寄存器dumpUEFI阶段和kernel阶段都可以dump CRTC/DSI/PLL相关寄存器。XBL阶段可以通过串口菜单或者RemoteFS把寄存器值打出来常见的几个寄存器组DSI_CTRLDSI控制器使能状态DSI_PLL锁相环lock状态MDP_CTL显示流水线控制状态对照spec查寄存器值能不能对上预期值基本能定位是时钟问题还是数据通路问题。6.2 逻辑分析仪抓DSI时序DSI是高速串行信号普通示波器不一定能稳定抓到完整的包内容。有条件上逻辑分析仪的话重点抓三个时间点面板上电后TSTearing Signal是否正常跳变DSI initial burst开始的时间面板是否回ACK有时候屏幕不亮但IC已经给了回包只是后续参数有误导致黑屏。这种情况从外部时序比从寄存器dump更好定位因为你能直接看到链路层有没有数据交互。6.3 用UEFI Shell做基本验证XBL阶段带UEFI Shell的话能做的事情更多。可以通过shell命令快速读寄存器、看内存值、甚至手动触发部分显示初始化。不少调试操作不用反复编译刷机效率能高很多。提示调试XBL显示时建议先把串口日志调到FullLevel把DisplayDxe相关的日志全部打开运行一次后保存完整log再根据log里的错误码去查spec。盲改参数是大忌。写在最后的经验之谈做点屏debug这几年最深刻的体会是屏幕亮不起来第一反应不应该改代码而应该先确认供电和复位这是硬件应验最快的分水岭。为什么这么说因为实际项目里至少一半的“黑屏”出在这两个地方。先把硬件条件确认完再来查时序参数和代码逻辑能省掉大量无用功。另一方面就是初始化序列屏厂给的命令不要擅自精简或调整顺序这类自作主张造成的偏色、闪屏问题排查一下午往往最后发现是自己动的手脚。技术上的事绝大多数坑都源于对原理理解不透和动手太快。希望这篇流程梳理能让你在下次面对一块黑屏时少走点弯路。
返回列表