前言
Linux 启动过程中,在屏幕左上角会出现核数对应的小企鹅图标(对于2核i.MX93来说,会出现两个小企鹅),每个企鹅图片分辨率为80*80,这个图片对应内核源码中的ppm文件。在实际嵌入式设备应用中,用户常常希望定制启动画面,并且有时候需要显示一幅铺满整个屏幕的图像或者小图标并设置图标位置。本篇文章我们将手把手教你替换图标,设置图标位置及显示个数。
1 准备一张图片
根据使用屏幕的分辨率,确定所要修改的LOGO的分辨率,比如这里选用i.MX93标配的MIPI-DSI竖屏 MX8-DSI-显示屏,其屏幕分辨率为1080*1920。第一步,我们需要找到一张期望替换的图片,使用图像处理工具软件,将该图片分辨率加工成等于或小于LCD分辨率的图片,注意分辨率允许小但绝不允许大。
2 转换为ppm格式的图片
由于的logo格式是ppm的,所以这里我们首先要将png图片转换成ppm格式。这里我们以使用为例进行说明,是一个用于处理图像的工具集合,包含 、和 等工具。在 PC上执行如下命令安装工具集。
sudo apt update
sudo apt install netpbm
执行如下命令进行图片格式转换:
# 转换 PNG 为 PNM 格式
pngtopnm nxp-logo.png > nxp-logo.pnm
# 量化颜色至 224 色,Linux 启动 logo需要 224 色
pnmquant 224 nxp-logo.pnm > nxp-logo_224.pnm
# 将二进制 PNM 转换为纯文本(ASCII)格式的 PPM
pnmtoplainpnm nxp-logo_224.pnm > logo_linux_clut224.ppm
rm nxp-logo.pnm nxp-logo_224.pnm
3 替换logo文件
将上文生成的“.ppm”文件,拷贝替换“/video/logo/.ppm”文件。确保该目录下没有 “4.c”和“4.o”两个文件,如果有就将其删除。
执行如下命令重新编译。本文主要基于NXP的L6.6.52_2.2.0版本的BSPflash进度条flash进度条,在IMX93-EVK上进行演示。
/* 设置环境变量 */
export CROSS_COMPILE=aarch64-linux-gnu-
export ARCH=arm64
/* 编译 */
make imx_v8_defconfig
make -j$(nproc)
4 全屏logo演示图片
编译后通过网络SCP或者U盘上传新镜像到板卡并重新运行,效果如下,可以看到的小企鹅已替换为我们制作的logo。
演示视频
5 关闭Linux启动YOCTO进度条
在演示视频中,我们可以看到启动logo之后有一个YOCTO进度条,这个进度条依赖于服务来实现。我们可以通过修改配置,禁用服务,来关闭进度条。
通过如下两条命令关闭服务:
systemctl disable psplash-start
systemctl disable psplash-systemd
修改完毕后,重启板卡,配置生效。YOCTO进度条消失,Linux 启动logo之后直接进入桌面。
6 非全屏logo居中以及改为单一图标
前面的步骤介绍了铺满整个屏幕的logo修改方法,如果是非全屏logo的话,怎么设置居中显示以及只显示一张图片呢?
6.1 设置方法
参考前面的步骤,我们可以新生成一张分辨率的PNG图片,并将其转换为PPM格式,替换掉源码下的logo文件,最后重新编译。
从5.10的版本开始,系统支持uboot启动参数设置的logo居中以及logo的数量。用户可参考源码下的帮助文件“/fb/fbcon.rst”获取更多信息。
您可以在u-boot的参数中添加“fbcon=logo-pos:,logo-count:1”或者“fbcon=logo-pos: fbcon=logo-count:1”定义,并保存。
setenv mmcargs "setenv bootargs ${jh_clk} ${mcore_clk} console=${console} root=${mmcroot} fbcon=logo-pos:center,logo-count:1"
saveenv
6.2 参数传递流程
入口点:() 函数(位于/video/fbdev/core/fbcon.c)负责解析 fbcon= 后的参数。
关键代码逻辑:
内核启动时,() 被调用,其参数 指向 fbcon= 后的字符串(如 "logo-pos:")。
通过 匹配"logo-pos:" 前缀,若检测到 "",则设置 = true。
if (!strncmp(options, "logo-pos:", 9)) {
options += 9;
if (!strcmp(options, "center"))
fb_center_logo = true;
continue;
}
调用链示例:
内核启动时,命令行参数通过以下路径传递:
start_kernel()
→ console_init()
→ fbcon_init()// 初始化 fbcon
→ fbcon_setup()// 解析 "fbcon=" 参数
() 的 参数直接来自 fbcon= 后的子字符串。
6.3 非全屏logo演示图片
7 去掉logo下方的光标
我们可以在内核的当前目录进入到/video/fbdev/core/fbcon.c文件,将 void ( *work) 和 void ( *vc, int mode) 里的内容注释掉,使之变成空函数。
编后语
本文演示了Linux下全屏以及非全屏logo的修改方法。其中非全屏logo还涉及到logo居中、显示个数、以及去除显示光标。关于 启动 logo 的定制替换及演示视频的更多信息,欢迎大家留言或私信讨论。
限时特惠:本站持续每日更新海量各大内部创业课程,一年会员仅需要98元,全站资源免费下载
点击查看详情
站长微信:Jiucxh