LVDS屏幕输出桌面—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
2026/9/9 10:52:01 网站建设 项目流程

HDMI 会了。今天换 LVDS:工控屏常用,玻璃自己不报分辨率,时序要写进设备树。

HDMI 那路插上显示器就有 EDID,分辨率是对方告诉你的。LVDS 这块玻璃什么都不告诉你。没有 HPD,没有 DDC,没有一串 modes 供你挑。时序必须写在设备树里:1024×600,像素时钟 51.2 MHz,JEIDA 24 bit。写错一个 porch,屏要么花,要么彻底不认。

另一件和 HDMI 相反的事:simple-panel永远上报connected。排线拔了也是 connected。所以 LVDS-1 的 sysfs status 不能当验收。验收看 debugfs 的时钟,看 U-Boot 那行type: LVDS0 for VP2

这块底板上 LVDS 走 VOP2 的 VP2,PHY 是video_phy0。触摸是 GT911,地址 0x5d,挂 I2C2,走 HDF Input,内核主线那颗 gt911 节点保持disabled。没有 DCS——那是 MIPI 的语言,LVDS 不讲。

产品名rk3568_evb。改的文件:

device/board/rk/rk3568_evb/kernel/rk3568-evb-linux.dts

四选一的原则在显示总论那篇。这里当已经成立:开 LVDS,HDMI / MIPI / RGB / eDP 全部关掉。只写&lvds { status = "okay"; }一行,等于没写。


现象:HDMI 有桌面,这块屏只有背光

背光亮着,玻璃上停着 U-Boot 的 logo,或者什么都没有。旁边 HDMI 口若还插着显示器,桌面在那台显示器上跑。

原因

&hdmi&lvds同时okay。HDMI 是真热插拔,插着线就是connected。LVDS 是 simple-panel,节点 okay 的瞬间也是connected。composer 只认一个主显示。谁先注册、谁被看成 connected,桌面就跟谁走。真屏的 panel 驱动照样 probe,enable-gpio 照样拉高,PWM 背光照样转,只是没人往 VP2 提交桌面帧。

第二种变体:你没插 HDMI,但 dts 里 LVDS 的 panel 是disabled,HDMI 是okay。物理上接的是 LVDS 玻璃。内核去扫一根没有显示器的 HDMI,LVDS 控制器没开。U-Boot 若还按自己的 dtb 在这块玻璃上画过 logo,你会看见「有过画面,内核起来之后没了」。

第三种:dts 改对了,刷的是boot_linux的 p5。U-Boot 从 resource 的 p4 取出旧rk-kernel.dtb,里面 LVDS 还是 disabled。/proc/device-tree对不上你刚改的那份。

代码:四件套加 PHY,一次写齐

/* LVDS:VP2,1024×600 @ 51.2 MHz,JEIDA 24bit */ &video_phy0 { status = "okay"; }; &lvds_in_vp2 { status = "okay"; }; &lvds { status = "okay"; ports { port@1 { reg = <1>; lvds_out_panel: endpoint { remote-endpoint = <&panel_in_lvds>; }; }; }; }; &route_lvds { connect = <&vp2_out_lvds>; status = "okay"; };

connect必须指向vp2_out_lvds,和lvds_in_vp2一致。写成 VP0 的出口,扫描在一边,连接器在另一边,黑屏,dmesg 不一定骂你。

PHY 不是可选项。LVDS 差分从video_phy0出去。关 PHY 开控制器,连接器也许还在,屏收不到差分。切到 RGB 并行时要把video_phy0关掉,否则 PHY 和 RGB 管脚打架。开 LVDS 时它必须 okay。

HDMI 必须成组关掉,只关控制器不够:

&hdmi { status = "disabled"; }; &hdmi_in_vp0 { status = "disabled"; }; &hdmi_in_vp1 { status = "disabled"; }; &route_hdmi { status = "disabled"; };

RGB、eDP、DSI 同样成组关。DSI 的 panel 还要把 compatible 改成驱动不认的名字,防止 HDFof_find_compatible_node("simple-panel-dsi")抓到一份 disabled 的屏,把/dev/dri/card0搞没:

