1291034_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

1291034_zh-CN

1291034_zh-CN

如何在 imx8mm 上保持从 uboot 到内核的徽标。

当 Uboot 启动时,我可以在屏幕上看到徽标图片,但是在 " 启动内核 " 之后屏幕会变黑

i.MX 8M | i.MX 8M Mini | i.MX 8M NanoRe: How to keep logo from uboot to kernel on imx8mm.

我使用的是内核 6.6.52 和 uboot v2024.04。我有 variscite 的产品,所以我使用它们的树枝。

Re: How to keep logo from uboot to kernel on imx8mm.

感谢@topphysician分享您的解决方案。我将在我的下一个电路板支持包版本中尝试一下,并告诉你它是否也能正常工作。

能否请您告诉我,在进行这些更改时,您使用的是哪个版本的 uboot 和内核?

Re: How to keep logo from uboot to kernel on imx8mm.

我找到了一种方法,对我很有效。

我在内核中创建了一个预留内存节点,并在 fb-con 中显示了内容。在 u-boot 中,我用加载的帧缓冲区修复/填充预留内存节点。

这是为 imx8mn 设置的,但我也为 imx8mp 设置了类似功能

如果有人知道正确的方法或更好的方法,我很乐意倾听


Re: How to keep logo from uboot to kernel on imx8mm.

嗨,@topphysician

我也没有找到解决办法。在我的测试中,我尝试了和你一样的操作,但最终还是出现了随机启动错误。
目前,我只能在uboot和内核启动之间短时间内显示屏关闭。

问候
Cedric

Re: How to keep logo from uboot to kernel on imx8mm.

你找到解决办法了吗?
我什么办法都试过了,但都不太成功。我已经从 uboot 中删除了"mipi shutdown" (这样 uboot-splash 就会一直显示到内核),但当内核启动到一定程度时,屏幕开始逐渐消失。

Re: How to keep logo from uboot to kernel on imx8mm.

看起来与我的页面有些不同。
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 和内核?


Re: How to keep logo from uboot to kernel on imx8mm.

#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

Re: How to keep logo from uboot to kernel on imx8mm.

嗨,史蒂文、

你只在 uboot 中做了更改,显示屏在包括屏幕内容在内的整个内核启动过程中都能继续工作?
在我的尝试中,内核电源管理单元在内核启动过程中多次停止和重启 mipi 单元时遇到了很大的问题。
当我在 uboot 结束时禁用了 mipi 驱动程序关机后,我的内核在 3 次尝试中只有 2 次正确启动。因此,这在实践中是行不通的。

Re: How to keep logo from uboot to kernel on imx8mm.

我对 uboot 进行了代码修改,以保持显示驱动程序正常运行;但它偶尔会将闪屏随机向上或向右移动若干像素。 也许这就是他们关闭显示屏的原因......

Re: How to keep logo from uboot to kernel on imx8mm.

你好@Bio_TICFSL

您添加的链接显示了如何将 Linux 企鹅更改为自己的徽标。但最初的问题是关于从 uboot 向内核传递闪屏的。

你今天也有解决方案吗?


此致

塞德里克

Re: How to keep logo from uboot to kernel on imx8mm.

你好@ruansy

您已经找到解决这个问题的办法了吗?

@Bio_TICFSL的链接很有趣,但只展示了如何用自己的徽标替换 Linux 企鹅。

我也在寻找关于如何在uboot中显示任何启动画面并保持活动状态直到Linux完成启动的解决方案。我用基于 imx6 的示例做了很多研究,但是 mipi 接口完全不同,启动 Linux 时的电源管理单元也完全不同。

因此,如果您有任何进一步的信息,我将非常感兴趣。


预先致谢

塞德里克


Re: How to keep logo from uboot to kernel on imx8mm.

HI

如何在 uboot 中初始化 MIPI DSI 控制器并显示标识

Re: How to keep logo from uboot to kernel on imx8mm.

你好 ruansy、

也许这个链接能帮到您:

https://developer.toradex.com/knowledge-base/splash-screen-linux


此致


Re: How to keep logo from uboot to kernel on imx8mm.

是的,我也想知道如何解决这个问题。从 u-启动 切换到内核显示屏时,屏幕始终是黑色的,并且无法连续显示徽标。如何解决这个问题?

Re: How to keep logo from uboot to kernel on imx8mm.

电路板支持包 版本为 L5.4.70-2.3.0

Re: How to keep logo from uboot to kernel on imx8mm.

嗨,@topphysician

我用 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");
}

Tags (1)
No ratings
Version history
Last update:
‎01-24-2026 02:30 AM
Updated by: