函數fb_find_logo實如今文件kernel/goldfish/drivers/video/logo/logo.c文件中,以下所示:linux
- 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_blackfin_vga16;
- extern const struct linux_logo logo_blackfin_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;
-
- static int nologo;
- module_param(nologo, bool, 0);
- MODULE_PARM_DESC(nologo, "Disables startup logo");
-
-
-
-
-
- const struct linux_logo * __init_refok fb_find_logo(int depth)
- {
- const struct linux_logo *logo = NULL;
-
- if (nologo)
- return NULL;
-
- if (depth >= 1) {
- #ifdef CONFIG_LOGO_LINUX_MONO
-
- logo = &logo_linux_mono;
- #endif
- #ifdef CONFIG_LOGO_SUPERH_MONO
-
- logo = &logo_superh_mono;
- #endif
- }
-
- if (depth >= 4) {
- #ifdef CONFIG_LOGO_LINUX_VGA16
-
- logo = &logo_linux_vga16;
- #endif
- #ifdef CONFIG_LOGO_BLACKFIN_VGA16
-
- logo = &logo_blackfin_vga16;
- #endif
- #ifdef CONFIG_LOGO_SUPERH_VGA16
-
- logo = &logo_superh_vga16;
- #endif
- }
-
- if (depth >= 8) {
- #ifdef CONFIG_LOGO_LINUX_CLUT224
-
- logo = &logo_linux_clut224;
- #endif
- #ifdef CONFIG_LOGO_BLACKFIN_CLUT224
-
- logo = &logo_blackfin_clut224;
- #endif
- #ifdef CONFIG_LOGO_DEC_CLUT224
-
- logo = &logo_dec_clut224;
- #endif
- #ifdef CONFIG_LOGO_MAC_CLUT224
-
- if (MACH_IS_MAC)
- logo = &logo_mac_clut224;
- #endif
- #ifdef CONFIG_LOGO_PARISC_CLUT224
-
- logo = &logo_parisc_clut224;
- #endif
- #ifdef CONFIG_LOGO_SGI_CLUT224
-
- logo = &logo_sgi_clut224;
- #endif
- #ifdef CONFIG_LOGO_SUN_CLUT224
-
- logo = &logo_sun_clut224;
- #endif
- #ifdef CONFIG_LOGO_SUPERH_CLUT224
-
- logo = &logo_superh_clut224;
- #endif
- #ifdef CONFIG_LOGO_M32R_CLUT224
-
- logo = &logo_m32r_clut224;
- #endif
- }
- return logo;
- }
- EXPORT_SYMBOL_GPL(fb_find_logo);
文件開始聲明的一系列linux_logo結構體變量分別用來保存kernel/goldfish/drivers/video/logo目錄下的一系列ppm或者pbm文件的內容的。這些ppm或者pbm文件都是用來描述第一個開機畫面的。
全局變量nologo是一個類型爲布爾變量的模塊參數,它的默認值等於0,表示要顯示第一個開機畫面。在這種狀況下,函數fb_find_logo就會根據參數depth的值以及不一樣的編譯選項來選擇第一個開機畫面的內容,而且保存在變量logo中返回給調用者。
這一步執行完成以後,第一個開機畫面的內容就保存在模塊fbmem的全局變量fb_logo的成員變量logo中了。這時候控制檯的初始化過程也結束了,接下來系統就會執行切換控制檯的操做。前面提到,當系統執行切換控制檯的操做的時候,模塊fbcon中的函數fbcon_switch就會被調用。在調用的過程當中,就會執行顯示第一個開機畫面的操做。
- static int fbcon_switch(struct vc_data *vc)
- {
- struct fb_info *info, *old_info = NULL;
- struct fbcon_ops *ops;
- struct display *p = &fb_display[vc->vc_num];
- struct fb_var_screeninfo var;
- int i, prev_console, charcnt = 256;
-
- ......
-
- if (logo_shown == FBCON_LOGO_DRAW) {
- logo_shown = fg_console;
-
- fb_show_logo(info, ops->rotate);
- ......
- return 0;
- }
- return 1;
- }
因爲前面在準備第一個開機畫面的內容的時候,全局變量logo_show的值被設置爲FBCON_LOGO_DRAW,所以,接下來就會調用函數fb_show_logo來顯示第一個開機畫面。在顯示以前,這個函數會將全局變量logo_shown的值設置爲fg_console,後者表示系統當前可見的控制檯的編號。
函數fb_show_logo實如今文件kernel/goldfish/drivers/video/fbmem.c中,以下所示:
-
int fb_show_logo(struct fb_info *info, int rotate)
-
{
-
int y;
-
-
y = fb_show_logo_line(info, rotate, fb_logo.logo, 0,
-
num_online_cpus());
-
......
-
-
return y;
-
}
這個函數調用另一個函數fb_show_logo_line來進一步執行渲染第一個開機畫面的操做。