修改嵌入式linux啓動畫面(二)

  總的說來,上一篇對於修改linux系統啓動畫面已經非常足夠了。這篇就說一下如何添加一個新的啓動界面配置選項,可以做到不改變原有系統,增加新的配置選項的功能。
 
  1. 在make menuconfig命令菜單中添加自己的logo選項菜單。
 運行make menuconfig,配置工具首先分析與體系結構對應/arch/xxx/Kconfig文件,/arch/xxx/Kconfig文件中除本身包含一些與體系結構相關的配置項和配置菜單以外,還通過source語句引入了一系列Kconfig文件,而這些Kconfig有可能再次通過source引入下一層的Kconfig,即可描繪出menuconfig界面。
 打開kernel_dir/driver/video/logo/Kconfig文件。
 添加如下內容:
 config LOGO_MINE_CLUT224
      bool "My 224-color Linux logo"
      default y
 上面意思爲:添加先選項LOGO_MINE_CLUT224,並且此選項爲bool型,默認爲選中狀態。
  2. 運行make menuconfig命令
 按如下路徑找到配置選項:
   -> Device Drivers      
  -> Graphics support
    -> Bootup logo
 將系統默認選中的 Standard 224-color Linux log 選項去除。
 選中新配置的選項 My 224-color Linux logo 選中。
 
 下面的問題是:配置選項雖然是選中了,但是如何添加一張我們自己定製的圖片呢?
  3. 增加自己定製的ppm格式圖片。
    關於製作此類ppm格式圖片文件的方式方法,(一)文中已作了詳細的介紹,此處不再贅述。
 假設這裏有一張已經制作完畢的logo_mine_clut224.ppm的圖片文件。通過修改Makefile將其make menuconfig的配置結果相聯繫。
 在Makefile添加如下:
   obj-$(CONFIG_LOGO_MINE_CLUT224) += logo_mine_clut224.o
 由Makefile如下語句可知:
   $(obj)/%_clut224.c: $(src)/%_clut224.ppm FORCE
   $(call if_changed,logo)
 生成logo_mine_clut224.o所需的.c文件是由系統自動生成的。
 如需查看編譯生成的logo_mine_clut224.c, 執行make,文件內容大概如下:
   static unsigned char logo_mine_clut224_data[] __initdata = {...};
   static unsigned char logo_mine_clut224_clut[] __initdata = {...};
   struct linux_logo logo_mine_clut224 __initdata = {
  .type   = LINUX_LOGO_CLUT224,
  .width  = 320,
  .height = 240,
  .clutsize   = 218,
  .clut   = logo_mine_clut224_clut,
  .data   = logo_mine_clut224_data
   };
 這裏面生成了一個struct linux_logo結構體: logo圖片的類型,長與寬的大小,還有就是由logo_mine_clut224_clut.ppm所生成的圖片數據的兩個數組,關於此兩數組我也沒有進行深入研究。
 
 從上面可以看到雖然我們所希望得到的圖片數據結構體已經有了,但是這裏我們新添加的結構體,我們需要找到合適的地方對其進行調用。
  4. 在kernel代碼中調用我們新生成的結構體。
    我們提供圖片所獲得的圖片數據結構體應該在何處進行調用呢?可以看一下如來系統的實現調用,簡單的search一下logo_linux_clut224,便可以找到系統原來的圖片數據結構體的調用位置:kernel_dir/drive/video/logo/logo.c中的const struct linux_logo *fb_find_logo(int depth)函數。kernel中便是通過調用這個函數找到最終顯示的logo啓動界面數據的。
 在logo.c文件中添加如下代碼:
   extern const struct linux_logo logo_linux_mono;
   extern const struct linux_logo logo_linux_vga16;
   extern const struct linux_logo logo_linux_clut224;
   extern const struct linux_logo logo_dec_clut224;
   extern const struct linux_logo logo_mac_clut224;
   extern const struct linux_logo logo_parisc_clut224;
   extern const struct linux_logo logo_sgi_clut224;
   extern const struct linux_logo logo_sun_clut224;
   extern const struct linux_logo logo_superh_mono;
   extern const struct linux_logo logo_superh_vga16;
   extern const struct linux_logo logo_superh_clut224;
   extern const struct linux_logo logo_m32r_clut224;
   extern const struct linux_logo logo_mine_clut224;
 

   if (depth >= 8) {
   #ifdef CONFIG_LOGO_LINUX_CLUT224
      /* Generic Linux logo */
      logo = &logo_linux_clut224;
   #endif
   #ifdef CONFIG_LOGO_MINE_CLUT224
      /* Generic Linux logo */
      logo = &logo_mine_clut224;
   #endif
 現在一切完成。
  
 最終執行make進行編譯測試一下。我這邊是一邊寫博客一邊進行我的實驗,最終的實驗結果是ok的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章