当 Uboot 启动时,我可以在屏幕上看到徽标图片,但是在 " 启动内核 " 之后屏幕会变黑
我使用的是内核 6.6.52 和 uboot v2024.04。我有 variscite 的产品,所以我使用它们的树枝。
感谢@topphysician分享您的解决方案。我将在我的下一个电路板支持包版本中尝试一下,并告诉你它是否也能正常工作。
能否请您告诉我,在进行这些更改时,您使用的是哪个版本的 uboot 和内核?
我找到了一种方法,对我很有效。
我在内核中创建了一个预留内存节点,并在 fb-con 中显示了内容。在 u-boot 中,我用加载的帧缓冲区修复/填充预留内存节点。
这是为 imx8mn 设置的,但我也为 imx8mp 设置了类似功能
如果有人知道正确的方法或更好的方法,我很乐意倾听
我也没有找到解决办法。在我的测试中,我尝试了和你一样的操作,但最终还是出现了随机启动错误。
目前,我只能在uboot和内核启动之间短时间内显示屏关闭。
问候
Cedric
你找到解决办法了吗?
我什么办法都试过了,但都不太成功。我已经从 uboot 中删除了"mipi shutdown" (这样 uboot-splash 就会一直显示到内核),但当内核启动到一定程度时,屏幕开始逐渐消失。
看起来与我的页面有些不同。
cpu.c 文件中没有使用 lcdif_power_down(),因为上述定义包含另一个条目:
#if defined(CONFIG_VIDEO_MXS) && !defined(CONFIG_DM_VIDEO)
lcdif_power_down();
#endif我曾尝试在 mxs_video_remove () 函数中删除 device_remove () 和 mxs_remove_common () 调用,但这有时会在启动内核时陷入死锁。
此外,内核在启动的前两秒内直接禁用了我的显示器。因此,这次代码修改并没有真正的附加值。
您使用的是什么版本的 uboot 和内核?
#if defined(CONFIG_VIDEO_MXS)
- lcdif_power_down();
+ /* lcdif_power_down(); */
#en
我只是注释掉了通话,关闭了液晶屏的电源。这样就不会出现无法预知的内核问题,也就不会在 U 盘启动后立即出现闪屏图像从中心位置随机移动的情况。 从日志时间来看,内核重新定位并开始执行代码需要 10 秒钟。 当内核初始化到达显示驱动程序时,任何闪屏偏移都会被驱动程序初始化纠正,然后写入内核相同的闪屏图像。 如果我让 uboot 给液晶屏掉电,我的黑屏时间会超过 10 秒。我将探索是否可以通过 lcdif_power_down()来取消内存映射,同时保持 LCD 背光打开等。
调试串行端口的内核日志。
[12:42:06.076]在 908056a0 处使用设备树,结束 90813a31 [12:42:06.083]
[12:42:06.083]Starting kernel ...
*** splash image sometimes shifts position ***
[12:42:06.083]
[12:42:17.085][0.000000] 在物理 CPU 上启动 Linux 0x0
嗨,史蒂文、
你只在 uboot 中做了更改,显示屏在包括屏幕内容在内的整个内核启动过程中都能继续工作?
在我的尝试中,内核电源管理单元在内核启动过程中多次停止和重启 mipi 单元时遇到了很大的问题。
当我在 uboot 结束时禁用了 mipi 驱动程序关机后,我的内核在 3 次尝试中只有 2 次正确启动。因此,这在实践中是行不通的。
我对 uboot 进行了代码修改,以保持显示驱动程序正常运行;但它偶尔会将闪屏随机向上或向右移动若干像素。 也许这就是他们关闭显示屏的原因......
你好@Bio_TICFSL、
您添加的链接显示了如何将 Linux 企鹅更改为自己的徽标。但最初的问题是关于从 uboot 向内核传递闪屏的。
你今天也有解决方案吗?
此致
塞德里克
你好@ruansy、
您已经找到解决这个问题的办法了吗?
@Bio_TICFSL的链接很有趣,但只展示了如何用自己的徽标替换 Linux 企鹅。
我也在寻找关于如何在uboot中显示任何启动画面并保持活动状态直到Linux完成启动的解决方案。我用基于 imx6 的示例做了很多研究,但是 mipi 接口完全不同,启动 Linux 时的电源管理单元也完全不同。
因此,如果您有任何进一步的信息,我将非常感兴趣。
预先致谢
塞德里克
HI
如何在 uboot 中初始化 MIPI DSI 控制器并显示标识
你好 ruansy、
也许这个链接能帮到您:
https://developer.toradex.com/knowledge-base/splash-screen-linux
此致
是的,我也想知道如何解决这个问题。从 u-启动 切换到内核显示屏时,屏幕始终是黑色的,并且无法连续显示徽标。如何解决这个问题?
电路板支持包 版本为 L5.4.70-2.3.0
我用 Linux 的 6.12.20 标签测试了你的补丁,用 imx8M Mini 测试了 U-启动。基本上,它对缩短U-启动和Linux之间的显示关闭时间有很大帮助。我本以为这次会彻底消除,但还是有一些,尽管比以前少了很多。
我对您的代码做了一些小改动,以便针对我的应用进行优化。
首先,我删除了 dtsi 文件中的 "splashFramebuffer "设置,现在可以动态计算这些值。这些硬编码值对我不起作用,因为我的 u-启动 支持 10 种不同图像大小的 Mipi 显示器。
最后,我的 "setFramebuffer "函数看起来是这样的:
#include
#include
void setFramebuffer(void * blob)
{
int ret;
int off;
uint64_t fb_base;
uint64_t fb_size;
struct udevice *dev;
struct video_priv *priv;
if(uclass_get_device(UCLASS_VIDEO, 0, &dev) != 0)
printf("ERROR: no video device available.\n");
priv = dev_get_uclass_priv(dev);
if (priv)
{
printf("FB_BASE = %p Size=%d X=%d Y=%d stride=%d\n", priv->fb, priv->fb_size, priv->xsize, priv->ysize, priv->line_length);
}
// Read the fb base and size
fb_base = (uint64_t)(priv->fb);
fb_size = priv->fb_size;
/* Find the splash_reserved node by compatible */
off = fdt_node_offset_by_compatible(blob, -1, "reserved,custom_splash");
if (off < 0) {
printf("No splash_reserved node found\n");
return;
}
printf("Setting framebuffer at 0x%llx\n", fb_base);
/* Write reg property: <0x0 base 0x0 size> as 4x u32 in big-endian */
uint32_t reg_prop[4];
reg_prop[0] = cpu_to_fdt32((uint32_t)(fb_base >> 32));
reg_prop[1] = cpu_to_fdt32((uint32_t)(fb_base & 0xFFFFFFFF));
reg_prop[2] = cpu_to_fdt32((uint32_t)(fb_size >> 32));
reg_prop[3] = cpu_to_fdt32((uint32_t)(fb_size & 0xFFFFFFFF));
ret = fdt_setprop(blob, off, "reg", reg_prop, sizeof(reg_prop));
if (ret < 0) {
printf("Failed to set reg property: %d\n", ret);
return;
}
/* Optional: also set 'splash-size' property as 64-bit big-endian */
ret = fdt_setprop_u64(blob, off, "splash-size", fb_size);
if (ret < 0) {
printf("Failed to set splash-size property: %d\n", ret);
return;
}
/* Set status property to "okay" */
ret = fdt_setprop_string(blob, off, "status", "okay");
if (ret < 0) {
printf("Failed to set status property: %d\n", ret);
return;
}
/* Optional: update node name to reflect new address, e.g. splash@44000000 → splash@fb_base */
char node_name[64];
snprintf(node_name, sizeof(node_name), "splash@%llx", fb_base);
ret = fdt_set_name(blob, off, node_name);
if (ret < 0) {
printf("Failed to rename node: %d\n", ret);
return;
}
printf("Framebuffer reserved memory updated in DTB.\n");
}