修改嵌入式linux启动画面(二)

2019-07-12 15:21发布

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