屏幕与显示切换

本篇目标:搞懂板子”一套硬件、两种显示输出”是怎么回事,学会在 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,115200

U-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
上一篇:
下一篇: