總的說來,上一篇對於修改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的。