实现原理:
1.用uboot把文件系统里面的文件读取到RAM的最后一点位置
2.设置此位置不被内核占用
3.内核读取RAM地址,并解码。
4.内核启动后文件系统也就能使用了,再挂载存LOGO的分区
5.通过cp等命令替换原来的LOGO图片即可
6.重新开机,显示新LOGO
暂时只支持FB缓冲区为32bit的设备(也就是ARGB888或者RGB888的平台),RGB55、RGB565、RGB666等还为受到支持与验证。
为了简化步骤,不用去修改makefile文件,所以所有的源文件都是用的x.h
支持解码8bit、16bit、24bit、32bit的未压缩bmp文件,暂不支持1bit的BMP文件
作者建议:
LOGO尺寸不能超过屏幕尺寸
优先使用32bit的BMP文件,虽然占用的空间大些,但是解码32bit的速度是最快的
避免使用24bit的BMP文件,因为24bit既不是字也不是半字,只能用3个字节来处理,处理速度相对其他格式较慢。
避免使用 8bit的BMP文件,颜色还原度较差,如果您的图片为黑白图片,8bit的将是最佳选择。
教程针对f1c100s SD卡启动
1、uboot修改
1.1、memconfig里面
修改传入内核的参数内存修改小一点(如:f1c100s配480*272的屏幕 添加或者改为mem=30M)(最好留出屏幕分辨率的2.5倍以上,其中要存放一张BMP图片,很多UBOOT的屏幕显存是放到内存末尾的)
1.2、修改uboot的evn,f1c100s的目录u-boot/include/configs/suniv.h\
f1c100s完整参数如下:
#define CONFIG_BOOTCOMMAND "setenv bootm_boot_mode sec; " \
"load mmc 0:1 0x81E00000 logo.bmp;" \
"load mmc 0:1 0x81000000 zImage; " \
"load mmc 0:1 0x81800000 suniv-f1c100s-licheepi-nano.dtb;" \
"bootz 0x81000000 - 0x81800000;"
只需要在之前的变量中添加
"load mmc 0:1 0x81E00000 logo.bmp;" \
mmc 0:1 需要根据实际情况来修改,fic100s的平台可以这么写
0x81E00000 为内存地址,根据实际内存大小来定义以及屏幕大小来修改
logo.bmp 为logo文件名(支持8bit、16bit、24bit和32bit的未压缩bmp文件)
2、将logo.bmp文拷贝到SD卡的第一分区(也就是放置内核的位置)
使用本文件夹下面的LOGO需要修改文件名
3、内核修改
把所有.H文件拷贝到drivers/video/fbdev/core/ 下面
修改drivers/video/fbdev/core/fbmem.c文件的int fb_show_logo(struct fb_info *info, int rotate)函数
#include "xinxin_main.h"
int fb_show_logo(struct fb_info *info, int rotate)
{
int y;
y = xinxin_disp_bmp_logo(info, rotate, 0, num_online_cpus());
// y = fb_show_logo_line(info, rotate, fb_logo.logo, 0, num_online_cpus());
// y = fb_show_extra_logos(info, y, rotate);
return y;
}
附1
如果您的LOGO显示不完整
需要修改 drivers/video/console/fbcon.c 如果没有那就在drivers/video/fbdev/core/fbcon.czhong中
找到"fbcon_prepare_logo"函数,在
logo_height = fb_prepare_logo(info, ops->rotate);
如果您不需要屏幕打印tty信息则添加
logo_height = 屏幕高度;
最近编辑记录 xinxin (2020-05-10 11:08:31)
离线
离线
感谢分享, get新技能!
离线
感谢分享!
离线
原来可以这样实现,多谢楼主!
离线
有点不解,logo文件放到文件系统的,uboot阶段就可以显示logo了,为什么还需要修改内核呢?
离线
楼主的做法,可能是在uboot和linux阶段都显示logo。
有些系统在两者同时显示时,可能会有花屏出现。。。 标题里面还提到了支持应用层动态修改。
有点不解,logo文件放到文件系统的,uboot阶段就可以显示logo了,为什么还需要修改内核呢?
离线
楼主的做法,可能是在uboot和linux阶段都显示logo。
有些系统在两者同时显示时,可能会有花屏出现。。。 标题里面还提到了支持应用层动态修改。
我也觉得是这个意思, 但是小弟我道行浅,不敢说,只敢站在大佬后面附和几句。
离线
学习了,
离线
有点不解,logo文件放到文件系统的,uboot阶段就可以显示logo了,为什么还需要修改内核呢?
我的目的是做了解码JIF的开机动画,只是标题打早了一点,现在只支持BMP的解码,如果只用UBOOT实现动画时间太短了,可能就3秒:),要是用内核来实现动画还可以加入开机进度条,修改UBOOT是因为不能保证内核是先insmode文件系统再insmode BF的,所以先用UBOOT把文件读取到RAM中,内核直接读RAM。
离线
感谢分享!学习了
离线
可以这样实现,多谢楼主~
离线
mark
离线
mark
离线
好思路
离线
离线
离线
能分享下项目吗?
离线
uboot并没有显示logo吧,uboot只是从mmc里面把logo数据读取到内存里,然后在kernel显示logo.
离线
离线
地址能再发一下吗 已经失效了 另外在uboot中将logo.bmp中加载到内存了 怎么在uboot中进行显示啊 望不吝赐教 谢谢
离线
我倒是想了一种方案,已应用效果不错。
思路是,使用开源工具ImageMagick,移植到目标板。该工具能将bmp/png/jpg等格式的图片转成bgr原始数据,然后在uboot/kernel/rootfs阶段读取该原始数据,写入framebuffer即可。
博客:https://blog.csdn.net/qq_27689785/article/details/117250592?spm=1001.2014.3001.5501/
最近编辑记录 山羊胡子 (2021-06-18 10:49:44)
离线
离线