LINUX 启动logo 总结
近在imx6上需要调试linux下启动logo。其实linux启动logo 以前没少调,但这次弄了好久,也发现以前调过的没有积累。
之所以这次logo弄了很久是因为fsl bsp 实现keep uboot logo to kernel ,但又在我使用的BSP上没有完全弄好。话说那个还是
有很牛逼,简单来说就是uboot实现好logo,然后kernel 中不需要对相应的显示时钟进行重新初始化,还有很多其他的类似一样
的道理,就是相信uboot中已经弄好了。废话到此。说说一般的linux 启动logo。
一,企鹅法(224级,或者224色)
企鹅图片的文件名logo_linux_clut224.ppm,在driver/video/logo目录下。采用netpbm 工具生成想要替换的logo,这里要注
意一下图片的尺寸大小 。
例如将PNG格式的图片转换成logo_linux_clut224.ppm:
# pngtopnm my.png > my.pnm
# pnmquant 224 my.pnm > logo224.pnm
# pnmtoplainpnm logo224.pnm > logo_linux_clut224.ppm
Note: 可能会出现如下错误提示
drivers/video/logo/logo_linux_clut224.ppm: Binary PNM is not supported
Use pnmnoraw(1) to convert it to ASCII PNM
这个可能是因为你的ppm 图片是bin格式,需要转换成ascii 格式。方法如下:
pnmnoraw logo_linux_clut224.ppm > logo_linux_clut224_ascii.ppm
替换目录中的文件重新编译就OK了。当然这时候你会发现显示位置需要调整。默认是左上角对齐。产品中可能更多是中心对齐。
中心对齐的方法。
1,修改drivers/video/fbmem.c fb_show_logo_line函数中,修改如下
//image.dx = 0; //左上角 x起点
//image.dy = y; //调用时指定的参数 y起点
image.dx = (info->var.xres / 2) - (image.width / 2); //中心
image.dy = (info->var.yres / 2) - (image.height / 2); //中心
image.width = logo->width;
image.height = logo->height;
Note:info->var.xres和info->var.yres是分辨率大小,image.width,image.height是logo图片的大小。
起点位置的修改
2,修改drivers/video/console/fbcon.c fbcon_prepare_logo函数里,修改如下
logo_height = fb_prepare_logo(info, ops->rotate);
logo_height += (info->var.yres / 2) - (logo_height / 2);
结束位置的修改
这里需要补充一点,就是关于boot logo 的配置与光标 cursor的问题(第二种方法里面说吧)。
Device Drivers ---> Graphics support --->
[*]Boot logo --->
[*] Standard 224-color Linux logo
支持 kernel console,不选看不到 logo:
Device Drivers ---> Graphics support --->
Console display driver support --->
<*> Framebuffer Console support
二,真彩色TFT LINUX LOGO (使用此方法比较简单,更能满足客户的需求)
显示图片可以是rgb565 ,不局限于原来的224色 ,方法相当于直接将要显示的图片输出到Framebuffer。记录一下方法吧。
1, 生成狸猫----增加三个文件。
true_lanrry_logo.h //LCD显示信息,深度及声明
lanrry_logo_data.h //定义的图片的数据,我采用ImageLCD工具取模
framebuffer_logo.c //实现打印数据到framebuffer
均放在drivers/video目录下,并且修改Makefile ,添加framebuffer_logo.c。
2,狸猫换太子----修改drivers/video/fbmem.c里的代码
a,添加 #define TRUE_COLOR
b,修改如下:
+#ifdef TRUE_COLOR
+#include "truecolor_logo.h"
+#endif
c,修改函数int fb_show_logo(struct fb_info *info, int rotate)
{
//狸猫换太子
+#ifdef TRUE_COLOR
+fb_show_truecolor_logo(info);
+return 1;
#else
int y;
y = fb_show_logo_line(info, rotate, fb_logo.logo, 0,
num_online_cpus());
num_online_cpus cpu 数量,linux logo 企鹅数量。
d,修改fb_prepare_logo函数以改变高度,该函数的后return处改为
#ifdef TRUE_COLOR
return fb_prepare_extra_logos(info, YRES, YRES);
#else
return fb_prepare_extra_logos(info, fb_logo.logo->height, yres);
#endif
重新编译完之后,就能全部显示
这种方法是采用替换boot logo 。全屏显示的时候,也是会发现有光标问题。解决方法如下:
修改drivers/video/console/bitblit.c文件的bit_cursor函数,在该函数结尾处的 。
if (err)
soft_cursor(info, &cursor);
改为
if (0)
soft_cursor(info, &cursor);