如何让uboot启动时显示logo

author author     2023-04-19     721

关键词:

自定义u-boot的开机logo的方法
  我用的u-boot是2009.08版的。想要修改开机logo为自定义的图片,而不是原来的denx.bmp。
方法其实很简单,只需替换u-boot的tools/logos目录中的denx.bmp,再重新编译(可能需要先执行make clean,再make,新的图片
才会起作用),图片大小不要起过你的屏的大小,色彩深度不能大于256色,即8位色深的图片。
不过,如果你不想替换denx.bmp,而要用自已的图片文件,比如,我用的是rat-linux.bmp文件,也可以。把你的文件拷贝
到/tools/logos目录中,再修改/tools目录下的makefile文件,找到以下代码段

ifeq ($(LOGO_BMP),)
LOGO_BMP= logos/denx.bmp
endif
ifeq ($(VENDOR),atmel)
LOGO_BMP= logos/atmel.bmp
endif
ifeq ($(VENDOR),ronetix)
LOGO_BMP= logos/ronetix.bmp
endif
将其中的LOGO_BMP= logos/denx.bmp改为 LOGO_BMP= logos/rat-linux.bmp即可。重新编译,你的图片就可以起作用了。
  U-boot开机logo的制作方法
在有实现LCD显示和LCD命令行终端的U-boot中,在左上角都有显示一个logo,如果是atmel的芯片,就会有atmel的logo,三星的则是denx的logo。
有的网友发邮件说想改成自己公司的Logo,而且如果是自己玩的话,改成自己喜欢的logo也爽阿。所以今天我做好了实验,将简单的修改方法总结如下:

一、图片的放置路径

所有的开机logo都放在了 /tools/logos 之下,你只需要将你的班子作对应的logo替换就好了。

对于S3C2440,你只需要将denx.bmp替换成你想要的logo就好了。

对于ATMEL的芯片,据说会显示ATMEL的logo,所以替换那个logo即可。

但是你所替换的logo必须和原来的大小、格式一模一样,否则会出现u-boot使用过程中宕机重启的后果。

二、图片的大小标准

不同的logo对应不同的大小,这里S3C2440所对应的是160*96分辨率的BMP图片。

三、图片的转换脚本

在制作图片前,请您现确认您的Linux主机上安装了Netpbm 工具包。如果是ubuntu,你可以直接用新立得安装;如果是别的发行版,可以在 Netpbm主页 下载源代码编译。

将你想要的图片裁减成160*96的JPG图片,然后用以下的脚本处理一下就好了:

#!/bin/sh
#install Netpbm first
jpegtopnm $1 | ppmquant 31 | ppmtobmp -bpp 8 > $2

使用方法: (脚本名) ( 待处理的JPG图片名) (输出文件名)
  2.6 的Kernel LOGO真容易改试着改了一下,似乎比2.4容易。2.6的logo数据在/drivers/video/logo里,ppm文件就是logo图像了。每 个ppm对应一个.c文件,内容大概就是图像尺寸、调色板、位图数据等信息。.c文件无需自己建立,在make的时候如果不存在某个ppm文件对应的.c 文件,就会自动从ppm生成一个,然后把它编译成.o文件。所以看看目录下哪些.ppm文件有同名的.o文件,就说明那个logo被编译进了 kernel。标准的224色logo是logo_linux_clut224.ppm,因此修改这个图片就可以实现修改logo了。
在 windows下,可以用PaintShopProX直接打开ppm进行编辑,编辑完毕后用decrease color depth命令降为224色,然后保存,把logo_linux_clut224.c删掉,重新make就可以了。这个是我昨晚随便改的logo :

在 深入一点点。很容易发现,对于一般的vga console,logo是由drivers/video/fbmem.c里的fb_show_logo()函数显示的,这个函数的调用者是 drivers/video/console/fbcon.c(跟2.4差不多,嗯)。这个函数做的事情不多,就是先把非8位色深的位图转换为8位色深, 然后用info->fbops->fb_imageblit(info,& image);把logo显示出来,有一个cpu时显示一个logo,有2个cpu时显示2个,以此类推。

略加修改,就可以实现将logo居中显示,并加入一个“重复显示右边界”,也就是把logo最右边4个点宽的区域作为背景填充到整个logo bar。diff如下:

--- /gs2e/source/linux26-2edev/drivers/video/fbmem.c2006-08-29 14:07:15.000000000 +0800
+++ ./fbmem.c2006-09-27 20:40:08.000000000 +0800
@@ -375,9 +375,9 @@
int fb_show_logo(struct fb_info *info)