&rgb_in_vp2 { status = "disabled"; }; &rgb { status = "disabled"; }; &route_rgb { status = "disabled"; }; &tft_lcd_panel { status = "disabled"; }; &edp_in_vp0 { status = "disabled"; }; &edp { status = "disabled"; }; &edp_panel { status = "disabled"; }; &dsi1 { status = "disabled"; }; &dsi1_in_vp0 { status = "disabled"; }; &dsi1_in_vp1 { status = "disabled"; }; &route_dsi1 { status = "disabled"; }; &dsi0 { status = "disabled"; }; &dsi0_panel { compatible = "simple-panel-dsi-disabled"; }; &dsi0_in_vp0 { status = "disabled"; }; &dsi0_in_vp1 { status = "disabled"; }; &route_dsi0 { status = "disabled"; };

节点不能删。endpoint 互相引用,删了 dtc 报 unresolved reference。status 和 compatible 一起改。


现象:时序写了 1024×600,屏花或者不亮

你从 HDMI 那篇抄了「不要写死 timing」。LVDS 上这条建议是错的。

原因

LVDS 玻璃没有 EDID。DRM 不能问它要 modes。simple-paneldisplay-timings就是这份玻璃的身份证。像素时钟、porch、同步极性、bus-format,任何一项和屏参对不上,TCON 对不齐,表现为花屏、偏色、完全无信号。

这块板默认那块 1024×600 的数字是:

写错会怎样
`clock-frequency`51200000时钟偏了,屏不锁或滚动
`hactive` / `vactive`1024 / 600桌面几何全错
`hback-porch`160左右缺一块或错位
`hfront-porch`160同上
`hsync-len`70同步丢,花
`vback-porch`23上下滚
`vfront-porch`12同上
`vsync-len`20同步丢
`hsync-active`0极性反了,可能不亮
`vsync-active`0同上
`de-active`0DE 反了
`pixelclk-active`0沿反了
`bus-format``RGB888_1X7X4_JEIDA`写成 VESA,颜色通道错位

JEIDA 和 VESA 是两种 LVDS 通道映射。这块玻璃按 JEIDA 接。写成 VESA,桌面能出来,颜色是错的:红蓝对调,或者某一通道缺。不要「先用 VESA 试试」。屏参写 JEIDA 就写 JEIDA。

RGB 那路的同步极性是高有效。LVDS 这组是低有效(上面四个*-active = <0>)。两套数字不要混抄。从 RGB 节点 copy porch 过来,时钟还是 51.2 MHz,屏也会花——porch 和极性不是同一份。

代码:panel 节点

lvds_panel: lvds-panel { status = "okay"; compatible = "simple-panel"; backlight = <&backlight>; reset-delay-ms = <20>; enable-delay-ms = <20>; prepare-delay-ms = <20>; unprepare-delay-ms = <20>; disable-delay-ms = <20>; bus-format = <MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA>; pinctrl-names = "default"; pinctrl-0 = <&lvds_panel_enable>; enable-gpios = <&gpio3 RK_PC3 GPIO_ACTIVE_HIGH>; /* GPIO3_C3 */ width-mm = <210>; height-mm = <157>; lvds_disp_timings0: display-timings { native-mode = <&lvds_timing0>; lvds_timing0: lvds-timing0 { clock-frequency = <51200000>; hactive = <1024>; vactive = <600>; hback-porch = <160>; hfront-porch = <160>; hsync-len = <70>; vback-porch = <23>; vfront-porch = <12>; vsync-len = <20>; hsync-active = <0>; vsync-active = <0>; de-active = <0>; pixelclk-active = <0>; }; }; ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; panel_in_lvds: endpoint { remote-endpoint = <&lvds_out_panel>; }; }; }; };

enable-gpios拉高,屏的电源/使能脚才通。没有这根脚,PHY 在跳,玻璃没上电,看起来像时序错。GPIO3_C3 在 dts 里写成RK_PC3。debugfs 里这只脚应当out hi

背光走 PWM4 那个&backlight。panel 节点必须引用它。只开 PWM 不引用,内核不知道这路 panel 要背光,亮度和 enable 对不上。

&backlight { status = "okay"; }; &pwm4 { status = "okay"; pinctrl-names = "active"; pinctrl-0 = <&pwm4_pins>; };

