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

资讯详情

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

OpenHarmony下LVDS屏幕适配全流程:从硬件选型到系统点亮

OpenHarmony下LVDS屏幕适配全流程:从硬件选型到系统点亮 折腾开源鸿蒙OpenHarmony有段时间了我从一开始只知道在HDMI显示器上调桌面到后来被一块LVDS屏折腾了整整两天整个过程给我留下了很深的印象。当时的需求其实特别简单一块带触摸的LVDS液晶屏要作为OpenHarmony系统的主要输出桌面屏幕听起来就是“把屏接上、系统能显示”这么一句话实际做起来涉及硬件链路、内核设备树、显示框架甚至背光时序。下文会把这条线完整整理出来分享给正在做开源鸿蒙系统搭建或者正在给OpenHarmony适配LVDS屏幕的嵌入式开发同行。很多刚接触嵌入式显示的朋友会有一个错觉系统只要能出画面换个屏幕无非就是改个分辨率。但LVDS屏跟HDMI屏完全不是一回事。HDMI自带信号协商插上就能识别LVDS属于传统并行液晶接口主控必须提前知道屏的时序参数、数据格式、供电电压还要在硬件上把信号送对。你如果跳过这些直接烧系统大概率会得到一块白屏或者花得没法看的画面。下面我从显示链路开始一步步把LVDS屏幕在开源鸿蒙系统下点亮的全过程拆开讲。1. 为什么OpenHarmony桌面会遇到LVDS屏1.1 这类屏幕区别于HDMI的地方LVDS屏和HDMI屏最大的差异在于它没有握手协议。HDMI接口上显示器通过EDID告诉主机自己支持什么分辨率、什么刷新率内核拿到这些信息后自动生成显示模式。LVDS完全不是这套玩法它更像老式的模拟设备屏幕只是一块被动接受像素时钟和数据信号的液晶面板。主控端必须严格按照屏厂给出的时序参数输出信号参数差一点画面就可能错位、花屏甚至完全不亮。这种“不智能”也带来了一个好处LVDS接口的抗干扰能力很强。它用低电压差分信号传输两根线拧成一对共模噪声被抑制得很好在工业设备里可以比较可靠地走几十厘米的排线。所以LVDS至今仍是工控屏、医疗屏、车载屏幕里常见的输入接口。OpenHarmony想要在万物互联的嵌入式场景落地就绕不开这种“老派但是皮实”的屏幕。1.2 哪些设备真正需要LVDS方案你可能会问现在HDMI、eDP这么多LVDS是不是已经过时了从我接触的客户项目看工业HMI、医疗显示、车载后装、银行柜机、数控机床面板大量设备仍在使用LVDS屏。原因很简单产品生命周期长屏幕规格稳定改版成本低供应商选择多。很多嵌入式主板在设计之初就预留了LVDS连接器软件上只是需要一个合适的显示时序配置。OpenHarmony在这些设备上的落地场景通常不是拿来看视频或者打游戏而是跑工业组态界面、设备监控面板、简单的交互应用。这类画面不追求高刷新率但要求稳定、低延迟、随时可唤醒。LVDS屏配合OpenHarmony的轻量化桌面正好能满足这些场景的需求。所以“LVDS屏幕输出桌面”并不是一个简单的显示问题它背后是一整套嵌入式系统适配和产品化的问题。2. LVDS显示链路与关键硬件选型2.1 LVDS协议基础通道、位宽与VESA/JEIDALVDS的全称是Low-Voltage Differential Signaling低压差分信号。它用一对线传时钟用若干对数据线传像素数据。常见的有6bit和8bit两种色深对应三个或四个数据通道再加一对时钟通道。如果是双通道LVDS则有两组这样的总线适合高分屏或者高色深屏。这里最容易踩坑的是数据映射格式。LVDS有两种主流映射标准VESA和JEIDA。同样一根线两种标准下R、G、B各颜色分量在数据通道里的排列位置不同。屏的设计可能只支持其中一种或者需要用一个引脚选择。主控输出和屏端设置不一致时典型表现是画面整体偏绿或者颜色明显错乱而不是彻底无信号。项目VESA格式JEIDA格式常见使用DVI/HDMI派生的LVDS屏日系屏、部分手机衍生屏数据通道映射RGB低5位在不同通道分散RGB位序相对集中调试特征颜色偏绿常见颜色偏紫/蓝常见选屏或者画原理图的时候一定要先确认屏是VESA还是JEIDA。软件上可以强行切换发送端的映射寄存器但最好还是让硬件保持一致少一个变量。2.2 从主控SoC到液晶屏的三种典型拓扑硬件链路并不是只有“SoC直接输出LVDS”这一种。实际项目里会有下面几种常见拓扑SoC原生LVDS输出。部分主控芯片内部集成了LVDS发送器引脚上没有经过桥接芯片直接连到屏幕连接器。这种情况下软件上只需要注册一个LVDS panel节点。MIPI DSI转LVDS桥接。很多应用处理器只带MIPI DSI为了接LVDS屏需要加一颗转换芯片比如常见的LT8912B、SN65DSI84、TC358775。软件上既要配DSI控制器也要配桥接芯片。RGB/TTL转LVDS发送器。一些老主控输出并行RGB信号需要外加DS90C385这类发送器把RGB信号串行化成LVDS再送给屏幕。这三种拓扑在OpenHarmony驱动模型里对应不同的设备树组织方式。最简单的是第一种设备树里直接写panel-timing即可。第二种最常用也最容易出问题因为涉及DSI输出格式、桥接芯片I2C配置、LVDS输出格式三个环节。第三种多见于老平台适配思路和第二种类似。还有一类反向需求如果外部设备输出LVDS信号而主控没有LVDS接收能力就需要用解串器芯片把LVDS转成并行RGB或者MIPI信号。像DS90CR288A就是典型的8位总线LVDS解串器。这类场景在视频采集、副屏输入、带LVDS输出的主机移植时会碰到思路基本一样关键还是把端口的时序和数据格式配准确。2.3 背光、电源与电平设计注意事项LVDS屏除了信号线还有电源和背光。信号部分通常只需要注意共模和差分匹配但电源时序和背光控制常常是白屏的元凶。屏的逻辑电源一般叫AVDD常见有3.3V、5V、12V几种必须按照屏规格书给到位。背光部分如果是LED背光通常需要单独的升压驱动电路供电电压从十几伏到几十伏不等。背光驱动还需要一个使能信号和一个PWM调光信号。调试的时候建议先把PWM固定在一个亮度值不要一上来就调动态调光少一个变量。工业主板上经常出现“LVDS自动电平调整电路”这类电路的作用是自动匹配主控输出电平和屏端LVDS接收器的共模范围减少因为不同厂商屏幕导致的不兼容。它通常不会自动修改面板时序只是把差分信号的共模电压调整到合适范围。如果你的主板上没有这个功能遇到信号质量问题就需要在PCB走线和排线长度上多想办法不能指望软件完全救回来。另外还要留意VESA/JEIDA、6bit/8bit、单通道/双通道这类“接线层”的选择。很多主板的LVDS连接器旁边有一组跳线或者电阻位用来选择这些模式。软件上必须和跳线保持一致比如硬件跳线设成JEIDA软件却按VESA输出颜色一定不对。3. OpenHarmony显示驱动栈和LVDS适配思路3.1 桌面图像最终怎么走到屏幕OpenHarmony的桌面看起来是完整的UI系统其实从屏幕点亮的角度看只需要关心从RenderService到显示Controller这一段链路。应用层用ArkUI或者普通控件绘制出画面RenderService完成图层合成然后通过Composer模块把合成好的buffer提交给显示硬件。显示硬件按设定好的扫描时序把buffer里的像素一行一行送给LVDS发送器最终在屏幕上成像。这个流程可以用快递来类比应用是发货方RenderService是打包中心Composer是物流调度显示控制器的时序参数就是快递路线上的红绿灯。红绿灯没调好画面就会乱套。所以LVDS屏能否输出桌面核心在于最底层的显示控制器有没有正确的mode以及物理信号有没有送到屏上。3.2 为什么建议从DRM/KMS入手OpenHarmony显示栈在不同版本里用过不同的驱动模型但只要是Linux内核形态底层显示驱动几乎都跑在DRM/KMS框架上。DRM/KMS里的panel和bridge两个概念正好对应屏幕本身和桥接芯片。适配一块LVDS屏绝大多数工作就是写一个panel驱动或者写一个bridge驱动注册到DRM子系统里。很多第一次接触这套东西的人会被HDF、HDI Display、RenderService这些名词吓到总觉得要改一堆系统组件。实际上OpenHarmony对显示设备的管理会封装成HDI Display接口但最终还是会调用到Kernel的DRM接口。也就是说我们先把DRM侧点亮上层桌面自然就能把这块屏当成普通显示器来用。反过来上层逻辑再花哨底层没有正确注册panel屏幕永远亮不起来。3.3 源码准备与系统搭建环境在写设备树之前得先把OpenHarmony的编译环境搭起来。通常流程是拉取官方开源镜像仓库同步代码安装hb工具然后选择产品配置。下面是我比较常用的步骤cd $HOME mkdir openharmony cd openharmony repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-4.0-Release repo sync -j16 hb set # 选择你对应的开发板产品 hb build -f第一次编译时间比较长机器内存低于16G的话很容易OOM建议至少32G内存。如果只是改内核和设备树可以在第一次完整编译之后继续在内核目录里做增量编译再把生成的boot镜像刷进板子。这个方法在调试LVDS屏时能省大量时间。有一点要注意不同开发板的vendor和device目录差异很大。有的板子在hb set里直接可选有的需要先执行板级脚本把编译参数写上。不要拿着一个平台的命令往另一个平台上生搬硬套先看开发板文档把环境变量配好。4. 实战为LVDS屏幕配置内核设备树4.1 确认屏幕规格与桥接方案拿到一块新LVDS屏我习惯先把屏厂的规格书翻一遍重点找四个信息分辨率、色深、供电电压、接口通道数。分辨率直接影响panel-timing里的hactive和vactive色深决定是6bit还是8bit供电电压决定电源树怎么配通道数决定是单通道还是双通道LVDS。然后确认主控侧到底是什么输出。我手头这块板子是瑞芯微平台没有原生LVDS主控有两个MIPI DSI输出所以我走的是DSI转LVDS方案。桥接芯片规格书上会写明它支持的输入格式和输出格式比如MIPI DSI输入、LVDS输出这样设备树里就既要配DSI端口也要配LVDS panel节点。如果屏是标准1920x108060数据手册通常会给出完整的时序参数表。没有完整参数表的话可以向屏厂要一份panel timing说明这是后续配置的核心依据没有它只能靠猜效率很低。4.2 添加panel-timing的计算方法以1920x108060为例标准CEA时序大概是hactive 1920hfront-porch 88hsync-len 44hback-porch 148vactive 1080vfront-porch 4vsync-len 5vback-porch 36计算像素时钟的公式是像素时钟 (hactive hfront-porch hsync-len hback-porch) x (vactive vfront-porch vsync-len vback-porch) x 刷新率把上面的数字代入水平总像素是1920 88 44 148 2200垂直总行数是1080 4 5 36 1125刷新率60Hz算下来正好是2200 × 1125 × 60 148500000Hz也就是148.5MHz。设备的像素时钟属性就填这个值。这里有一个很容易出错的地方屏厂给的Hactive可能不是1920有些屏物理像素是1920但驱动IC会加一些不可见区域所以必须以屏厂给的参数为准不能拿PC显示器的标准值硬套。4.3 完整设备树节点参考下面是一段基于DRM框架的典型配置。背光用PWM控制屏的供电用固定稳压源使能和复位各接一个GPIO。#include dt-bindings/gpio/gpio.h #include dt-bindings/pwm/pwm.h / { lcd_power: lcd-power { compatible regulator-fixed; regulator-name lcd_power; regulator-boot-on; regulator-always-on; enable-active-high; gpio gpio3 RK_PC2 GPIO_ACTIVE_HIGH; }; backlight: pwm-backlight { compatible pwm-backlight; pwms pwm3 0 1000000 0; brightness-levels 0 32 64 128 192 255; default-brightness-level 4; enable-gpios gpio3 RK_PC3 GPIO_ACTIVE_HIGH; }; }; mipi_dsi { status okay; dsi_panel: dsi-panel { compatible simple-panel; status okay; power-supply lcd_power; backlight backlight; enable-gpios gpio3 RK_PC4 GPIO_ACTIVE_HIGH; reset-gpios gpio3 RK_PC5 GPIO_ACTIVE_LOW; enable-delay-ms 10; prepare-delay-ms 20; reset-delay-ms 120; panel-timing { clock-frequency 148500000; hactive 1920; vactive 1080; hback-porch 148; hfront-porch 88; hsync-len 44; vback-porch 36; vfront-porch 4; vsync-len 5; hsync-active 0; vsync-active 0; de-active 1; pixelclk-active 0; }; port { panel_in: endpoint { remote-endpoint dsi_out; }; }; }; }; dsi_out { remote-endpoint panel_in; };这段配置里的桥接芯片没有单独列出来是因为simple-panel模式下DRM会直接把panel挂到DSI上桥接芯片如果支持自动识别可以由它的专属驱动完成初始化。如果你用的桥接芯片需要I2C配置那就得额外增加一个I2C设备节点把芯片的寄存器初始化交给对应的bridge驱动去做。4.4 背光和电源时序的GPIO控制LVDS屏的上电时序非常苛刻。如果先给信号后给背光可能屏幕会闪一下如果先给背光再给面板电源可能出现灰屏甚至损坏驱动板。常见的顺序是先上面板逻辑电源再拉高复位引脚最后使能背光。设备树里那些delay-ms字段就是控制这个顺序的。我用过一个屏厂商推荐时序是VCC上电后等待10ms然后Reset拉高至少120ms最后背光使能。如果不按这个顺序屏幕偶尔能点亮偶尔点不亮非常折磨人。后面我把enable-delay-ms和reset-delay-ms都按规格书设好问题就消失了。所以调试时不要嫌这些延时参数麻烦一定要对上。另外要注意GPIO的有效电平。reset引脚一般低电平复位所以reset-gpios里用GPIO_ACTIVE_LOW背光enable一般是高电平有效所以用GPIO_ACTIVE_HIGH。这两个搞反屏幕的表现就是白屏或者背光不亮而且很难从日志里看到明显报错。5. 编译烧录与系统侧验证5.1 OpenHarmony编译与内核单独编译整个OpenHarmony镜像编译比较耗时但第一次还是建议完整编一遍确认环境和基础系统没问题。进入源码根目录后hb set hb build -f编译完成后产物通常在out目录下。内核镜像、boot镜像、system镜像都会生成。烧录方式各板子不一样有的是用官方烧录工具选分区有的是用fastboot。文档里一般都有明确步骤。如果只需要验证设备树改动可以只编译内核和boot镜像。在OpenHarmony这种大工程里优先查一下当前产品的编译脚本是否支持单独编内核支持的话能省不少时间。我的做法是第一次全量编译通过后后面只改dts和kernel代码就单独编内核再把boot.img刷进去测试迭代速度快很多。5.2 烧录并观察DRM设备节点系统启动后第一件事是看内核日志里有没有DRM、panel、backlight相关打印。dmesg | grep -E drm|panel|backlight|pwm如果设备树配置正确应该能看到类似“drm_panel_register”或者“backlight probe success”的信息。然后列一下DRM设备节点ls -l /sys/class/drm/ cat /sys/class/drm/card0-LVDS-1/status cat /sys/class/drm/card0-LVDS-1/modes如果连接器的名字是card0-LVDS-1说明DRM已经识别到这个LVDS连接器。status应该是connectedmodes文件里能读到分辨率列表。没有这个节点说明设备树或者桥接驱动没有挂上先回到内核日志里查probe失败原因。5.3 系统分辨率与刷新率确认仅仅看到mode还不够还要确认当前生效的分辨率。可以用modetest工具查询如果你烧录的OpenHarmony系统里没有这个工具可以在内核调试阶段临时用busybox或者把modetest静态编译进去。modetest -M rockchip -c modetest -M rockchip -m输出里会列出当前连接器、编码器、分辨率和刷新率。OpenHarmony桌面显示界面时会向显示服务查询可用mode然后选择一个最接近屏幕物理分辨率的模式。如果mode列表不对桌面输出就会发虚或者比例不对。很多时候内核日志直接会打印DRM当前选择的mode例如“clock 148500 kHz, vrefresh 60 Hz”。看到这个就说明Kernel侧已经按panel-timing启动成功了。接下来再折磨上层桌面图形就有明确方向了。6. 常见问题、排查技巧与我的心得6.1 现象和原因对照表现象可能原因排查方向白屏背光不亮背光供电、使能、PWM异常先测背光电压和EN脚白屏背光亮逻辑电源、RESET、LVDS信号异常量AVDD、复位脚、信号线花屏画面错位panel-timing参数不对对屏厂规格书逐项核对偏色绿色明显VESA/JEIDA格式不匹配切换发送端或屏端映射闪烁亮度抖动PWM频率、排线干扰、电源噪声提高PWM频率检查差分线画面模糊带重影时钟极性、采样沿不对调整pixelclk-active/hsync-active颜色只有红/绿/蓝缺色数据位映射错误检查RGB8位到LVDS的位序这张表是快速定位问题的起点但实际调试很少一次到位很多时候会同时出现多个现象需要一个个变量拆。6.2 白屏/无背光问题的排查我遇到最多的是白屏而白屏又分背光亮和背光不亮两种情况。先区分这两种问题就解决一半。背光不亮的时候优先用万用表测背光驱动板的输入电源再测EN使能脚有没有高电平最后看PWM引脚波形。如果EN脚是低电平去查背光设备树节点绑定是否正确或者GPIO是否被其他驱动占用。PWM没输出的话问题基本在内核PWM驱动或者板级配置跟LVDS本身关系不大。背光亮但屏幕全白说明背光没问题问题在面板信号链路上。这时候查AVDD电源再查RESET脚时序最后查LVDS差分信号。没有示波器的情况下可以先从电源和复位查起这两项占白屏原因的一半以上。6.3 花屏/条纹/颜色异常的处理花屏一般不是硬件坏了而是主控输出参数和屏不匹配。典型的处理方法是先把刷新率降低比如从60Hz临时改到50Hz看花屏有没有变化。如果变化明显说明像素时钟或者总像素算得不准。条纹或者“斜纹”大概率是LVDS数据通道顺序接错或者双通道屏只开了单通道。这类问题在设备树里看不出来需要看桥接芯片的寄存器配置。比如LT8912B这类DSI转LVDS芯片输出通道数、LVDS格式、lane swap都需要通过初始化序列配置改错一个bit就是花屏。颜色异常时优先检查VESA/JEIDA。这个比较有规律VESA格式配到JEIDA屏上最常见的是绿色偏重因为色度各分量的排列位置错位。切换格式后如果颜色正常就锁定原因回头去改屏端跳线或者芯片寄存器。6.4 一些提高成功率的小习惯我现在拿到一块新LVDS屏基本按固定流程走先查供电和背光再查LVDS格式再查内核里panel-timing最后才考虑上层的HDI和图形效果。这个顺序能帮我少踩至少一半的坑。还有一个小技巧第一次调屏的时候尽量先用系统里已有的HDMI或串口console保留一个备用输出通道。这样即使LVDS屏没点亮还能通过日志看内核状态。如果只有一块LVDS屏且没起来相当于盲调排查效率会低很多。另外给屏供电的电源模块如果纹波大屏幕也会出现肉眼可见的横条纹。硬件上尽量用独立的LDO或者DC-DC给面板供电不要和CPU核心供电混在一起。软件上的滤波和PWM策略可以改善一部分但不能解决硬件底子的问题。试过几次之后我最大的体会是LVDS屏调试不怕问题多就怕变量多。每一次只改一个参数记录改动和现象很快就能找出真正的原因。OpenHarmony桌面能不能在这块屏上稳定输出说到底就是底层时序、数据格式和电源这三件事做对没有这三件事通了桌面自然就亮了。
返回列表