uboot开机logo

From: http://blog.chinaunix.net/uid-9688646-id-1998453.html

参考资料:
【1】U-boot开机logo的制作方法(Tekkaman Ninja):http://blog.chinaunix.net/u1/34474/showart_2085233.html
【2】U-Boot中的Splash Screen(Charlie Chen):http://blog.chinaunix.net/u1/51797/showart.php?id=2070554
【3】UBOOT LCD驱动流程(牛蹄印章):http://blog.chinaunix.net/u3/90973/showart_2303809.html

在有实现LCD显示和LCD命令行终端的U-boot中,默认情况下在左上角都有显示一个logo,如果是atmel的芯片,就会有atmel的logo,三星的则是denx的logo。如果想把它改成自己喜欢的或者公司的logo,则只要作简单的修改便可以实现。

一、图片的放置路径

所有的开机logo都放在了 /tools/logos之下,所以,把你需要显示的logo图片(bmp格式)也放置到该目录下。根据你所设置的显示帧缓存的大小,图片大小有所限制。使用这种方法还有一个限制是:图片只能是8bpp的bmp图(参考uboot源码)。Tekkman文章中所说的“所替换的logo必须和原来的大小、格式一模一样,否则会出现u-boot使用过程中宕机重启的后果”,我自己亲测中并未遇到,当然,我也并没有做足够的测试,只是这并不需要和原图的大小一模一样。

二、修改Makefile文件
修改/tools目录下的Makefile文件,大约是44~46行

ifeq ($(LOGO_BMP),)
LOGO_BMP= logos/denx.bmp
endif

把 denx.bmp 替换为你需要显示的logo图片的文件名,保存退出,重新编译uboot。

三、图片的转换脚本
在制作图片前,请您现确认您的Linux主机上安装了Netpbm 工具包。如果是ubuntu,你可以直接用新立得安装;如果是别的发行版,可以在 Netpbm主页 下载源代码编译。然后用以下的脚本处理一下就好了:

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

使用方法: (脚本名) ( 待处理的JPG图片名) (输出文件名)

关于uboot的lcd驱动的编写,可参考资料【3】和Tekkaman的uboot移植源码以及相应的芯片数据手册。参考资料【2】中的BMP命令不是必须的,不过实现了这个命令可以方便调试。


U-Boot中的Splash Screen

U-Boot配置

在U-Boot中使用Splash Screen,可以实现U-Boot启动后,在LCD上显示自定义图片,起到友好的界面显示作用。使用Splash Screen需要在配置文件中使能BMP图片功能和SPLASH功能:
#define CONFIG_CMD_BMP
#define CONFIG_SPLASH_SCREEN

实例

并且要定义splashimage变量以及在splash变量所定义的地址存放bmp图片。以2MB的SST30VF1601为例,工32个扇区,规划如下:

 项目    

 地址范围

扇区 

大小 

 说明

U-Boot 

0x0000 0000 ~ 0x0010 0000 

0~15 

1M 

 

 参数

0x0010 0000 ~ 0x0018 0000 

16~23 

512K 

 

splashimage 

0x0018 0000 ~ 0x0020 0000 

24~31 

512K 

 

操作    

现在要实现splash screen,需要进行操作,先下载一个图片到内存中,然后擦除FLASH的splashimage区域,接着将图片写入splashimage区域,最后设置并保存splashimage环境变量即可。
    U-Boot> tftp a0008000 logo.bmp                   ;下载文件到内存
    U-Boot> erase 1:23-31                                 ;擦除Flash的splashimage区域
    U-Boot> cp.b a0008000 00180000 $filesize    ;将logo写到Flash的splashimage区域
    U-Boot> setenv splashimage 00180000         ;设置splashimage环境变量
    U-Boot> saveenv                                         ;保存环境变量
u-boot启动后,输入bmp d $splashimage即可在LCD上显示logo图片。为了实现开机就显示logo,可以修改common/lcd.c文件,在其中加入实现 bmp d $splashimage的代码即可。

#############################################3