&pwm5在这块板上必须disabled。它默认占 GPIO0_C4,那是 MIPI 相机的 PWDN。跟显示无关,但你为了「多开一个 PWM 试试背光」把它打开,相机会一起死。背光只走 pwm4。


现象:桌面起来大约 37 秒,背光灭,hdc 还在

不是电源管理那种 22 秒 timeout。串口没有blank=4,没有display off。有一行非常具体:

vcc3v3_lcd_lvds: disabling

同一批可能还有vcc3v3_lcd0_npcie30_3v3/sys/kernel/debug/gpio里原来拉高的那只供电脚变成out lo

原因

vcc3v3_lcd_lvds是孤儿 regulator。dts 里给了regulator-boot-on,开机时打开。全树没有任何节点写power-supply = <&vcc3v3_lcd_lvds>。LVDS 屏走enable-gpios,不走 power-supply。内核 regulator 框架在 late cleanup 阶段,把「boot-on 但没有 consumer」的电源批量关掉。大约 37 秒。GPIO 拉低,屏断电。桌面进程还在,hdc 还在,玻璃是黑的。

power-shell wakeup救不了。那条命令唤醒的是 DRM blank,不是被关掉的 3.3 V。

HDMI 遇不到这件事。HDMI 显示器自带电源。LVDS、部分 RGB 会遇。

代码

给这路电源加上regulator-always-on,锁住,late cleanup 不敢关:

vcc3v3_lcd_lvds: vcc3v3-lcd-lvds { compatible = "regulator-fixed"; regulator-name = "vcc3v3_lcd_lvds"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; gpio = <&gpio3 RK_PC3 GPIO_ACTIVE_HIGH>; /* 以你树里实际脚为准 */ enable-active-high; regulator-boot-on; regulator-always-on; };

注意:有的树把 GPIO3_PC3 既当enable-gpios又当 regulator 的 gpio,两处抢同一只脚。以你这份 dts 的实际定义为准。原则是:这路电必须有 always-on,或者必须有一个真正的 consumer 引用它。只有 boot-on、没有人用,37 秒必关。

改完刷 resource 和 boot_linux。验收:

hdc shell "dmesg | grep -i 'vcc3v3_lcd_lvds'" hdc shell "mount -t debugfs none /sys/kernel/debug" hdc shell "cat /sys/kernel/debug/gpio | grep -i lcd"

期望再也看不到disabling。供电脚保持out hi。等一分钟,屏还亮着。

公版 dtsi 还可能给vcc3v3_lcd0_n配一只gpio = <&gpio0 RK_PC7>。GPIO0_C7 在这块板上是 GT911 的 INT,不是 LCD 电源。开机把 INT 拉高,cleanup 再拉低,触摸中断锁死。显示看起来「能亮不能点」。删掉这两属性:

&vcc3v3_lcd0_n { /delete-property/ enable-active-high; /delete-property/ gpio; };

这和 37 秒掉电是两件事。一个关屏电,一个占触摸脚。一起改,少走一天。


现象:画面在,手指划不动,或划到别处去

原因

LVDS 这块玻璃上的触摸是GT911,0x5d,I2C2。不是 FT5406。开源鸿蒙桌面走 HDF Input,不走内核主线那颗 gt911 驱动。内核节点必须disabled,否则两边抢总线,HDF 读寄存器全是 NACK。

分辨率写在 HCS 的solutionX/solutionY,不是 DTS 的touchscreen-size-x。只改 dts,HDF 仍按某份公版 720×1280 报点,驱动当 1024×600 去减,纵坐标出负数,上半屏点不中。

代码

&i2c2 { status = "okay"; clock-frequency = <100000>; pinctrl-names = "default"; pinctrl-0 = <&i2c2m1_xfer &gt911_int_pin &gt911_rst_pin>; gt911_lvds: gt911@5d { compatible = "goodix,gt911"; pinctrl-names = "default"; pinctrl-0 = <&gt911_int_pin &gt911_rst_pin>; reg = <0x5d>; interrupt-parent = <&gpio0>; interrupts = <RK_PC7 IRQ_TYPE_LEVEL_LOW>; reset-gpios = <&gpio2 RK_PD0 GPIO_ACTIVE_HIGH>; status = "disabled"; }; ft5406_rgb: touchscreen@38 { compatible = "edt,edt-ft5406"; reg = <0x38>; status = "disabled"; }; };

