更换内核logo

apt-get install netpbm
拷贝png图片到内核目录的drivers/video/logo目录下
pngtopnm wml.png > wml.pnm
pnmquant 224 wml.pnm > logo224.pnm
pnmtoplainpnm logo224.pnm > logo_linux_clut224.ppm
chmod 777 logo_linux_clut224.ppm
rm logo_linux_clut224.c logo_linux_clut224.o //这俩文件是编译内核的时候根据图片生成的
重新编译内核即可

调用关系梳理
fbcon.c
static const struct consw fb_con = {
.con_init = fbcon_init,
.con_switch = fbcon_switch,
}

fbcon.c
fbcon_init(struct vc_data *vc, int init)//fbcon.c
fbcon_prepare_logo(vc, info, cols, rows, new_cols, new_rows); //fbcon.c

fbcon.c
fbcon_switch(struct vc_data *vc) // fbcon.c
fb_show_logo(info, ops->rotate); // fbcon.c

#define update_screen(x) redraw_screen(x, 0) //vt_kern.h
#define switch_screen(x) redraw_screen(x, 1) //vt_kern.h
update_screen(vc);//fbcon.c里面很多地方有,但实际上被调用了两次
redraw_screen(struct vc_data *vc, int is_switch) //vt.c
update = vc->vc_sw->con_switch(vc); //vt.c
fbcon_switch(struct vc_data *vc) // fbcon.c
fb_show_logo(info, ops->rotate); // fbcon.c

vt.c
do_bind_con_driver(const struct consw *csw, int first, int last,int deflt)
visual_init(vc, i, 0);
vc->vc_sw->con_init(vc, init);// fbcon_init
set_origin(vc);
update_attr(vc);

//final conclusion
module_init(fb_console_init);//fbcon.c
fb_console_init //fbcon.c
fb_register_client(&fbcon_event_notifier);//fbcon.c
fbcon_event_notify //fbcon.c
fbcon_fb_registered //fbcon.c
do_fbcon_takeover //fbcon.c
do_take_over_console //vt.c
do_register_con_driver
vtconsole_init_device
do_bind_con_driver(csw, first, last, deflt);//vt.c
vc->vc_sw->con_deinit(vc);
visual_init(vc, i, 0);
vc->vc_sw->con_init(vc, init);// fbcon_init fbcon.c
fbcon_prepare_logo(vc, info, cols, rows, new_cols, new_rows);//fbcon.c
fb_prepare_logo(info, ops->rotate); //fbcon.c
set_origin(vc);
update_attr(vc);
update_screen(vc);
redraw_screen(struct vc_data *vc, int is_switch)
vc->vc_sw->con_switch(vc);// fbcon_switch fbcon.c
fb_show_logo(info, ops->rotate);//fbcon.c
fb_show_logo_line(info, rotate, fb_logo.logo, 0,1);//fbmem.c
fb_rotate_logo(info, logo_rotate, &image, rotate);
fb_rotate_logo_cw
fb_do_show_logo(info, &image, rotate, 1);

修改点记录

  1. 系统启动后默认是两只企鹅
    fb_show_logo
    y = fb_show_logo_line(info, rotate, fb_logo.logo, 0,num_online_cpus());
    调用原型是这样的,打印的num_online_cpus的值是2;
    改成fb_show_logo_line(info, rotate, fb_logo.logo, 0,1);
    就只有一只企鹅了,所以这里企鹅的数量想代表的意思应该是芯片的核数
  2. fbcon_prepare_logo
    fb_prepare_logo(info, ops->rotate);
    fb_prepare_extra_logos(info, fb_logo.logo->height, yres); //这个函数的定义有两个,经过跟踪执行,发现实际会调用那个空的函数,不起作用,所以代码里直接注释掉这个函数的调用,这个函数是获取图片的高度,所以直接在fb_prepare_logo来写了,fb_prepare_logo改写部分如下:

在这里插入图片描述

3.fbcon_prepare_logo里面有这么一句
logo_height = fb_prepare_logo(info, ops->rotate);
经过测试,发现把logo_height改到592及以上,图片就会显示失败
在后面执行到的fb_do_show_logo里面,可以看到有
image->dy += image->height + 8;
这个高度被自动加了8,592+8=600,超过592就超出了屏幕的范围了,导致失败;
//这里没作修改,只是做一下注释

4.在fbcon_prepare_logo函数里面明明设置了rotate,但是好像没有传到fb_show_logo里面,下周做进一步调试:
在fbcon.c-> fbcon_prepare_logo里面
添加ops->rotate=1;发现并不能起到作用
继续往后追踪代码发现,后面执行的fbcon_switch函数里面又有将ops->rotate置值,于是将这段屏蔽掉,截图如下
在这里插入图片描述

扫描二维码关注公众号,回复: 4300872 查看本文章

如果不在fbcon_prepare_logo里面取设置rotate,直接在fbcon_switch里面去设置rotate即可
在这里插入图片描述

5.现在图片是旋转过来了,问题是坐标原点被从左上角改到右上角了,坐标轴的方向也变了,现在来解决这个坐标原点被改变了的问题,经过代码分析,发现不是坐标原点的问题,而是在fb_rotate_logo函数里面有
在这里插入图片描述
注释掉最下面最两句,就正常了

6.搞定了一张图片的旋转和位置放置,现在来调试一张图片的连续换位置:
fbmem.c的fb_show_logo_line函数修改如下
在这里插入图片描述
在这里插入图片描述
即可实现连续在不同位置显示同一张图片;这不是最终要的效果

7.现在来在一个位置显示一张图片后,擦除这张图片,然后在另一个位置显示盖图片:
在fbmem.c的fb_show_logo_line里面
在这里插入图片描述
在这里插入图片描述
即可完成简单动画;
上述做的是一张图片的内核动画,由于内核动画会用到的可能性不大,而且还会占用开机时间,暂不研究多张图片的组合动画,需要的时候再去调试

猜你喜欢

转载自blog.csdn.net/qq_41903811/article/details/84591453