修改开机LOGO
Posted 四季帆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了修改开机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文件
以上是关于修改开机LOGO的主要内容,如果未能解决你的问题,请参考以下文章
Android源码发开记录-修改开机logo启动页、开机动画