INT = GPIO0_C7(23),RST = GPIO2_D0(88)。HCS 里busNum = 2intGpio = 23rstGpio = 88solutionX = 1024solutionY = 600moduleName = "HDF_TOUCH_GT911"。细节在 GT911 那篇。这里只要记住:开 LVDS 就把触摸配成 GT911 这一套,不要留着 RGB 的 FT5406 脚。

验收:

hdc shell "i2cdetect -y -r 2" hdc shell "i2ctransfer -y 2 w2@0x5d 0x81 0x40 r4" hdc shell "ls /sys/bus/i2c/devices/2-005d/driver" # 期望没有内核主线驱动绑在这 hdc shell "cat /proc/bus/input/devices"

0x39 0x31 0x31 0x00是芯片 ID'9''1''1'。扫不到 0x5d,先查排线、I2C2 有没有 okay、INT 有没有被 regulator 占着。


真正生效的 DTB 仍在 resource

显示总论和 HDMI 那篇把分区讲过。LVDS 这条路上它换了个妆再来:你从 HDMI 切到 LVDS,只刷了 p5,U-Boot 仍加载 p4 的旧树,summary 仍是HDMI-A-1。你会以为 LVDS PHY 坏了。

hdc shell "cat /proc/partitions" hdc shell "ls -l /dev/block/mmcblk0p4 /dev/block/mmcblk1p4" hdc file send resource.img /data/resource.img hdc file send boot_linux.img /data/boot_linux.img hdc shell "dd if=/data/resource.img of=/dev/block/mmcblk1p4 bs=4M conv=fsync" hdc shell "dd if=/data/resource.img of=/dev/block/mmcblk0p4 bs=4M conv=fsync" hdc shell "dd if=/data/boot_linux.img of=/dev/block/mmcblk1p5 bs=4M conv=fsync"

路径必须带/dev/block/。少了block,dd 建普通文件,md5 对,画面不变。

主机上先确认 dtb 真带了 51.2 MHz:

dtc -I dtb -O dts -o /tmp/now.dts 那份.dtb grep -n '51200000\|JEIDA\|lvds-panel' /tmp/now.dts

没有这串数字,编的是旧树或 dts 没被拷进 src_tmp。最小重建那篇的档 2:先cpboard 的 dts 到arch/arm64/boot/dts/rockchip/,再make rockchip/rk3568-evb-linux.dtb。目标不带rockchip/前缀,make 报没有规则。

GN 经常不盯 board 目录。改 dts 之后:

rm -rf out/kernel/checkpoint rm -f out/rk3568_evb/packages/phone/images/resource.img ./build.sh --product-name rk3568_evb --ccache

只换显示、system / vendor 已经能进桌面时,刷 resource + boot_linux 就够,不必等 31 分钟的用户态。


验收:先认盘,再认 VP2,再认 51.2 MHz

# 1. 介质 hdc shell "cat /proc/partitions" hdc shell "mount | grep ' on / '" # 2. 内核 DRM hdc shell "dmesg | grep -iE '\\[drm\\] Initialized|lvds|simple-panel|vop'" hdc shell "ls -l /dev/dri/" # 3. 连接器。LVDS-1 的 connected 只能当「驱动认为有屏」 hdc shell "ls /sys/class/drm/" hdc shell "cat /sys/class/drm/card0-LVDS-1/status" hdc shell "cat /sys/class/drm/card0-LVDS-1/enabled" hdc shell "cat /sys/class/drm/card0-HDMI-A-1/status 2>/dev/null" # 4. 真正扫的是哪一路、时钟多少 hdc shell "mount -t debugfs none /sys/kernel/debug" hdc shell "cat /sys/kernel/debug/dri/0/summary" # 5. 设备树 hdc shell "cat /proc/device-tree/lvds-panel/status; echo" hdc shell "find /proc/device-tree -name compatible | xargs grep -a simple-panel" # 6. 37 秒那一刀 hdc shell "dmesg | grep -i disabling" # 7. 用户态 hdc shell "pidof render_service composer_host"

合格大致是:

