一、导读
使用嵌入式linux作为设备的操作系统,当设备上电启动后,希望显示开机logo。一般会经历以下几个阶段:
(1)运行芯片内部引导程序。
(2)运行引导加载程序(u-boot较为常用)。
(3)运行linux内核。
(4)运行用户根文件系统,在这个阶段,就会根据项目特征运行具体的程序或者服务,最后则会进入一个人机交互软件终端。
本文以u-boot作为引导加载程序,在运行时候,可以设置u-boot的启动logo,本文主要描述这个话题。
二、获取u-boot源码
u-boot是一款在嵌入式领域常使用的引导加载程序。一般情况下,我们不会使用u-boot官方维护的源码,而是使用芯片原厂或者硬件板卡提供商提供的u-boot源码,因为官方维护的u-boot源码的使用对象是芯片原厂,他们会根据自己的芯片特征做第一手的u-boot源码移植,以支持自家芯片,然后发布给硬件板卡提供商或者第三方的合作伙伴。最后交到软件开发人员手里的就是已经可以直接编译使用的u-boot源码了。
本文主要描述u-boot源码中对开机logo的常规(有些芯片原厂可能会有所修改)支持。
三、修改u-boot源码
3-1 准备开机logo
根据自己设备显示屏幕的大小制作一张文件格式为bmp的图片,此处笔者使用PS软件制作了一张开机logo:
(就显示了几个字,哈哈)
将其导出为bmp格式的文件后,然后将导出文件复制到u-boot源码下的tools/logos目录路径下,并命名为mylogo.bmp(可以随便命名)。
3-2 修改makefile
在u-boot源码下的tools目录中的makefile文件中,找到以下内容:
#GeneratedLCD/videologo LOGO_H=$(objtree)/include/bmp_logo.h LOGO_DATA_H=$(objtree)/include/bmp_logo_data.h LOGO-$(CONFIG_LCD_LOGO)+=$(LOGO_H) LOGO-$(CONFIG_LCD_LOGO)+=$(LOGO_DATA_H) LOGO-$(CONFIG_VIDEO_LOGO)+=$(LOGO_H) LOGO-$(CONFIG_VIDEO_LOGO)+=$(LOGO_DATA_H) #Genericlogo ifeq($(LOGO_BMP),) LOGO_BMP=$(srctree)/$(src)/logos/denx.bmp #Useboardlogoandfallbacktovendor ifneq($(wildcard$(srctree)/$(src)/logos/$(BOARD).bmp),) LOGO_BMP=$(srctree)/$(src)/logos/$(BOARD).bmp else ifneq($(wildcard$(srctree)/$(src)/logos/$(VENDOR).bmp),) LOGO_BMP=$(srctree)/$(src)/logos/$(VENDOR).bmp endif endif endif#!LOGO_BMP
将其修改为:
#GeneratedLCD/videologo LOGO_H=$(objtree)/include/bmp_logo.h LOGO_DATA_H=$(objtree)/include/bmp_logo_data.h LOGO-$(CONFIG_LCD_LOGO)+=$(LOGO_H) LOGO-$(CONFIG_LCD_LOGO)+=$(LOGO_DATA_H) LOGO-$(CONFIG_VIDEO_LOGO)+=$(LOGO_H) LOGO-$(CONFIG_VIDEO_LOGO)+=$(LOGO_DATA_H) #Genericlogo ifeq($(LOGO_BMP),) LOGO_BMP=$(srctree)/$(src)/logos/mylogo.bmp#修改为自己的开机logo图片 #Useboardlogoandfallbacktovendor ifneq($(wildcard$(srctree)/$(src)/logos/$(BOARD).bmp),) LOGO_BMP=$(srctree)/$(src)/logos/$(BOARD).bmp else ifneq($(wildcard$(srctree)/$(src)/logos/$(VENDOR).bmp),) #LOGO_BMP=$(srctree)/$(src)/logos/$(VENDOR).bmp LOGO_BMP=$(srctree)/$(src)/logos/mylogo.bmp#修改为自己的开机logo图片 endif endif endif#!LOGO_BMP
在上述修改中,为了防止编译中参数控制对logo编译的影响,故做了两处修改。
3-4 添加宏定义
然后在具体对应板卡的描述头文件中添加两个宏定义:
#defineCONFIG_VIDEO_LOGO #defineCONFIG_VIDEO_BMP_LOGO
由于小生使用的是imx6ull的处理器平台,所以在include/mx6ullevk.h文件中添加(此处需要根据具体情况而定)
3-5 logo居中显示
修改drivers/video/cfb_console.c文件中的static void *video_logo(void)函数,具体修改如下:
staticvoid*video_logo(void) { ... splash_get_pos(&video_logo_xpos,&video_logo_ypos); /*增加代码,设置图片居中显示*/ if(video_logo_xpos&&video_logo_ypos) { video_logo_xpos=(VIDEO_VISIBLE_COLS-BMP_LOGO_WIDTH)>>1; video_logo_ypos=(VIDEO_VISIBLE_ROWS-BMP_LOGO_HEIGHT)>>1; } #ifdefCONFIG_SPLASH_SCREEN
3-6 隐藏版本信息
同样修改drivers/video/cfb_console.c文件中的static void *video_logo(void)函数,注释掉该函数中的一些内容,具体修改如下:
if(board_cfb_skip()) return0; /*注释开始*/ //sprintf(info,"%s",version_string); //space=(VIDEO_COLS-VIDEO_INFO_X)/VIDEO_FONT_WIDTH; //len=strlen(info); //if(len>space){ //intxx=VIDEO_INFO_X,yy=VIDEO_INFO_Y; //uchar*p=(uchar*)info; //while(len){ //if(len>space){ //video_drawchars(xx,yy,p,space); //len-=space; //p=(uchar*)p+space; //if(!y_off){ //xx+=VIDEO_FONT_WIDTH; //space--; //} //yy+=VIDEO_FONT_HEIGHT; //y_off++; //}else{ //video_drawchars(xx,yy,p,len); //len=0; //} //} //}else //video_drawstring(VIDEO_INFO_X,VIDEO_INFO_Y,(uchar*)info); /*注释结束*/ #ifdefCONFIG_CONSOLE_EXTRA_INFO
通过以上步骤,就将u-boot源码修改好了,可以进行交叉编译构建了,然后运行修改好的u-boot即可。
四、开机logo编译构建本质
在u-boot编译构建过程中,实则会编译出一个名为bmp_logo的宿主机上运行的工具:
该工具会将我们的bmp格式的开机logo图片转换成include/bmp_logo.h、include/bmp_logo_data.h。在include/bmp_logo.h文件中,声明了两个图片数据数组:
在include/bmp_logo_data.h文件中,则定义了这两个数组(数据会根据具体的图片生成很多数据)。bmp_logo_palette数组:
bmp_logo_bitmap数组:
在实际使用中,可以查看是否生成了bmp_logo工具和include/bmp_logo.h文件,来判断u-boot的开机logo部分是否被编译进u-boot镜像中。
审核编辑:刘清
-
嵌入式
+关注
关注
4963文章
18160浏览量
286541 -
Linux系统
+关注
关注
4文章
559浏览量
26844 -
u-boot
+关注
关注
0文章
116浏览量
38029
原文标题:嵌入式linux | 修改u-boot启动logo
文章出处:【微信号:嵌入式小生,微信公众号:嵌入式小生】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论