项目场景:
在眺望电子TW-AC6G-EVM开发板上修改linux内核启动logo图片:
编译环境及开发包:
主机:ubuntu18.04
交叉编译器:arm-linux-gnueabihf-gcc
QT5.12.8:qt-everywhere-opensource-src-5.12.8
开发板:TW-AC6G-EVM
Linux:Linux-4.1.15
串口工具:Xshell
注意:本文章的所有命令涉及到的路径均为眺望电子官方环境路径,需根据自身实际环境改变。本文所演示的平台来自于眺望电子 iMX6ULL ARM嵌入式平台,这是一个基于NXP iMX6ULL ARM处理器,主频800MH在 Cortex-A7的核心板。
解决方案:
1.制作Linux内核需要的开机logo(ppm格式)
1.1在Ubuntu系统上安装netpdm工具
命令如下:# sudo apt-get install netpdm
1.2准备所需要的logo图片
图片的大小请参考开发板所使用的分辨率,本文档以1024x600为例,准备一张1024x600的png格式图片,并重命名为utulinux_logo.png。
1.3将我们准备好的logo转换成我们需要的ppm格式
(1)首先将png图片转成pnm
pngtopnm utulinux_logo.png > utulinux_logo.pnm
(2)然后将pnm图片的颜色数限制在224
pnmquant 224 utulinux_logo.pnm > utulinux_logo_224.pnm
(3)最后将pnm图片转换成我们需要的ppm
pnmtoplainpnm utulinux_logo_224.pnm > logo_linux_clut224.ppm
logo_linux_clut224.ppm就是我们转换最终得到的linux图片支持格式。
1.4将生成的logo图片替换自带企鹅logo
把得到的logo_linux_clut224.ppm
替换drivers/video/logo
中logo_linux_clut224.ppm
图片(默认为企鹅),并将logo_linux_clut224.c
与logo_linux_clut224.o
文件删除。
2.修改部分代码使logo居中显示
修改源码/driver/video/fbdev/core/fbmem.c
中的fb_show_logo_line
函数。
增加:
image.dx = (info->var.xres/2) - (image.width/2);
image.dy = (info->var.yres/2) - (image.height/2);
代码中的位置(大概在500行左右)如下:
/*
image.dx = 0;
mage.dy = y;
*/
image.width = logo->width;
image.height = logo->height;
image.dx=(info->var.xres/2)-(image.width/2);
image.dy=(info->var.yres/2)-(image.height/2);
修改:fb_do_show_logo(info, &image, rotate, n);
将n改成1
修改源码/driver/video/console/fbcon.c
中的fbcon_prepare_logo()
函数
增加:
logo_height += (info->var.yres/2) - (logo_height/2);
代码中的位置:
logo_height = fb_prepare_logo(info, ops->rotate);
logo_height += (info->var.yres/2)-(logo_height/2);
logo_lines = DIV_ROUND_UP(logo_height, vc->vc_font.height);
3.配置内核使能 Linux logo 显示
打开 Linux 内核图形化配置界面,按下路径找到对应的配置项:
-> Device Drivers
-> Graphics support
-> Bootup logo ([=y])
-> Standard black and white Linux logo
-> Standard 16-color Linux logo
-> Standard 224-color Linux logo
->Console display driver support
->Framebuffer Console support ([=y])
->Map the console to the primary display device
->Framebuffer Console Rotation
重新编译并烧录到开发板中,重启即可显示新logo。
4.调试过程中的问题与方法
4.1黑屏且无法运行QT测试程序
问题1:
一直处于黑屏状态,运行QT例程提示Unable to figure out framebuffer device. Specify it manually.
方法:
注释设备树下相关语句,如下图:
4.2开机白屏,无法显示启动logo,QT运行正常
问题2:
无法显示开机企鹅logo,显示白屏,运行QT例程正常。
方法:
修改源码/driver/video/fbdev/mxsfb.c
中的mxsfb_probe()函数
注释:
/*
memcpy(fb_info->screen_base,(void*)0x84000000,fb_info->fix.smem_len);
msleep(100);
*/
4.3同等大小图片不显示
问题3:
分辨率为1024x600的屏幕无法显示分辨率为1024x600的logo图片,打印信息为fbcon_init:disable boot-logo(boot-logo bigger than screen)。
方法:
修改源码/driver/video/fbdev/console/fbcon.c中的fbcon_prepare_logo()函数
更改前:logo_lines = DIV_ROUND_UP(logo_height, vc->vc_font.height);
更改后:logo_lines=(logo_height)/vc->vc_font.height;
或logo_lines = DIV_ROUND_UP(logo_height, vc->vc_font.height+1);
4.4启动logo显示正常但有光标一同显示
问题4:
去除kernel启动显示logo的光标
方法:
修改源码/driver/video/console/fbcon.c
中的 fb_flashcursor()函数和fbcon_cursor()函数。
将上述两个函数内容注释,使这两个函数为空函数。
4.5 去掉显示串口信息
修改文件系统文件:
屏蔽相关文件
自启动文件 cd /etc/init.d/psplash.sh
的最后一行
/usr/bin/psplash –angle $rotation &
QT启动文件 /etc/rc5.d/S95qt.sh
1.屏蔽/etc/inittab
的倒数第二行#1:2345:respawn:/sbin/getty 38400 tty$1
2./etc/init.d/banner.sh
中的倒数两行
#echo > $vtmaster
#echo "Please wait: booting..." > $vtmaster
重启reboot可以看到logo画面