U-Boot / 内核:VOP update mode to: 1024x600p0, type: LVDS0 for VP2 summary:VP2 ACTIVE,connector LVDS-1,clk 约 51200 lvds-panel/status:okay card0-HDMI-A-1:没有,或 disconnected 且 enabled=disabled dmesg:没有 vcc3v3_lcd_lvds: disabling pidof render_service:有号

时钟是 65000,你开成 RGB 了。时钟是 HDMI 那档(148500 一类),主显示还在 HDMI。时钟对了,才算扫的是这条 LVDS。

failed to init overlay plane Cluster0-win0能出桌面的镜像里也有。不是判据。plane 分给 disabled 的 VP,才要回头看 route。


没有 DCS,不要往 LVDS 节点里塞 init sequence

MIPI 屏上电要一组 DCS 包:11退出休眠,29开显示,再加上厂商私有的 gamma。LVDS 没有这套。simple-panel加上 timing、bus-format、enable-gpio、backlight,就是它的「初始化」。你把 MIPI 的panel-init-sequence抄进lvds-panel,dtc 也许能过,驱动不认,屏仍然按 timing 去扫。不要制造一份没人读的字节。

反过来,切到 MIPI 时不要指望只改时钟就能出画。没有 DCS,玻璃停在休眠。那是下一篇的事。


和 HDMI 对打一次

同一份内核,换 dts 开关就能在两路之间切。建议真的切一次。

切到 LVDS:四件套 + PHY + panel timing 打开,HDMI / RGB / DSI / eDP 全关,DSI panel 改 compatible。刷 p4 和 p5,eMMC 的 p4 也刷。串口应打出type: LVDS0 for VP2。插不插 HDMI 线,summary 的 ACTIVE 都必须是 LVDS-1。若 HDMI 又把桌面抢走,就是&hdmi没关干净。

再切回 HDMI:按 HDMI 那篇打开 VP0,把 LVDS 四件套和 PHY 关掉。刷同一对分区。拔线,card0-HDMI-A-1/status必须变成disconnected。LVDS 做不到这件事——它没有 HPD。谁先学会不信 simple-panel 的 connected,谁就少在 LVDS 上误判。

窗口取向跟 1024×600 横屏走。HCS 的solutionX/Y同步改。只换屏不改触摸,划起来整块玻璃是歪的。


黑屏对照表

现象先查常见原因
真屏只有背光,旁边 HDMI 有桌面`dri/0/summary` 的 connector`&hdmi` 没关
真屏只有背光,没插 HDMI是否还有 RGB/DSI/eDP 的 simple-panel okay另一路抢主显示
改了 dts,仍是 HDMI 时钟`/proc/device-tree`;p4 刷了没没刷 resource
dd 成功画面不变`ls -l /dev/block/mmcblkXp4`路径少了 `/block/`
`[drm] Initialized` 没有四件套、PHY、endpoint内核显示没起来
有 Initialized,无 LVDS-1`&lvds` / panel status;HDF 误抓 DSI控制器没 probe
花屏、偏色bus-format、极性、porchJEIDA 写成 VESA,或抄了 RGB 的高有效
约 37 秒后黑,hdc 还在`dmesg` 的 disabling孤儿 regulator 被 late cleanup
`power-shell wakeup` 能醒hilog 的 blank电源超时,不是 LVDS 时序
能亮不能点i2cdetect 0x5d;GPIO0_C7内核主线 gt911 抢总线,或 INT 被 lcd0_n 占用
点上半屏失灵HCS solutionX/Y仍按 720×1280 报点
Cluster plane init failed旧包是否也有这行经常是红鲱鱼

时序只修「DRM 起来了但屏扫错」那一小支。卡 logo 的分层在显示总论。LVDS 这篇多出来的两刀,是 51.2 MHz 这一组数字,和 37 秒那路电。


现场一条最短路径

dts 已按本文打开 LVDS、关掉其余。串口 1500000 开着。

上电看有没有Linux version,有没有[drm] Initialized,有没有type: LVDS0 for VP2。没有这三行,停,不要拧背光旋钮。

hdc 连上。cat /proc/partitions。resource、boot_linux 按/dev/block/写到 p4、p5,eMMC 的 p4 也写。reboot。

起来后读 summary。VP2、LVDS-1、clk 51200。对不上就不要进应用。对上了再看pidof render_service。空的去查 so 和 hilog。有号、屏黑:先等一分钟看会不会 37 秒掉电;再power-shell wakeup

