一、導(dǎo)讀
使用嵌入式linux作為設(shè)備的操作系統(tǒng),當(dāng)設(shè)備上電啟動(dòng)后,希望顯示開機(jī)logo。一般會(huì)經(jīng)歷以下幾個(gè)階段:
(1)運(yùn)行芯片內(nèi)部引導(dǎo)程序。
(2)運(yùn)行引導(dǎo)加載程序(u-boot較為常用)。
(3)運(yùn)行l(wèi)inux內(nèi)核。
(4)運(yùn)行用戶根文件系統(tǒng),在這個(gè)階段,就會(huì)根據(jù)項(xiàng)目特征運(yùn)行具體的程序或者服務(wù),最后則會(huì)進(jìn)入一個(gè)人機(jī)交互軟件終端。
本文以u-boot作為引導(dǎo)加載程序,在運(yùn)行時(shí)候,可以設(shè)置u-boot的啟動(dòng)logo,本文主要描述這個(gè)話題。
二、獲取u-boot源碼
u-boot是一款在嵌入式領(lǐng)域常使用的引導(dǎo)加載程序。一般情況下,我們不會(huì)使用u-boot官方維護(hù)的源碼,而是使用芯片原廠或者硬件板卡提供商提供的u-boot源碼,因?yàn)楣俜骄S護(hù)的u-boot源碼的使用對象是芯片原廠,他們會(huì)根據(jù)自己的芯片特征做第一手的u-boot源碼移植,以支持自家芯片,然后發(fā)布給硬件板卡提供商或者第三方的合作伙伴。最后交到軟件開發(fā)人員手里的就是已經(jīng)可以直接編譯使用的u-boot源碼了。
本文主要描述u-boot源碼中對開機(jī)logo的常規(guī)(有些芯片原廠可能會(huì)有所修改)支持。
三、修改u-boot源碼
3-1 準(zhǔn)備開機(jī)logo
根據(jù)自己設(shè)備顯示屏幕的大小制作一張文件格式為bmp的圖片,此處筆者使用PS軟件制作了一張開機(jī)logo:
(就顯示了幾個(gè)字,哈哈)
將其導(dǎo)出為bmp格式的文件后,然后將導(dǎo)出文件復(fù)制到u-boot源碼下的tools/logos目錄路徑下,并命名為mylogo.bmp(可以隨便命名)。
3-2 修改makefile
在u-boot源碼下的tools目錄中的makefile文件中,找到以下內(nèi)容:
#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#修改為自己的開機(jī)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#修改為自己的開機(jī)logo圖片 endif endif endif#!LOGO_BMP
在上述修改中,為了防止編譯中參數(shù)控制對logo編譯的影響,故做了兩處修改。
3-4 添加宏定義
然后在具體對應(yīng)板卡的描述頭文件中添加兩個(gè)宏定義:
#defineCONFIG_VIDEO_LOGO #defineCONFIG_VIDEO_BMP_LOGO
由于小生使用的是imx6ull的處理器平臺(tái),所以在include/mx6ullevk.h文件中添加(此處需要根據(jù)具體情況而定)
3-5 logo居中顯示
修改drivers/video/cfb_console.c文件中的static void *video_logo(void)函數(shù),具體修改如下:
staticvoid*video_logo(void) { ... splash_get_pos(&video_logo_xpos,&video_logo_ypos); /*增加代碼,設(shè)置圖片居中顯示*/ 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)函數(shù),注釋掉該函數(shù)中的一些內(nèi)容,具體修改如下:
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); /*注釋結(jié)束*/ #ifdefCONFIG_CONSOLE_EXTRA_INFO
通過以上步驟,就將u-boot源碼修改好了,可以進(jìn)行交叉編譯構(gòu)建了,然后運(yùn)行修改好的u-boot即可。
四、開機(jī)logo編譯構(gòu)建本質(zhì)
在u-boot編譯構(gòu)建過程中,實(shí)則會(huì)編譯出一個(gè)名為bmp_logo的宿主機(jī)上運(yùn)行的工具:
該工具會(huì)將我們的bmp格式的開機(jī)logo圖片轉(zhuǎn)換成include/bmp_logo.h、include/bmp_logo_data.h。在include/bmp_logo.h文件中,聲明了兩個(gè)圖片數(shù)據(jù)數(shù)組:
在include/bmp_logo_data.h文件中,則定義了這兩個(gè)數(shù)組(數(shù)據(jù)會(huì)根據(jù)具體的圖片生成很多數(shù)據(jù))。bmp_logo_palette數(shù)組:
bmp_logo_bitmap數(shù)組:
在實(shí)際使用中,可以查看是否生成了bmp_logo工具和include/bmp_logo.h文件,來判斷u-boot的開機(jī)logo部分是否被編譯進(jìn)u-boot鏡像中。
審核編輯:劉清
-
嵌入式
+關(guān)注
關(guān)注
5059文章
18975瀏覽量
302072 -
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
590瀏覽量
27318 -
u-boot
+關(guān)注
關(guān)注
0文章
120瀏覽量
38184
原文標(biāo)題:嵌入式linux | 修改u-boot啟動(dòng)logo
文章出處:【微信號(hào):嵌入式小生,微信公眾號(hào):嵌入式小生】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論