希望朋友们多多指点,好的技术或心得一起分享:
看了不少显示kernel开机logo的帖子,在经过数次实验后,针对224位色格式的logo图片进行以下总结:
一.更换开机logo
嵌入式linux下kernel的开机logo默认图片名为logo_linux_clut224.ppm,因此若有一张png格式的图片,将其换成ppm格式图片即可,转换方法可以用linux下的GIMP绘图软件(将分辨率改成与硬件平台分辨率一致,并转换成224位色格式),另一种方法可以用命令行进行(需要png转换为ppm的工具,自行下载):
pngtopnm mylogo.png > mylogo.pnmpnmquant 224 mylogo.pnm > mylogo224.pnm
pnmtoplainpnm mylogo224.pnm > logo_linux_clut224.ppm
其中mylogo.pnm和mylogo224.pnm为中间生成文件,结束后可以删除。最后将logo_linux_clut224.ppm拷贝值kernel主目录下的driver/video/logo/中,最后编译内核即可。
二.添加开机logo
自定义logo的制作与配置,(这里仍旧是224位色格式图片,其中custom名称可以自己改变):
1.在kernel目录下:
拷贝.ppm图片至logo目录中:
cp logo_linux_custom_224.ppm driver/video/logo/logo_custom_clut224.ppm
2.修改Kconfig文件:
vi driver/video/logo/Kconfig:
config LOGO_CUSTOM_CLUT224
bool "224-color CUSTOM Linux logo"
default y
3.修改Makefile文件:
vi driver/video/logo/Makefile:
添加:obj-$(CONFIG_LOGO_CUSTOM_CLUT224) += logo_custom_clut224.o
4.修改logo.h文件:
vi include/linux/linux_logo.h:
添加:extern const struct linux_logo logo_custom_clut224;
5.修改logo.c文件
vi driver/video/logo/logo.c:
fb_find_logo函数中:
在
#ifdef CONFIG_LOGO_LINUX_CLUT224
/* Generic Linux logo */
logo = &logo_linux_clut224;
#endif
后添加:
#ifdef CONFIG_LOGO_CUSTOM_CLUT224
/* Custom Linux logo */
logo = &logo_custom_clut224;
#endif
6.make menuconfig 确保自定义logo被选中:
Device Drivers --->
Graphics support --->
[*] Bootup logo --->
........
[*] 224-color CUSTOM Linux logo
最后编译内核即可,这样可以使多张logo共存于kernel中,若用户有以后要在文件系统中更改开机logo的需求的话,可以使用这种方法,用户层可以通过fw_setenv工具修改uboot中自定义好的参数,该参数从uboot中传递进kernel,重启后kernel根据参数的值进行判断使用哪一张logo。这样还得在uboot和kernel中添加自定义参数,并进行判断,这个且看下回分解。
另附logo居中显示方法(注:若图片分辨率和屏幕分辨率相同则不需要):
1.vi driver/video/fbmem.c:
fb_show_logo_line函数中:
在
image.dx=0;
image.dy=y;
image.width = logo->width;
image.heigh = logo->height;
后增加
image.dx = (info->var.xres / 2) - (image.width / 2);
image.dy = (info->var.yres / 2) - (image.height / 2);
(2)vi driver/video/console/fbcon.c:
fbcon_prepare_logo()函数中:
在
logo_height = fb_prepare_logo(info, ops->rotate)
后增加
logo_height += (info->var.yres / 2) - (logo_height / 2);
若有些朋友开机无法显示logo,可以参考以下方法试试:
在drivers/video/console/fbcon.c中:
fbcon_prepare_logo函数中:
将
logo_lines = DIV_ROUND_UP(logo_height, vc->vc_font.height);
修改为:
logo_lines = DIV_ROUND_UP(logo_height, (vc->vc_font.height+1));
*****************************************************************************************
若要对kernel启动logo有更深入的理解可以参见老罗的博客:http://blog.youkuaiyun.com/luoshengyang/article/details/7691321/
大神的讲解十分详尽!