u32 *palette = NULL, *saved_pseudo_palette = NULL;
-unsigned char *logo_new = NULL;
-struct fb_image image;
-int x;
+unsigned char *logo_new = NULL, *border = NULL;
+struct fb_image image, imageborder;
+int x, xoffset;

/* Return if the frame buffer is not mapped or suspended */
if (fb_logo.logo == NULL || info->state != FBINFO_STATE_RUNNING)
@@ -421,12 +421,45 @@
image.height = fb_logo.logo->height;
image.dy = 0;

+#ifdef CONFIG_LOGO_REPEAT_RIGHT
+border = kmalloc(4 * fb_logo.logo->height, GFP_KERNEL);
+if (border != NULL)
+ for (x = 0; x < fb_logo.logo->height; x++) /* use x as y */
+*((u32 *)border + x) = /* will repeat 4 pixels of the right side*/
+*(u32 *)(image.data + (x+1)*fb_logo.logo->width - 4);
+
+ imageborder.depth = 8;
+ imageborder.data = border;
+ imageborder.width = 4;
+ imageborder.height = image.height;
+ imageborder.dy = 0;
+ for (x = 0; x < info->var.xres; x+=4)
+imageborder.dx = x;
+info->fbops->fb_imageblit(info, &imageborder);
+
+ kfree(border);
+
+#endif
+#ifndef CONFIG_CENTER_LOGO
+xoffset = 0;
for (x = 0; x < num_online_cpus() * (fb_logo.logo->width + 8) &&
x <= info->var.xres-fb_logo.logo->width; x += (fb_logo.logo->width + 8))
image.dx = x;
info->fbops->fb_imageblit(info, &image);

-
+#else
+xoffset = (info->var.xres - num_online_cpus() * (fb_logo.logo->width + 8))>>1;
+if (xoffset<0)xoffset = 0;
+ for (x = xoffset; x < num_online_cpus() * (fb_logo.logo->width + 8) + xoffset &&
+ x <= info->var.xres-fb_logo.logo->width+xoffset; x += (fb_logo.logo->width + 8))
+ image.dx = x;
+ info->fbops->fb_imageblit(info, &image);
+
+#endif
kfree(palette);
if (saved_pseudo_palette != NULL)
info->pseudo_palette = saved_pseudo_palette;

我在这里定义了两个配置变量,CONFIG_LOGO_REPEAT_RIGHT和CONFIG_CENTER_LOGO,修改/drivers/video/logo/Kconfig,加上:

config CENTER_LOGO
bool "Center logo"
depends on LOGO
default n
config LOGO_REPEAT_RIGHT
bool "Repeat the right border (4 pixels)"
depends on LOGO
default n

这样就可以在make menuconfig之类的界面中设置是否开启这两项功能了。
参考技术A 最近做Uboot移植遇到了一个问题,正常情况下logo应该放在tools/logos里,但是这次移植完发现,启动的时候直接用了uboot根目录下的logo,

如何让uboot启动时显示logo

