屏幕与显示切换
本篇目标:搞懂板子”一套硬件、两种显示输出”是怎么回事,学会在 RGB 屏(1024×600) 和 HDMI(1920×1080) 之间切换,并知道黑屏时先查什么。
板子支持两种显示输出(双模)
YPT153EVB 的显示走两套路径,出厂固件都支持,但同一时刻只能用一种模式:
| 模式 | 路径 | 典型分辨率 | 接口 |
|---|---|---|---|
rgb |
芯片 RGB LCD 控制器 → 直接推屏 | 1024×600 | 底板 RGB/LCD 排针或座 |
hdmi |
芯片 DSI → LT8912B 桥片 → HDMI | 1920×1080 | 底板 HDMI 座 |
关键纠正(与旧资料不符):显示桥片是 LT8912B(不是 LT8912C);HDMI 的桥片初始化在 U-Boot 侧完成,内核只负责 DSI 部分。
出厂默认模式为 rgb。
怎么切换(switch_display)
板上已内置切换脚本 switch_display,它本质是修改 U-Boot 环境变量 display_mode 并写入 env 分区,重启后生效:
# 切到 HDMI 模式(接了 HDMI 显示器时用)
root@YPT153EVB:~# switch_display hdmi
# 切回 RGB 模式(接了 RGB 屏时用)
root@YPT153EVB:~# switch_display rgb
# 然后必须重启
root@YPT153EVB:~# reboot切换后可在 U-Boot 里确认:
=> printenv display_mode
display_mode=hdmi或直接到系统里看:
root@YPT153EVB:~# fw_printenv display_mode
display_mode=hdmi接线与硬件
- RGB 屏:把 1024×600 的 RGB 屏接到底板 RGB/LCD 接口(注意排线方向、背光供电)。出厂就是这个模式,上电即有显示(含开机 Logo)。
- HDMI:用标准 HDMI 线连到显示器/电视。切到
hdmi模式重启后,LT8912B 桥片由 U-Boot 初始化,系统起来后 HDMI 输出 1920×1080。
两种模式不要同时指望都亮:切换是互斥的。接了 HDMI 就切
hdmi,接了 RGB 屏就切rgb。
原理简述(想深入时看)
设备树里有一个显示/屏相关节点(如 display / lcd / dsi 节点),模式切换其实就是改变这些节点的 status 以及告诉 U-Boot 走哪条路径:
rgb模式:启用 RGB LCD 控制器节点,关闭 DSI→HDMI 桥片路径。hdmi模式:启用 DSI + LT8912B 桥片节点,由 U-Boot 的lt8912b驱动(u-boot-bsp下的drivers/video/drm/panels/lt8912b.c)初始化 HDMI 输出。
PA20 这个 GPIO 是屏使能(display enable),屏不亮先确认它有没有被拉到正确电平。
排障
| 现象 | 先查 |
|---|---|
| 完全黑屏 | 确认 display_mode 与实际接的屏一致;确认屏供电/排线;确认 PA20 使能脚 |
| RGB 屏花屏/错位 | 屏时序与设备树 timings 是否匹配;排线接触 |
| HDMI 无输出 | 确认已 switch_display hdmi 并 reboot;显示器支持 1080p;HDMI 线完好 |
| 切换后还是旧模式 | 确认 reboot 了;fw_printenv display_mode 确认已写入 |
附:真实设备树片段(双模显示)
来自 BoardConfig/BoardType/ypt153evb-board.dts:
/* RGB 通路(默认激活):1024x600,像素时钟 61.47MHz */
&rgb_panel0 {
status = "okay";
enable0-gpios = <&pio PA 20 GPIO_ACTIVE_LOW>; // 屏使能
display-timings {
rgb0_timing0: timing0 {
clock-frequency = <61470000>;
hactive = <1024>; hback-porch = <90>;
hfront-porch = <182>; hsync-len = <70>;
vactive = <600>; vback-porch = <3>;
vfront-porch = <127>; vsync-len = <20>;
};
};
};
/* DSI->HDMI 通路(默认关闭):1920x1080,像素时钟 148.5MHz */
&panel_0 {
status = "disabled";
display-timings {
timing0 {
clock-frequency = <148500000>;
hactive = <1920>; vactive = <1080>; ...
};
};
};
&dsi0 { status = "disabled"; };切换本质(env.cfg):
display_mode=rgb # rgb 模式
# switch_display hdmi 会把它改成 hdmi 并写入 env,重启生效
console=ttyAS0,115200U-Boot 启动时读
display_mode,用fdt set覆盖rgb0/dsi0/panel_0的 status,内核与 U-Boot 共用同一份 DT,因此 Logo 与内核显示一起切换。
作者:Mai 创建时间:2026-10-20 16:49
最后编辑:Mai 更新时间:2026-11-05 14:56
最后编辑:Mai 更新时间:2026-11-05 14:56