修改开机LOGO

1. 准备工作

1. 首先在/usr/bin路径下查看,是否有pngtopnm、pnmquant、pnmtoplainpnm三个工具,如果没有则使用以下命令进行安装
2. apt-get install netpbm
3. 然后去/usr/bin路径下查看,如果有以上三个工具就表明安装成功了

2. 更换开机LOGO

2.1 制作logo_linux_clut224.ppm文件

1. pngtopnm linuxlogo.png > linuxlogo.pnm
2. pnmquant 224 linuxlogo.pnm > linuxlogo224.pnm
3. pnmtoplainpnm linuxlogo224.pnm > logo_linux_clut224.ppm

2.2 更换ppm文件

系统具体选用的是哪一张图作为LOGO,要分析logo.c中的fb_find_logo函数确定,Linux系统选择logo_linux_clut224(小企鹅)作为默认LOGO。

1. 删除drivers/video/logo/下的 logo_linux_clut224.c和 logo_linux_clut224.o文件
2. 将自己制作的logo_linux_clut224.ppm文件复制到drivers/video/logo/下

2.3 重新编译kernel

不需要重新配置kernel,直接编译kernel即可,最后烧录新的内核镜像

 

3. 添加新LOGO

3.1 新LOGO文件命名

在drivers/video/logo/Makefile中有这么一句:extra-y += $(call logo-cfiles,_clut224,ppm)
它的意思是在当前找到以"_clut224"结尾的ppm图片,然后根据它生成.c文件,所以添加新的图片名可以类似这样:logo_linux_sijifan_clut224.ppm

3.2 制作logo_linux_sijifan_clut224.ppm文件;

pngtopnm linuxlogo.png > linuxlogo.pnm
pnmquant 224 linuxlogo.pnm > linuxlogo224.pnm
pnmtoplainpnm linuxlogo224.pnm > logo_linux_sijifan_clut224.ppm

3.3 修改Kconfig,添加新LOGO的配置选项

config LOGO_LINUX_SIJIFAN_CLUT224
    bool "Standard 224-color Linux logo for sijifan"
    default y

3.4 修改drivers/video/logo/Makefile,添加新LOGO的编译选项

obj-$(CONFIG_LOGO_LINUX_SIJIFAN_CLUT224)  += logo_linux_sijifan_clut224.o

3.5 修改logo.c

//添加声明
extern const struct linux_logo logo_linux_sijifan_clut224;

//在"fb_find_logo()"中找到"#ifdef CONFIG_LOGO_LINUX_CLUT224",在其后加入:
#ifdef CONFIG_LOGO_LINUX_SIJIFAN_CLUT224
        logo = &logo_linux_sijifan_clut224;
#endif

3.6 重新配置并编译kernel

make menuconfig 使能新添加的配置项CONFIG_LOGO_LINUX_SIJIFAN_CLUT224,最后将新内核镜像烧录到机器中

 

4. LOGO居中显示

1、在 kernel-3.2/drivers/video/fbmem.c 文件中,找到"fb_show_logo_line"函数

image.dx = 0;
image.dy = y;
改为:
image.dx = (info->var.xres - logo->width) / 2;         //logo显示的起始坐标x值
image.dy = (info->var.yres - logo->height) / 2;         //info->var.xres和info->var.yres为屏幕分辨率大小,logo->width和logo->height为logo图片大小。

2、在 kernel-3.2/drivers/video/console/fbcon.c 文件中,找到“fbcon_prepare_logo”函数

logo_height = fb_prepare_logo(info, ops->rotate);
后面加上:
logo_height += (info->var.yres/2) - (logo_height/2);

5.如何将开机logo中的光标去除

在内核的当前目录进入到drivers/video/console/fbcon.c文件,将static void fb_flashcursor(void *private)制成空函数如下

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

    struct fb_info *info = private;
    struct fbcon_ops *ops = info->fbcon_par;
    struct display *p;
    struct vc_data *vc = NULL;
    int c;
    int mode;
     
    acquire_console_sem();
    if (ops && ops->currcon != -1)
    vc = vc_cons[ops->currcon].d;
   
    if (!vc || !CON_IS_VISIBLE(vc) ||
    registered_fb[con2fb_map[vc->vc_num]] != info ||
    vc->vc_deccm != 1) {
    release_console_sem();
    return;
    }
    
    p = &fb_display[vc->vc_num];
    c = scr_readw((u16 *) vc->vc_pos);
    mode = (!ops->cursor_flash || ops->cursor_state.enable) ?
    CM_ERASE : CM_DRAW;
    ops->cursor(vc, info, mode, softback_lines, get_color(vc, info, c, 1),
    get_color(vc, info, c, 0));
    release_console_sem();
    #endif
}

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

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

   struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
   struct fbcon_ops *ops = info->fbcon_par;
   int y;
   int c = scr_readw((u16 *) vc->vc_pos);
  
   if (fbcon_is_inactive(vc, info))
   return;
   
   ops->cursor_flash = (mode == CM_ERASE) ? 0 : 1;
   if (mode & CM_SOFTBACK) {
   mode &= ~CM_SOFTBACK;
   y = softback_lines;
   } else {
   if (softback_lines)
   fbcon_set_origin(vc);
   y = 0;
   }
    
   ops->cursor(vc, info, mode, y, get_color(vc, info, c, 1),
   get_color(vc, info, c, 0));
   vbl_cursor_cnt = CURSOR_DRAW_DELAY;
   #endif
}

6.其它

SOC有几个cpu核心在线就会显示几张logo;

PPM文件浏览软件:PMView。

7. 注意

LOGO图片的大小会直接影响kernel Image的大小,所以如果选用的logo图片过大,导致kernel镜像超过了分配给kernel的分区大小(比如8M),会引起镜像烧录失败或者系统重启。

 

附录:

1. logo相关代码的初始化显示过程

2. drivers/video/logo/logo.c部分源码

/* logo's are marked __initdata. Use __ref to tell
 * modpost that it is intended that this function uses data
 * marked __initdata.
 */
const struct linux_logo * __ref fb_find_logo(int depth)
{
	const struct linux_logo *logo = NULL;

#ifdef CONFIG_LOGO_LINUX_CLUT224
		/* Generic Linux logo */
		logo = &logo_linux_clut224;
#endif
/*****************sijifan logo*************************/
#ifdef CONFIG_LOGO_LINUX_SIJIFAN_CLUT224
        logo = &logo_linux_sijifan_clut224;
#endif
/******************************************/
#ifdef CONFIG_LOGO_DEC_CLUT224
		/* DEC Linux logo on MIPS/MIPS64 or ALPHA */
		logo = &logo_dec_clut224;

	return logo;
}
EXPORT_SYMBOL_GPL(fb_find_logo);

3. Android下查找LOGO配置项

首先自然是去kernel目录下查找是否有.config文件,如果有则vi打开,然后搜索LOGO即可得到LOGO相关的配置项;

其次,如果kernel目录下没有.config文件,可能是将输出目录重定位到了/out/target/product/项目名称/obj/kernel相关目录,在该目录下查找是否有.config文件

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值