自定义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的KernelLOGO真容易改试着改了一下,似乎比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 colordepth命令降为224色,然后保存,把logo_linux_clut224.c删掉,重新make就可以了。这个是我昨晚随便改的logo :


在深入一点点。很容易发现,对于一般的vgaconsole,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之类的界面中设置是否开启这两项功能了。
更多关于logo hack的信息,可以参考:
http://gentoo-wiki.com/HOWTO_Linux_Logo_Hack

GMT+8, 2011-3-2 16:59, Processed in 0.600615 second(s), 5 queries.


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

USB连接TF卡 SD卡硬件电路

1、电路芯片 TF卡芯片选择&#xff1a;GL823K。USB2.0 SD/MMC闪存读卡器单芯片。支持USB2.0高速传输&#xff0c;并符合通用串行总线规范。 它的引脚设计适合卡插口提供更容易的PCB布局。 TF卡防静电芯片&#xff1a;SMF05C。 2、电路 分享实际项目中用到的接口电路&#…

R语言-Kindle特价书爬榜示例 输出HTML小技巧

20170209更新&#xff1a; 根据回复提示&#xff0c;rvest包更新&#xff0c;原用函数html作废&#xff0c;需改用read_html 并后续amazon网页改版等 因此此文章代码失效&#xff01;各位可看评论内容了解详情 等以后有空再重写一遍代码&#xff0c;抱歉。果然代码还是放在gith…

【原创】指针和下标的10条对比

【原创】指针和下标的10条对比摘要&#xff1a;在编程语言中&#xff0c;指针和下标都是访问数据的有效手段&#xff0c;本文以C/C语言为例&#xff0c;讲解它们之间的区别。要想完全理解本文&#xff0c;读者可能需要&#xff1a;1.至少熟悉一门含有指针和下标语义的编程语言值…

[react] constructor和getInitialState有不同?

[react] constructor和getInitialState有不同&#xff1f; constructor用在class组件中getInitialState用在createReactClass实现的组件中 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与…

求数组中数对的最大值

题目&#xff1a; 在数组中&#xff0c;每个数字减去它右边的所有数字得到一个数对之差。求所有数对之差的最大值。 例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中&#xff0c;数对之差的最大值是9&#xff0c;是16减去5的结果。 分析&#xff1a; 要使 a-b要最大&#xff0c;只有…

工业RS485接口电路设计

1、电路芯片 485芯片有很多种&#xff0c;项目中用的比较多的是高速SP3485。满足RS-485和RS-422串行协议的要求&#xff0c;兼容工业标准规范&#xff0c;数据传输速率可高达10Mbps&#xff08;带负载&#xff09;。 2、工业设计 485需要做防雷考虑、瞬态过电压抑制、阻抗匹配…

读《大道至简》有感

编程序从一开始到现在给我是“斩不断&#xff0c;理还乱”的感觉&#xff0c;有时候真的对着一个程序一点头绪都没有&#xff0c;不知该如何下手。 在两千年前的寓言故事《愚公移山》中&#xff0c;已在无形中成就了一名工程师&#xff1a;愚公。他在移山之前都有详细的计划&am…

处理局域网网速变慢问题的几个思路

在一些企业中&#xff0c;我们会构建自己的内部局域网。然而&#xff0c;有的时候会出现局域网网速变慢的情况。一个刚建的小型局域网&#xff0c;一台服务器&#xff0c;十几台工作站&#xff0c;使用一台交换机作为接入设备&#xff0c;连接线路为6类线。主要故障表现为网内计…

int a[5]={}, a+1与(int*)a+1的区别

/*int a[5]{}, &a1与(int*)a1的区别 */ #include <stdio.h>int main() {int b, *pb;char *pb2;pb &b 1;pb2 (char*)&b sizeof(b);printf("&b%#x, pb%#x, pb2%#x\n", &b, pb, pb2);printf("Equal%d\n", (void*)pb (void*)p…

[react] 装饰器(Decorator)在React中有什么应用?