自定义u-boot的开机logo的方法  我用的u-boot是2009.08版的。想要修改开机logo为自定义的图片,而不是原来的denx.bmp。方法其实很简单,只需替换u-boot的tools/logos目录中的denx.bmp,再重新编译(可能需要先执行makeclean,再make,新的... 查看详情

如何避免在后台运行时启动应用程序时显示启动画面?

】如何避免在后台运行时启动应用程序时显示启动画面?【英文标题】:Howtoavoidshowingsplashscreenwhenappislaunchedwhilerunninginbackground?【发布时间】:2020-08-2613:49:40【问题描述】:仅在重新启动时显示启动画面,而不是在后台运行时启... 查看详情

如何在应用启动和退出时显示 Admob 插页式广告

】如何在应用启动和退出时显示Admob插页式广告【英文标题】:HowtoshowAdmobinterstitialonappstartandexit【发布时间】:2015-06-2407:59:10【问题描述】:我可以在App启动时显示AdmobInterstitial,我也可以在App退出时显示AdmobInterstitial。但是现... 查看详情

如何在启动时显示 KivyMD 数据表?

】如何在启动时显示KivyMD数据表?【英文标题】:HowcanIshowKivyMDdatatableonstart-up?【发布时间】:2021-06-1800:06:25【问题描述】:我正在制作一个将在选项卡内显示数据表的应用程序,并且我正在尝试在应用程序启动时显示它。现在... 查看详情

如何在应用程序启动时显示锁定屏幕?

】如何在应用程序启动时显示锁定屏幕?【英文标题】:Howtodisplaylockscreenonappstartup?【发布时间】:2011-04-0604:34:06【问题描述】:我正在尝试在我的应用启动时显示锁定屏幕。我正在尝试在这里使用代码->https://github.com/jazzychad/... 查看详情

java示例代码_如何仅在活动启动而不是恢复时显示启动屏幕

java示例代码_如何仅在活动启动而不是恢复时显示启动屏幕 查看详情

如何让元素在父级悬停时显示?

】如何让元素在父级悬停时显示?【英文标题】:Howtogetelementtodisplayonhoverofparent?【发布时间】:2019-03-0623:55:39【问题描述】:我们有一个使用&lt;ul&gt;显示菜单的菜单(请参阅密码)。当.one类设置为position:absolute时,当我... 查看详情

如何在 Emacs 启动时显示 Org 模式议程?

】如何在Emacs启动时显示Org模式议程?【英文标题】:HowcanIshowtheOrg-modeagendaonEmacsstart-up?【发布时间】:2010-01-0602:04:13【问题描述】:我希望Org模式议程能够在我打开Emacs时自动显示我今天要做的事情。org-agenda命令是交互式的,... 查看详情

如何在启动时显示 NavigationView (SwiftUI) 的详细视图

】如何在启动时显示NavigationView(SwiftUI)的详细视图【英文标题】:HowtodisplayadetailedviewonstartupforaNavigationView(SwiftUI)【发布时间】:2021-10-0314:20:26【问题描述】:Thistutorial使用NavigationView显示可以单击的元素的List,从而导致详细视图... 查看详情

如何更改启动时显示的默认 SKScene

】如何更改启动时显示的默认SKScene【英文标题】:HowtochangethedefaultSKScenethatdisplaysonstartup【发布时间】:2017-02-0811:21:46【问题描述】:我一直在开发一款在XCode创建的单一默认GameScene中完成的游戏。现在我想添加更多屏幕,包括... 查看详情

如何使用 VBA 在 Outlook 365 上启动时显示所有日历?

】如何使用VBA在Outlook365上启动时显示所有日历?【英文标题】:HowtoshowallcalendarsatstartuponOutlook365usingVBA?【发布时间】:2022-01-1014:42:19【问题描述】:我在Windows10上使用Outlook365。“我的日历”组中有三个日历。我想在启动时显示... 查看详情

如何仅在初始启动时显示屏幕

】如何仅在初始启动时显示屏幕【英文标题】:Howtomakeascreenshowonlyoninitiallaunch【发布时间】:2015-02-0403:52:45【问题描述】:我正在尝试为我的应用制作介绍屏幕-即所有用户在第一次下载和运行应用时必须同意的服务条款屏幕。... 查看详情

如何让导航栏在转回时显示大标题?

】如何让导航栏在转回时显示大标题?【英文标题】:Howtogetthenavigationbartoshowlargetitleuponasegueback?【发布时间】:2019-09-2317:04:14【问题描述】:我有一个标签栏应用程序,其中一个视图是UITableViewController,其中包含静态单元格作... 查看详情

在应用启动时显示 ViewController

】在应用启动时显示ViewController【英文标题】:DisplayViewControlleronapplaunch【发布时间】:2014-04-0121:35:58【问题描述】:这是我在***上的第一篇文章,所以我想说“你好”。原谅我英语不好:)我在***上阅读了许多主题来解决我的问题... 查看详情

UISplitViewController:如何强制在应用启动时显示主弹出框? (肖像)

】UISplitViewController:如何强制在应用启动时显示主弹出框?(肖像)【英文标题】:UISplitViewController:Howforcetoshowmasterpopoverinapplaunch?(portrait)【发布时间】:2012-05-0307:02:51【问题描述】:在iPad应用程序中,我使用的是UISplitViewControl... 查看详情

如何在应用程序每 3 次启动时显示弹出窗口?

】如何在应用程序每3次启动时显示弹出窗口?【英文标题】:howtoshowpopupevery3rdtimeapphaslaunched?【发布时间】:2011-07-2305:11:56【问题描述】:我需要在我的应用每3次启动时显示一个弹出窗口。我也在使用Appirater来评价我的应用程... 查看详情

仅在 iOS 中首次启动时显示屏幕

...序的第一次启动时显示一个小的教程屏幕,该应用程序是如何工作的。带有小教程的屏幕仅在应用程序第一次启动时弹出(1次)我可以如何以及用什么来制作类似的东西?谁能把我推向正确的方向?查看我的意思:【问题讨论... 查看详情

如何仅在第一次启动 IOS Swift 时显示页面控制器

】如何仅在第一次启动IOSSwift时显示页面控制器【英文标题】:HowcanIdisplaypagecontrolleronlyonthefirstlaunchIOSSwift【发布时间】:2016-12-0316:26:46【问题描述】:我只想在用户第一次打开应用程序时显示页面控制器,然后当他再次打开时... 查看详情