首页 > 系统相关 >Linux开机LOGO更换以及附带问题

Linux开机LOGO更换以及附带问题

时间:2025-01-07 16:56:08浏览次数:1  
标签:clut224 flash area int Linux logo 开机 LOGO

应用层更换Linux机器开机启动LOGO

平台开机Logo默认是编译进内核的,更换起来很不方便,通过改写内核源码,可以实现应用层直接更换内核Logo。

1.uboot相关修改

网上教程一般会这么改

"loadlogo=mmc read 0x15000000 0x5800 0x2800;\0" \
"run loadlogo; " \

核心代码是mmc read 0x15000000 0x5800 0x2800;这个命令的作用是从MMC或SD卡的第22528(0x5800)个扇区开始,读取10240(0x2800)个扇区的数据,并将这些数据存储到内存地址0x15000000处。这种操作通常用于将存储设备上的数据加载到内存中,以便进行进一步的处理或执行。目的是将图片文件放到0x15000000处,用于后面logo.c文件中使用
但经过实践发现,这么改会存在"run loadlogo; "未执行的情况,从而导致LOGO更换不上。
故选择将最后一段改成:"else run netboot; fi; mmc read 0x15000000 0x5800 0x2800;" 解决。(可能还需要手动进uboot命令行,将bootcmd重置成默认)

2.kernel内核文件修改

修改drivers/video/logo/Kconfig文件
在最后新加一个LOGO_LINUX_CUSTOM_CLUT224的配置选项:

/* 在如下配置 */
config  LOGO_LINUX_CUSTOM_CLUT224
    bool "Custom 224-color linux logo"
    default y
endif # LOGO

修改drivers/video/logo/logo.c文件
到这一步可以有两种修改办法,这取决于后续LOGO图片是怎么处理的
首先在头部增加如下代码

/* logo's are marked __initdata. Use __init_refok to tell
 * modpost that it is intended that this function uses data
 * marked __initdata.
 */

#ifdef CONFIG_LOGO_LINUX_CUSTOM_CLUT224  //新增
#define IMAGE_HEAD_SIZE    	54
#define IMAGE_MAX_PIXEL    	2048000    	
#define IMAGE_MAX_SIZE (IMAGE_HEAD_SIZE+IMAGE_MAX_PIXEL+1024)
#define COLOR_MAX_NUM    	224        	/* linux logo just support 224 colors     		*/
#define IMAGE_MTD_NUM    	4        	/* the logo saved in MTD4 						*/
#define IMAGE_OFFSET    	0x0			/* the logo's offset int the mtd area     		*/
volatile static unsigned char* remapped_area;
static unsigned char logo_flash_clut224_data[IMAGE_MAX_PIXEL] __initdata = {0};
static unsigned char logo_flash_clut224_clut[COLOR_MAX_NUM * 3] __initdata = {0};
static struct linux_logo logo_flash_clut224 __initdata =
{
	.type      = LINUX_LOGO_CLUT224,
	.width     = 0,
	.height    = 0,
	.clutsize  = 0,
	.clut      = logo_flash_clut224_clut,
	.data      = logo_flash_clut224_data,
};
#endif

