在i.MX8M Plus上实现双显示器独立配置PSplash的行为,需要从显示驱动层和用户空间工具协同调整。以下是分步解决方案:
首先确定两个显示器是否运行在 镜像模式(同一帧缓冲)或 扩展模式(独立帧缓冲):
# 查看当前连接的显示设备及对应帧缓冲
cat /sys/class/graphics/fb0/name # 通常为主显示器
cat /sys/class/graphics/fb1/name # 若存在,则为次显示器若只有一个fb0,需配置内核以支持多独立帧缓冲。
在设备树中为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>;
};
};
};重新编译设备树并更新,确保生成fb0和fb1。
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并替换原可执行文件。
在U-Boot中传递视频参数,强制各显示接口独立:
video=HDMI-A-1:1920x1080M@60 video=LVDS-1:1024x600M@60,rotate=180确保内核正确解析参数并初始化各显示设备。
若PSplash无法完全处理,可在系统启动后使用weston.ini或xorg.conf配置独立显示:
# weston.ini
[output]
name=LVDS-1
mode=1024x600
transform=rotate-180
[output]
name=HDMI-A-1
mode=1920x1080但此配置仅影响窗口系统,不影响PSplash阶段。
# 设置PSplash仅使用HDMI对应的fb设备
export PSPLASH_FB=/dev/fb1
psplash &关键在于确保LVDS和HDMI使用独立帧缓冲,并通过驱动层设置旋转和分辨率。修改PSplash支持多帧缓冲渲染,或分阶段控制显示输出。若时间有限,优先调整LVDS的旋转参数,并接受HDMI的显示缩放,后续在窗口系统中进一步优化。
举报
更多回帖