嵌入式Linux kernel LOGO的更换方法

时间:2023-01-08 18:43:39
【从制作logo到LCD显示或者VGA显示logo】

编者:linux的开机默认logo是一只可爱的小企鹅。这里我们可以把它换成我们自己喜爱的图片,只要将linux-2.6.32.2/drivers/video/logo/linux_logo_clut224.ppm替换成自己的图片即可。方法很简单,照着操作基本就没问题。以下按照手册介绍两种方法。注意在进行图片的转换时候,一定要先注意图片的大小,要和使用的液晶屏的大小匹配。我这是320*240的。

 

1 使用命令行工具修改Linux LOGO

linux-2.6.32.2/drivers/video/logo/linux_logo_clut224.ppm文件是一个特殊格式的图像文件,有很多方法可以把普通的图片转换为logo 文件,最常用的就是netpbm 工具组。“netpbm”是一组命令行的工具,它可以转换很多格式的图片,在此以png 格式为例介绍一下如何把普通的PNG 文件转换为我们需要的Linux LOGO 图片:假定我们要转换的文件名为linux_logo.png,首先将png 图片转成pnm
# pngtopnm logo_linux.png >logo_linux.pnm
然后将pnm 图片的颜色数限制在224
# pnmquant 224 logo_linux.pnm > logo_linux_clut224.pnm
最后将pnm 图片转换成我们需要的ppm
# pnmtoplainpnm 
logo_linux_clut224.pnm > logo_linux_clut224.ppm

然linux_logo_clut224.ppm 替换linux-2.6.32.2/drivers/video/logo 中对应的图像就可以
了。

2 使用图形化的LogoMaker 制作Linux LOGO

友善公司设计了一个图形界面的制作工具LogoMaker,它基于Fedora 9 平台开发,其实它的底层调用的就是上述命令行工具,如果你运行的结果出现浮点数错误,那可能你使用的平台并非Federa9,如果在Fedora9 下运行出现如图错误,你可能没有正确安装netpbm 工具。

下面是Linux LogoMaker 的使用步骤(摘自mini2440 用户手册),请先按照用户手册第五章节安装好logomaker 工具程序,在任意命令行输入logomaker,就可以启动它,打开时它会显示一幅缺省的花朵图片。

点File->Open a picture file…或者使用快捷键Ctrl+O 可以打开一个图片文件,在跳出的文件打开窗口中选择一个图片,这时点File->Convert the picture to a Linux Logo File,或者使用快捷键Crtl+C 会跳出文件保存目录窗口,不需要输入任何东西,选择要保存的目录即可,文件名将会自动保存为logo_linux_clut224.ppm,使用这个文件代替linux-2.6.32.2/drivers/video/logo 目录下的同名文件即可。


2、配置logo选项
 在内核路径下执行make menuconfig

开发板上开启logo显示的选项

Device Drivers --->Character devices ---》Bootup logo


 a、选择虚拟控制台为控制台显示驱动做准备
   Device Drivers --->Character devices ---> Virtual terminal
   [*]   Support for console on virtual terminal
 b、选择虚拟控制台显示驱动
   Device Drivers --->Graphics support --->下有这个选项Console display driver support --->
   根据你的硬件选择由Framebuffer还是VGA
      [*] Framebuffer Console support或者
      [*] VGA text console
 c、Device Drivers --->Graphics support --->
   <*> Support for frame buffer devices  
     <*> MXC Framebuffer support下选择是VGA还是TVOUT
            [*] tvout CH7024 on MX27 //TVOUT
            [*]support VGA daughter //VGA
  当然以上的配置选项,因平台而异会有些小的差别。
  做好以上两个步骤,你就可以重新编译内核,将其烧到开发板,接VGA或者TVOUT显示。
  这样你可以看到你自己制作的logo,你可以发现在logo的左上角有一个闪动的光标,接下来我们说说如何将这个光标去除。

3、如何将开机logo中的光标去除
 在内核的当前目录进入到drivers/video/console/fbcon.c文件
 将static void fb_flashcursor(void *private)制成空函数如下

    386 static void fb_flashcursor(void *private)
    387 {
    388 #if 0 //modify by yejj for clear cursor of lcdc

    389 struct fb_info *info = private;
    390 struct fbcon_ops *ops = info->fbcon_par;
    391 struct display *p;
    392 struct vc_data *vc = NULL;
    393 int c;
    394 int mode;
    395 
    396 acquire_console_sem();
    397 if (ops && ops->currcon != -1)
    398 vc = vc_cons[ops->currcon].d;
    399 
    400 if (!vc || !CON_IS_VISIBLE(vc) ||
    401 registered_fb[con2fb_map[vc->vc_num]] != info ||
    402 vc->vc_deccm != 1) {
    403 release_console_sem();
    404 return;
    405 }
    406 
    407 p = &fb_display[vc->vc_num];
    408 c = scr_readw((u16 *) vc->vc_pos);
    409 mode = (!ops->cursor_flash || ops->cursor_state.enable) ?
    410 CM_ERASE : CM_DRAW;
    411 ops->cursor(vc, info, mode, softback_lines, get_color(vc, info, c, 1),
    412 get_color(vc, info, c, 0));
    413 release_console_sem();
    414 #endif
    415 }

同样的方法将函数static void fbcon_cursor(struct vc_data *vc, int mode)用空函数替换如下

   1304 static void fbcon_cursor(struct vc_data *vc, int mode)
   1305 { 
   1306 #if 0 //modify by yejj for clear cursor of lcdc

   1307 struct fb_info *info

 

另一种禁止光标的方法:

drivers/video/console/Makefile

#obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon.o bitblit.o font.o softcursor.o
obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon.o bitblit.o font.o

编译遇到一个soft_cursor没有定义的问题问题,注释代码:
drivers/video/console/bitblit.c
//ABING
//      if (err)
//              soft_cursor(info, &cursor);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

在ARM LINUX系统启动时,启动信息默认在串口终端上打印显示。但有没有方法能够让启动信息显示在LCD上呢,像PC的启动一样。答案是肯定的。 

1.bootloader里修改启动参数 char *Linux_params ="noinitrd root=/dev/mtdblock2 init=/Linuxrc console=tty0,ttySAC0,115200 mem=64M devfs=mount"; 

noinitrd no init ramdisk support

mtdblock2 nand flash的第三个分区作为rootfs 

console=tty0,ttySAC0,115200 系统启动信息的前半部分(bootloader+kernel前部分)显示在ttySAC0(串口终端),115200表示波特率,kernel的后半部分启动信息加载到tty0(LCD终端) 

64M 64M内存 

2.配置内核make menuconfig时,修改boot option为 noinaitrd root=/dev/mtdblock2 init=/Linuxrc console=tty0,ttySAC0,115200 mem=64M devfs=mount 

3.UBOOT作为bootloader时,修改UBOOT环境变量bootargs setenv bootargs 'noinitrd root=/dev/mtdblock2 init=/Linuxrc console=tty0,ttySAC0,115200' saveenv(保存变量) 
对于s5pv210 superboot修改SD卡目录中的FriendlyARM.ini文件
################### myarm####################
Linux-BootLoader = Superboot210.bin
Linux-Kernel = Linux/zImage_ myarm
Linux-CommandLine = root=/dev/mtdblock4 rootfstype=yaffs2 console=tty1,ttySAC0,115200 init=/linuxrc
Linux-RootFs-InstallImage = Linux/ myarm .img