总的说来,上一篇对于修改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的。