触摸放到画面稳定之后。i2cdetect -y -r 2看到 0x5d,再划。扫到 0x38 是另一块屏,FT5406 那篇。

这条路径里没有「给 LVDS 加 DCS」这一步。需要 DCS 的是 MIPI。


背光和使能脚,亮暗先量这两根

时序对、summary 的 clk 是 51200、画面仍暗,多半不是 porch,是背光或使能。

PWM4 在 sysfs 里常见:

hdc shell "ls /sys/class/backlight/" hdc shell "cat /sys/class/backlight/*/brightness" hdc shell "cat /sys/class/backlight/*/max_brightness"

brightness 是 0,把数字写到中间值,屏该亮起来。写了不变,PWM 脚没出波形。查&pwm4的 pinctrl,以及 HDFlcd_config.hcspwmDevNum。必须是 4。写错号,时序对、有影像、就是暗。示波器探 PWM4,没有方波就不要再改hsync-len

&pwm5在这块板上必须disabled。它默认占 GPIO0_C4,那是 MIPI 相机的 PWDN。为了「多开一个 PWM 试试背光」把它打开,相机会一起死。背光只走 pwm4。

使能脚 GPIO3_C3 高有效。debugfs 里看电平:

hdc shell "mount -t debugfs none /sys/kernel/debug" hdc shell "cat /sys/kernel/debug/gpio" | grep -iE 'pc3|C3|lvds'

期望 out、高。低,panel 没 enable,差分对即使在扫,玻璃也不上电。pinctrl 若仍是 LCDC DEN,脚不归 GPIO,enable-gpios 是空操作。四选一关掉 RGB,就是把 DEN 还给这根脚。

供电脚是vcc3v3_lcd_lvds那颗 fixed regulator。37 秒后若变低,就是 late cleanup。regulator-always-on之后应保持高。两根脚都高、PWM 有波形、clk 51200,还暗,才轮到排线和玻璃本身。

HDF 背光配置写在vendor/rk/rk3568_evb/hdf_config/khdf/lcd/lcd_config.hcs

root { backlightConfig { pwmBacklightConfig { match_attr = "pwm_bl_dev"; pwmDevNum = 4; pwmMaxPeriod = 25000; backlightDevName = "hdf_pwm"; minBrightness = 0; defBrightness = 127; maxBrightness = 255; } } }

pwmDevNum和 dts 的&pwm4必须是同一颗。改 HCS 要清 khdf 的 hcb 再编内核,刷 boot_linux。显示几何在 resource 的 dtb,背光号在内核 Image 里的 HCS 数组,两张镜像都要新。


JEIDA 24bit 在差分上长什么样

MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA这个宏拆开读:RGB888,每通道 8 bit;1X7X4 表示 LVDS 四对差分、每对串 7 bit 的那一种打包。JEIDA 和 VESA/SPWG 的差别是这 7 bit 里 RGB 谁在前。写错宏,像素时钟仍是 51.2 MHz,桌面能出来,颜色是错的:红蓝对调,或者某一通道缺。

不要「先用 VESA 试试」。屏参写 JEIDA 就写 JEIDA。你用 HDMI 转 LVDS 盒子去看可能会「正常」,因为盒子按自己的映射解。直接接玻璃就必须和玻璃一致。改宏比改 porch 更对症。

极性全是 0:hsync、vsync、DE、pixelclk 低有效。RGB 那块 7 寸常见反过来,高有效,时钟 65 MHz。两套 timing 不能混。把 RGB 的hsync-active = <1>抄进 LVDS,同步会漂。

像素时钟不要按 60 Hz 反推。水平一行 1414,垂直一帧 655,1414 × 655 × 60 ≈ 55.6 MHz。datasheet 是 51.2 MHz,刷新率大约 55 Hz。改成 55570200,PLL 和屏都可能不认。钉死51200000


横屏 1024×600:竖条不是 porch 错了

桌面只占一块竖条,左右黑,summary 明明是 1024x600。第一反应是改 hback-porch。别改。

