NXP MCU 技术论坛
直播中

zhongnian

9年用户 1453经验值
擅长:MEMS/传感技术
私信 关注
[问答]

i.MX8M Plus PSPLASH如何在显示器上设置不同的行为?

我在应用程序中设置 PSplash 时遇到了一些问题:我的电路板上同时连接了 LVDS 显示器和 HDMI 显示器。
主要问题是 LVDS 显示器旋转了 180°,因此我的 psplash 屏幕在两个显示器之一中是倒置的。我看到两个显示器都与同一个帧缓冲区相关联,因此图像只是在它们上复制。即使分辨率相同,因此图像占据了 HDMI 显示器的一小部分。
如何在显示器上设置不同的行为?

回帖(1)

cherry1989

2025-3-26 17:58:43

在i.MX8M Plus上实现双显示器独立配置PSplash的行为,需要从显示驱动层和用户空间工具协同调整。以下是分步解决方案:




1. 确认显示输出模式


首先确定两个显示器是否运行在 镜像模式(同一帧缓冲)或 扩展模式(独立帧缓冲):


# 查看当前连接的显示设备及对应帧缓冲
cat /sys/class/graphics/fb0/name  # 通常为主显示器
cat /sys/class/graphics/fb1/name  # 若存在,则为次显示器

若只有一个fb0,需配置内核以支持多独立帧缓冲。




2. 设备树配置多显示输出


在设备树中为LVDS和HDMI分配独立显示控制器(如DCSS和LCDIF),确保生成独立帧缓冲:


&dcss {
    status = "okay";
    ports {
        dcss_out: port@0 {
            reg = <0>;
            dcss_to_ldb: endpoint {
                remote-endpoint = <&ldb_from_dcss>;
            };
        };
    };
};

&ldb {
    status = "okay";
    lvds-channel@0 {
        reg = <0>;
        fsl,data-mapping = "spwg"; // 根据屏幕规格调整
        fsl,data-width = <24>;
        crtc = "dcss";
        rotate = <180>; // 设置180度旋转
        port {
            ldb_from_dcss: endpoint {
                remote-endpoint = <&dcss_to_ldb>;
            };
        };
    };
};

&hdmi {
    status = "okay";
    port@0 {
        hdmi_out: endpoint {
            remote-endpoint = <&hdmi_connector_in>;
        };
    };
};

重新编译设备树并更新,确保生成fb0fb1




3. 配置PSplash多显示器支持


PSplash默认使用单一帧缓冲,需修改源码支持多设备:


// 在psplash-fb.c中,初始化时检测多个fb设备
for (int i = 0; i < 2; i++) {
    char devname[16];
    snprintf(devname, sizeof(devname), "/dev/fb%d", i);
    int fb_fd = open(devname, O_RDWR);
    if (fb_fd >= 0) {
        // 配置各fb参数(旋转、分辨率)
        struct fb_var_screeninfo vinfo;
        ioctl(fb_fd, FBIOGET_VSCREENINFO, &vinfo);
        vinfo.rotate = (i == 0) ? 180 : 0; // LVDS旋转180度
        ioctl(fb_fd, FBIOPUT_VSCREENINFO, &vinfo);
        // 分别渲染图像到每个fb
        render_to_fb(fb_fd);
        close(fb_fd);
    }
}

重新编译PSplash并替换原可执行文件。




4. 内核启动参数调整


在U-Boot中传递视频参数,强制各显示接口独立:


video=HDMI-A-1:1920x1080M@60 video=LVDS-1:1024x600M@60,rotate=180

确保内核正确解析参数并初始化各显示设备。




5. 用户空间双屏配置(可选)


若PSplash无法完全处理,可在系统启动后使用weston.inixorg.conf配置独立显示:


# weston.ini
[output]
name=LVDS-1
mode=1024x600
transform=rotate-180

[output]
name=HDMI-A-1
mode=1920x1080

但此配置仅影响窗口系统,不影响PSplash阶段。




6. 替代方案:分阶段显示



  • U-Boot阶段:在U-Boot中显示初始LOGO到LVDS。

  • PSplash阶段:仅输出到HDMI,通过环境变量控制:
    # 设置PSplash仅使用HDMI对应的fb设备
    export PSPLASH_FB=/dev/fb1
    psplash &




总结


关键在于确保LVDS和HDMI使用独立帧缓冲,并通过驱动层设置旋转和分辨率。修改PSplash支持多帧缓冲渲染,或分阶段控制显示输出。若时间有限,优先调整LVDS的旋转参数,并接受HDMI的显示缩放,后续在窗口系统中进一步优化。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分