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-panel的display-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` | 0 | DE 反了 |
| `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_n、pcie30_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 >911_int_pin >911_rst_pin>; gt911_lvds: gt911@5d { compatible = "goodix,gt911"; pinctrl-names = "default"; pinctrl-0 = <>911_int_pin >911_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 = 2,intGpio = 23,rstGpio = 88,solutionX = 1024,solutionY = 600,moduleName = "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、极性、porch | JEIDA 写成 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.hcs的pwmDevNum。必须是 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_n配gpio = GPIO0_C7。开机把 INT 拉高,cleanup 再拉低,触摸中断锁死。显示看起来「能亮不能点」。板级删掉那根 gpio 属性。脚是触摸的,不是屏电源的。
一整段能对照的 LVDS 开关
调试时容易漏一行。下面按「只开 LVDS」收成一份。panel 时序不要改数字。power-supply和regulator-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_panel的pinctrl-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