窗口服务若按竖屏申请,合成器会把 600×1024 的内容画进 1024×600 的扫描。看起来像时序,其实是取向。板级显示策略把内置取向写成横屏,Launcher 才按宽边铺。触摸 HCS 的solutionX/Y必须还是 1024/600,和取向一起改。只改窗口不改触摸,划线是歪的;只改触摸不改窗口,点得准但画面竖着。

hdc shell "hidumper -s RenderService | grep -iE '1024|600|720|1280|orient'" hdc shell "cat /proc/bus/input/devices"

RenderService 里看到 1024×600 的层,窗口对了。仍是竖条,再查策略文件,不要回头改 51.2 MHz。

GT911 的 INT 是 GPIO0_C7,复位是 GPIO2_D0。HCS:

inputAttr { inputType = 0; solutionX = 1024; solutionY = 600; devName = "main_touch"; }; busConfig { busType = 0; busNum = 2; }; pinConfig { rstGpio = 88; intGpio = 23; };

rstGpio = 88是 GPIO2_D0(2×32+24+0)。intGpio = 23是 GPIO0_C7(0×32+16+7)。脚对了、分辨率错了,照样点不准。改 HCS 清 hcb,刷 boot_linux。显示几何刷 p4。两张镜像都要新。

公版 dtsi 可能给vcc3v3_lcd0_ngpio = GPIO0_C7。开机把 INT 拉高,cleanup 再拉低,触摸中断锁死。显示看起来「能亮不能点」。板级删掉那根 gpio 属性。脚是触摸的,不是屏电源的。


一整段能对照的 LVDS 开关

调试时容易漏一行。下面按「只开 LVDS」收成一份。panel 时序不要改数字。power-supplyregulator-always-on同时写,是双保险。不要只留 boot-on。

&video_phy0 { status = "okay"; }; &lvds_in_vp2 { status = "okay"; }; &lvds { status = "okay"; }; &route_lvds { status = "okay"; connect = <&vp2_out_lvds>; }; &lvds_panel { status = "okay"; }; &backlight { status = "okay"; }; &pwm4 { status = "okay"; }; &hdmi { status = "disabled"; }; &hdmi_in_vp0 { status = "disabled"; }; &hdmi_in_vp1 { status = "disabled"; }; &route_hdmi { status = "disabled"; }; &rgb { status = "disabled"; }; &rgb_in_vp2 { status = "disabled"; }; &route_rgb { status = "disabled"; }; &edp { status = "disabled"; }; &edp_in_vp0 { status = "disabled"; }; &dsi1 { status = "disabled"; }; &dsi0 { status = "disabled"; }; &dsi0_panel { compatible = "simple-panel-dsi-disabled"; };

video_phy0/sys里应当是 bound。disabled 的时候&lvds即使 okay 也扫不出差分。RGB 镜像里它必须 disabled。切来切去时看这一行。

hdc shell "ls /sys/bus/platform/drivers/*/fdc60000.syscon:lvds 2>/dev/null" hdc shell "dmesg | grep -i 'video_phy0\\|lvds'"

U-Boot 日志特征再钉一次:

VOP update mode to: 1024x600p0, type: LVDS0 for VP2

内核 summary 的 clk 约 51200。两行对上,才是这路屏。clk 是 65000,刷成 RGB 了。clk 是 148500 一类,主显示还在 HDMI。


pinctrl:GPIO3_C3 必须是 GPIO,不能是 DEN

LVDS 的使能脚和 RGB 的 DEN 经常是同一根。开 LVDS 时 pinctrl 必须把它做成 GPIO:

lvds_panel_enable: lvds-panel-enable { rockchip,pins = <3 RK_PC3 RK_FUNC_GPIO &pcfg_pull_none>; };

&lvds_panelpinctrl-0引用这个。RGB 那路的lcdc_ctl若仍把这根脚编进 DEN,后 probe 的 pinctrl 会把 GPIO 抢走。enable-gpios 变成空操作,PHY 在跳,玻璃没上电。

所以四选一不只是 DRM 连接器的事,也是管脚所有权的事。开 LVDS 必须关&rgb&route_rgb。debugfs 里这只脚应当显示为 GPIO、输出、高电平,名字里能看到 panel enable 或 lvds,而不是 lcdc。


系列第 18 篇 · 芯片:瑞芯微 RK3568 · OpenHarmony 4.1(API 11) · Linux 5.10

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询