[react] 装饰器(Decorator)在React中有什么应用&#xff1f; connect、withRouter&#xff0c;等类似的高阶组件都可以用装饰器来使用 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣…

MyBatis学习笔记(一)——MyBatis快速入门

转自孤傲苍狼的博客&#xff1a;http://www.cnblogs.com/xdp-gacl/p/4261895.html 一、Mybatis介绍 MyBatis是一个支持普通SQL查询&#xff0c;存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简…

一个USB HUB电路分享

1、USB HUB 当USB接口不够用的时候&#xff0c;可以采用USB HUB电路进行扩展&#xff0c;将一个USB接口扩展为多个&#xff0c;并可以使这些接口同时使用的装置。USB HUB根据所属USB协议可分为USB2.0 HUB、USB3.0 HUB与USB3.1 HUB。 选用的USB HUB芯片为 USB2514B. 参考文档&…

自言自语(2011.8.1)

我就喜欢在夜里听想清幽的曲子&#xff0c;边听边在回忆和遐想。 说说近期的心得吧。 1 做事还是很急&#xff0c;一点不像职场老手。对事情考虑的不足&#xff0c;做完了没有留下点什么&#xff0c;没有系统性的规化&#xff0c;以至于用的时候还要再现去找。很是麻烦。 2 不够…

[react] React Fiber它的目的是解决什么问题?

[react] React Fiber它的目的是解决什么问题&#xff1f; 我个人的理解&#xff1a; React 15 的 StackReconciler 方案由于递归不可中断问题&#xff0c;如果 Diff 时间过长&#xff08;JS计算时间&#xff09;&#xff0c;会造成页面 UI 的无响应&#xff08;比如输入框&…

Fedora 17删除旧内核的操作

From: http://linux.chinaitlab.com/administer/904852.html 由于Fedora更新升级非常的频繁&#xff0c;所以非常有必要清除陈旧的内核&#xff0c;方法如下&#xff1a; 1. 查看当前系统中已安装的内核相关包&#xff1a; [rootlocalhost mint]# rpm -qa|grep kernel kernel…

围魏救赵

初&#xff0c;孙膑与庞涓俱学兵法&#xff0c;庞涓仕魏为将军&#xff0c;自以能不及孙膑&#xff0c;乃召之&#xff1b;至&#xff0c;则以法断其两足而黥之&#xff0c;欲使终身废弃。齐使者至魏&#xff0c;孙膑以刑徒阴见&#xff0c;说齐使者&#xff1b;齐使者窃载与之…

高压断路器故障诊断的相关方法

一、综述 高压断路器机械故障诊断方法综述_关永刚 二、参考文献 断路器的机械振动信号小波去噪技术研究_罗光鸿高压断路器分合闸线圈电流采集实验平台与故障模拟实验研究_彭在兴混合布谷鸟算法在高压断路器故障诊断上的应用_徐其丹基于Kohonen网络的高压断路器机械故障识别方…

[react] 如何用React实现滚动动画?

[react] 如何用React实现滚动动画&#xff1f; 简单的用CssTransitionGroup插件 &#xff0c;想自己搞就 用css3 动画结束后执行&#xff0c;setState&#xff0c;滚动用requestAnimFrame 效果更佳。点击事件内增加 位置判断&#xff0c;没到就 requestAnimFrame&#xff0c;到…

使用sql语句创建和删除约束示例代码

使用sql语句创建和删除约束 约束类型 主键约束&#xff08;Primary Key constraint&#xff09; --&#xff1a;要求主键列数据唯一&#xff0c;并且不允许为空。 唯一约束&#xff08;Unique constraint&#xff09; --&#xff1a;要求该列唯一&#xff0c;允许为空&#x…

RIP、 OSPF、 EIGRP的区别

我们前面已经简单介绍了三种类型的动态路由协议算法分别是距离矢量算法&#xff0c;链路状态算法以及平衡混合算法&#xff0c;那么咱们今天就来看看这几种算法的类型代表&#xff1a;RIP、OSPF、EIGRP。而且它们都是内部网关协议&#xff08;IGP&#xff09;&#xff0c;也就是…