一、導讀
使用嵌入式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鏡像中。
審核編輯:劉清
-
嵌入式
+關注
關注
5082文章
19104瀏覽量
304817 -
Linux系統
+關注
關注
4文章
593瀏覽量
27392 -
u-boot
+關注
關注
0文章
121瀏覽量
38222
原文標題:嵌入式linux | 修改u-boot啟動logo
文章出處:【微信號:嵌入式小生,微信公眾號:嵌入式小生】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論