const struct linux_logo * __init_refok fb_find_logo(int depth)
{
	const struct linux_logo *logo = NULL;

	if (nologo)...

后续分成:LINUX上处理图片WINDOWS上处理图片
如果图片在Linux上处理,在if (depth >= 8)做如下修改:

if (depth >= 8)
	{
#ifdef CONFIG_LOGO_LINUX_CUSTOM_CLUT224
		unsigned char head[60] = {0};
		unsigned char *image = NULL;
		unsigned char *clut = NULL;
		unsigned char *data = NULL;
		
		int clutsize = 0;
		int size      = 0;
		int offset    = 0;
		int width     = 0;
		int height    = 0;
		int count     = 0;
		int compress  = 0;
		int sizeimage = 0;
		int clrused   = 0;

		int i  = 0;
		int j  = 0;
		int fi = 0;
		int li = 0;
		
		unsigned int real_width = 0;
		unsigned int logo_index = 0;

		remapped_area = __phys_to_virt(0x15000000);
		memcpy(head, remapped_area, 58);
		printk("image head:%c%c\n", head[0], head[1]);

		if(head[0] == 'K' && head[1] == 'I'&& head[2] == 'K')
		{
			printk("right ppm image head");
			memcpy( &logo_flash_clut224.width, remapped_area+3, 4);
			memcpy( &logo_flash_clut224.height, remapped_area + 4+3, 4);
			memcpy( &logo_flash_clut224.clutsize, remapped_area + 8+3, 4);
			memcpy( logo_flash_clut224.data, remapped_area + 15, logo_flash_clut224.width * logo_flash_clut224.height);
			memcpy( logo_flash_clut224.clut, remapped_area + 15 + (logo_flash_clut224.width * logo_flash_clut224.height), logo_flash_clut224.clutsize * 3);
			logo=&logo_flash_clut224;
		}
		else
		{
#ifdef CONFIG_LOGO_LINUX_CLUT224
			printk("LINUX_clut224\n");
			logo = &logo_linux_clut224;
#endif
		}
#endif

如果选择在Windows上处理LOGO图片,代码改成

#ifdef CONFIG_LOGO_LINUX_CUSTOM_CLUT224
		unsigned char head[60] = {0};
		unsigned char *image = NULL;
		unsigned char *clut = NULL;
		unsigned char *data = NULL;
		
		int clutsize = 0;
		int size      = 0;
		int offset    = 0;
		int width     = 0;
		int height    = 0;
		int count     = 0;
		int compress  = 0;
		int sizeimage = 0;
		int clrused   = 0;

		int i  = 0;
		int j  = 0;
		int fi = 0;
		int li = 0;
		
		unsigned int real_width = 0;
		unsigned int logo_index = 0;

		remapped_area = __phys_to_virt(0x15000000);
		memcpy(head, remapped_area, 58);
		printk(" %s-%d:right image head:%c%c\n", __FILE__, __LINE__, head[0], head[1]);

		if(1)
		{
			printk("right ppm image head");
			memcpy( &logo_flash_clut224.width, remapped_area+4, 4);
			memcpy( &logo_flash_clut224.height, remapped_area + 8, 4);
			memcpy( &logo_flash_clut224.clutsize, remapped_area + 12, 4);
			memcpy( logo_flash_clut224.data, remapped_area + 16, logo_flash_clut224.width * logo_flash_clut224.height);
			memcpy( logo_flash_clut224.clut, remapped_area + 16 + (logo_flash_clut224.width * logo_flash_clut224.height), logo_flash_clut224.clutsize * 3);
			logo=&logo_flash_clut224;
		}
		else
		{
#ifdef CONFIG_LOGO_LINUX_CLUT224
			printk("LINUX_clut224\n");
			logo = &logo_linux_clut224;
#endif
		}
#endif

没错,就是因为后续图片格式会有所不一样,读取图片信息的方式也不同。

之后在然后重新编译内核。配置内核时,需要去掉logo路径下的其它选项,只保留Custom 224-color linux logo这一个选项。

3.LOGO图片修改

因为Logo图片中所使用的颜色数不能超过224种,如果超过将无法正常显示,因此我们需要制作符合要求的图像。

Linux环境下制作:
先下载附件res

Windows环境下制作:方法是我自己寻找制作的,因为有这种需求,安装包放在云盘中
链接:https://pan.baidu.com/s/1Yn7BtTh4GtVqoS-cc2nU8Q?pwd=1234
提取码:1234
按照文件中readme.txt一步步执行即可

两者都是为了把图片制作成mylogo.bin提供给logo.c解读,使LOGO修改生效
你用哪种方式,上述logo.c就改成哪种就行。

4.去除linux的开机光标

光标会导致LOGO图片显示时,左上角有黑块,方法如下:

在内核的当前目录进入到drivers/video/console/fbcon.c文件
将static void fb_flashcursor(void *private) 和 static void fbcon_cursor(struct vc_data *vc, int mode) 里的内容注释掉,使之变成空函数

我的建议是在这两个函数开头直接return;就行

参考连接:
如何修改 ARM Linux 系统的启动画面
去除linux的开机光标
应用层更换内核启动logo

标签:clut224,flash,area,int,Linux,logo,开机,LOGO
From: https://www.cnblogs.com/xxghw/p/18657776

相关文章

  • Linux文件系统的安全保障---Overlayroot!
    `overlayroot` 是一种使用 OverlayFS 实现的功能,可将根文件系统挂载为只读,并通过一个临时的写层实现对文件系统的修改。这种方法非常适合嵌入式设备或需要保持系统文件完整性和安全性的场景。下文以 RK3568 平台为例,介绍制作 overlayroot 的详细步骤。​1. 制作精简文......
  • Linux下安装paraview的疑难杂症&方法
    1.下载安装包(https://www.paraview.org/),linux则选择对应的linux版本。此网站下载速度较慢可以耐心等待。2.解压缩安装包:sudotar-xzvfParaView-5.12.1-MPI-Linux-Python3.10-x86_64.tar.gz-C/opt///解压缩到根目录下opt文件夹cd/opt/......
  • BUG:SWM32开机绘制lvgl框架下的某个自定义控件死机
    一.BUG描述现象1.画了一个关于"模式"的自定义控件,结果开机绘制总是死机。现象2.用keil进行仿真调试全速运行同样死机,但是如果在异常处加断点,然后单步调试就正常。(注:仿真调试比直接运行的速度要慢)现象3.把这个异常对象的创建代码删除,再后面加四个打印追踪,还是死机;但是删除两个......
  • linux 服务器清理
    起因服务器报错:nospaceleftondevice翻译:设备上没有剩余空间解决方法清理数据,这里有个点要注意,对于重要文件,一定要备份。步骤1首先,需要确定哪个分区或目录占用了大量空间。df-h执行结果示例:FilesystemSizeUsedAvailUse%Mountedonudev......
  • linux防火墙相关命令,开启关闭端口,服务,防火墙等
    linux防火墙相关命令,开启关闭端口,服务,防火墙等注意:以下所有命令在centos7.6环境下测试,其他linux环境请自行测试注意:在linux中,不是管理员登录,最好在指令前加上sudo提权,避免权限不够执行失败带来的麻烦,以下命令请都加上sudo,这是一个好习惯。#开启/关闭防火墙systemctlstartfi......
  • Linux(Centos 7.6)命令详解:rmdir
    1.命令作用如果目录为空,则删除该目录(RemovetheDIRECTORY(ies),iftheyareempty)2.命令语法Usage:rmdir[OPTION]...DIRECTORY...3.参数详解OPTION:--ignore-fail-on-non-empty,忽略每个因为目录为非空的错误(如果目录非空,不会报错也不会删除非空目录)-p,--parent......
  • [shell/linux] Shell 管道流机制及原理
    缘起:shell管道流Shell有一种功能,就是可以将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,以这种方式连接的两个或者多个命令就形成了管道(pipe)。那么,shell管道流的原理是如何的?以多个管道流命令(catxxx.log|grep-i"keyword"|jq-r......
  • Linux 文件的特殊权限—ACL权限控制
    本文为UbuntuLinux操作系统-第二十期~~其他特殊权限:【SUID权限】,【SGID权限】,【SBIT权限】更多Linux相关内容请点击......
  • Linux系统如何优雅的关机
    Llinux系统正确关机的姿势在Linux程序里,有很多程序或者说是服务都是在背景下执行的,可能在背景的后面会有很多任务在工作,如果直接按下电源键,内存中的数据可能会来不及同步到硬盘中导致数据丢失。除此之外,如果不是正常关机,则可能会造成文件系统的损坏,因此,在关机的时候需要注意以下......
  • IPoIB模块初始化:深入解析Linux内核模块的初始化过程
    在Linux内核中,模块初始化是确保模块能够正确加载并运行的关键步骤。IPoverInfiniBand(IPoIB)模块作为一种网络技术模块,允许通过InfiniBand网络高效传输IP数据包。本文将深入解析IPoIB模块的初始化函数,展示其如何通过一系列配置和注册步骤为模块的运行做好准备。IPoIB模块的......