自定義u-boot啟動logo的方法

kunkliu發表於2020-04-05

轉載地址:https://blog.csdn.net/yin_pengpeng/article/details/49178659

如果在uboot中實現了LCD等顯示裝置的驅動,uboot在啟動的時候會在螢幕的左上角顯示一個logo,如下圖:

 

       這個logo預設情況(只定義了CONFIG_VIDEO_LOGO是如上圖所示的企鵝(如果還定義了CONFIG_VIDEO_BMP_LOGO會是denx的標誌),這個是存在於uboot程式碼中的一個標頭檔案(include/video_logo.h或 bmp_logo.h),如果大家看了這個標頭檔案,發現這個是一個巨大的結構體,其中儲存著圖片每個畫素點的色彩資料。

       這樣如果要更換這個預設的logo豈不是自己要生成這樣一個資料結構體才行?答案是肯定的。

       但是這樣一個結構體要怎麼生成呢?這個uboot原始碼早就為我們想好了,方法其實很簡單:

 

一、準備一張jpeg圖片,通過命令列處理為8bit  BMP圖片。

       處理指令碼如下:

 

  1. #!/bin/sh
  2. #install Netpbm first
  3. jpegtopnm $1 | ppmquant 31 | ppmtobmp -bpp 8 > $2

     使用方法: (指令碼名)  ( 待處理的JPG圖片名)  (輸出檔名)

 

     之所以用jpeg轉bmp的辦法,是通過實驗證明這種方面可行且簡便。

     圖片的大小不一定要和原來一樣,你覺得合適就好。

 

二、將bmp檔案放入/tools/logos中,並修改/tools/下的Makefile

 

 

  1. # Generated LCD/video logo
  2. LOGO_H = $(OBJTREE)/include/bmp_logo.h
  3. LOGO-$(CONFIG_LCD_LOGO) += $(LOGO_H)
  4. LOGO-$(CONFIG_VIDEO_LOGO) += $(LOGO_H)
  5.  
  6. ifeq ($(LOGO_BMP),)
  7. LOGO_BMP= logos/denx.bmp
  8. endif
  9. ifeq ($(VENDOR),atmel)
  10. LOGO_BMP= logos/atmel.bmp
  11. endif
  12. ifeq ($(VENDOR),esd)
  13. LOGO_BMP= logos/esd.bmp
  14. endif
  15. ifeq ($(VENDOR),freescale)
  16. LOGO_BMP= logos/freescale.bmp
  17. endif
  18. ifeq ($(VENDOR),ronetix)
  19. LOGO_BMP= logos/ronetix.bmp
  20. endif
  21. ifeq ($(VENDOR),syteco)
  22. LOGO_BMP= logos/syteco.bmp
  23. endif

紅色字型,替換為你製作的bmp檔名。

 

三、確認配置檔案

    一定要定義

  1. #define CONFIG_VIDEO_LOGO
  2. #define CONFIG_VIDEO_BMP_LOGO

     編譯的時候,你的bmp檔案會被tools/bmp_logo.c編譯出的工具bmp_logo

製作成include/bmp_logo.h,並編譯進uboot中。

 

 

四、重新編譯u-boot即可得到顯示新logo的u-boot。

 

效果如下圖所示:

由於是8bit色深,顏色就有點怪~

 

如果你看了drivers/video/cfb_console.c原始碼,你可能會發現還有一個splashimage的東東可以顯示。是的,如果你有張非壓縮的BMP圖片放在了Nor Flash,你可以在ENV中設定splashimage和splashpos告訴uboot讀取和顯示的位置。啟動的時候,uboot就會顯示這個bmp圖片。

但是,原生的uboot是隻支援Nor Flash和核心的讀取的,如果你的圖片放在nand flash、SD卡或者SPI、I2C 介面flash中,你可以自己實現將圖片檔案讀取到記憶體中,然後再顯示splash。實現起來並不複雜,關鍵是使用相關的API函式來讀取資料。

相關文章