首页 > 系统相关 >嵌入式linux开发 | u-boot启动logo修改

嵌入式linux开发 | u-boot启动logo修改

时间:2023-07-01 20:13:57浏览次数:53  
标签:video linux boot bmp VIDEO LOGO logo

原文:https://zhuanlan.zhihu.com/p/582316377

一、导读

使用嵌入式linux作为设备的操作系统,当在设备上电启动后,希望显示开机logo。一般会经历以下几个流程:

(1)运行芯片内部引导程序

(2)运行引导加载程序(u-boot较为常用)

(3)运行linux内核

(4)运行用户根文件系统,在这个阶段,就会根据项目特征需要具体的程序或者服务,最后则会进入一个人机交互软件终端。

本文以u-boot作为引导加载程序,在运行的时候,可以设置u-boot的启动logo,本文主要描述这个话题。

二、获取u-boot源码

u-boot是一款在嵌入式领域常使用的引导加载程序。一般情况下,我们不会使用u-boot官方维护的源码,而是使用芯片原厂或者硬件板卡提供商提供的u-boot源码,因为官方维护的u-boot源码的使用对象是芯片原厂,他们会根据自己的芯片特征做第一手的u-boot源码移植,以支持自家的芯片,然后发布给硬件板卡提供商或者第三方的合作伙伴。最后交到软件开发人员手里的就是已经可以直接编译使用、运行的u-boot源码了。

本文主要描述u-boot源码中对开机logo的常规(有些芯片原厂可能会有所修改)支持。

三、修改u-boot源码

3-1 准备开机logo

根据自己设备显示屏幕的大小制作一张文件格式为bmp的图片,此处笔者使用PS软件制作了一张开机logo:

 

(就显示了几个字,哈哈)

将其导出为bmp格式的文件后,然后将导出文件复制到u-boot源码下的tools/logos目录路径下,并命名为mylogo.bmp(可以随便命名)。

3-2 修改makefile

u-boot源码下的tools目录中,在makefile文件中查看一下关于logo编译部分的内容,找到以下内容:

# Generated LCD/video logo
LOGO_H = $(objtree)/include/bmp_logo.h
LOGO_DATA_H = $(objtree)/include/bmp_logo_data.h
LOGO-$(CONFIG_LCD_LOGO) += $(LOGO_H)
LOGO-$(CONFIG_LCD_LOGO) += $(LOGO_DATA_H)
LOGO-$(CONFIG_VIDEO_LOGO) += $(LOGO_H)
LOGO-$(CONFIG_VIDEO_LOGO) += $(LOGO_DATA_H)

# Generic logo
ifeq ($(LOGO_BMP),)
LOGO_BMP= $(srctree)/$(src)/logos/denx.bmp

# Use board logo and fallback to vendor
ifneq ($(wildcard $(srctree)/$(src)/logos/$(BOARD).bmp),)
LOGO_BMP= $(srctree)/$(src)/logos/$(BOARD).bmp
else
ifneq ($(wildcard $(srctree)/$(src)/logos/$(VENDOR).bmp),)
LOGO_BMP= $(srctree)/$(src)/logos/$(VENDOR).bmp
endif
endif

endif # !LOGO_BMP

将其修改为:

# Generated LCD/video logo
LOGO_H = $(objtree)/include/bmp_logo.h
LOGO_DATA_H = $(objtree)/include/bmp_logo_data.h
LOGO-$(CONFIG_LCD_LOGO) += $(LOGO_H)
LOGO-$(CONFIG_LCD_LOGO) += $(LOGO_DATA_H)
LOGO-$(CONFIG_VIDEO_LOGO) += $(LOGO_H)
LOGO-$(CONFIG_VIDEO_LOGO) += $(LOGO_DATA_H)

# Generic logo
ifeq ($(LOGO_BMP),)
LOGO_BMP= $(srctree)/$(src)/logos/mylogo.bmp #修改为自己的开机logo图片

# Use board logo and fallback to vendor
ifneq ($(wildcard $(srctree)/$(src)/logos/$(BOARD).bmp),)
LOGO_BMP= $(srctree)/$(src)/logos/$(BOARD).bmp
else
ifneq ($(wildcard $(srctree)/$(src)/logos/$(VENDOR).bmp),)
#LOGO_BMP= $(srctree)/$(src)/logos/$(VENDOR).bmp
LOGO_BMP= $(srctree)/$(src)/logos/mylogo.bmp  #修改为自己的开机logo图片
endif
endif

endif # !LOGO_BMP

在上述修改中,为了防止编译中参数控制对logo编译的影响,故做了两处修改。

3-3 添加宏定义

然后在具体对应板卡的描述头文件中添加两个宏定义:

#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
由于小生使用的是imx6ull的处理器平台,所以在include/mx6ullevk.h文件中添加(此处需要根据具体情况而定)

3-4 logo居中显示

修改drivers/video/cfb_console.c文件中的static void *video_logo(void)函数,修改如下:

static void *video_logo(void)
{
...
 splash_get_pos(&video_logo_xpos, &video_logo_ypos);
 /*增加代码,设置图片居中显示*/
 if(video_logo_xpos && video_logo_ypos)
 {
  video_logo_xpos= (VIDEO_VISIBLE_COLS - BMP_LOGO_WIDTH)>>1;
  video_logo_ypos= (VIDEO_VISIBLE_ROWS - BMP_LOGO_HEIGHT)>>1;
 }
 
#ifdef CONFIG_SPLASH_SCREEN

3-5 隐藏版本信息

同样修改drivers/video/cfb_console.c文件中的static void *video_logo(void)函数,注释掉该函数中的一些内容,修改如下:

if (board_cfb_skip())
  return 0;
/* 注释开始 */
 // sprintf(info, " %s", version_string);

 // space = (VIDEO_COLS - VIDEO_INFO_X) / VIDEO_FONT_WIDTH;
 // len = strlen(info);

 // if (len > space) {
 //  int xx = VIDEO_INFO_X, yy = VIDEO_INFO_Y;
 //  uchar *p = (uchar *) info;
 //  while (len) {
 //   if (len > space) {
 //    video_drawchars(xx, yy, p, space);
 //    len -= space;

 //    p = (uchar *) p + space;

 //    if (!y_off) {
 //     xx += VIDEO_FONT_WIDTH;
 //     space--;
 //    }
 //    yy += VIDEO_FONT_HEIGHT;

 //    y_off++;
 //   } else {
 //    video_drawchars(xx, yy, p, len);
 //    len = 0;
 //   }
 //  }
 // } else
 //  video_drawstring(VIDEO_INFO_X, VIDEO_INFO_Y, (uchar *) info);
/* 注释结束 */
#ifdef CONFIG_CONSOLE_EXTRA_INFO
通过以上步骤,就将u-boot源码修改好了,可以进行交叉编译构建了,然后运行修改好的u-boot即可。

四、开机logo编译构建本质

u-boot编译构建过程中,实则会编译出一个名为bmp_logo的宿主机上运行的工具:

该工具会将我们的bmp格式的开机logo图片编译成include/bmp_logo.hinclude/bmp_logo_data.h。 在include/bmp_logo.h文件中,声明了两个图片数据数组:

include/bmp_logo_data.h文件中,则定义了这两个数组(数据会根据具体的图片生成,数据很多)。 bmp_logo_palette数组:

bmp_logo_bitmap数组:

 

在实际使用中,可以查看是否生成了bmp_logo工具和include/bmp_logo.h文件,来判断u-boot的开机logo部分是否被编译进u-boot镜像中。

五、运行效果

 

 

标签:video,linux,boot,bmp,VIDEO,LOGO,logo
From: https://www.cnblogs.com/bruce1992/p/17519835.html

相关文章

  • Linux 安装 Maven
    一、概要1.环境(1)RockyLinux9.1(2)Maven3.9.3二、安装1.准备(1)下载安装包wgethttps://dlcdn.apache.org/maven/maven-3/3.9.3/binaries/apache-maven-3.9.3-bin.tar.gz(2)解压tar-zxvfapache-maven-3.9.3-bin.tar.gz2.安装(1)目录a.创建sudom......
  • petalinux SDK编译及使用
    petalinuxSDK编译及使用1、编译#petalinux-build--sdk2、打包#petalinux-package--sysroot注:SDK生成在<plnx-proj>/image/linux/sdk目录3、验证#sourceimages/linux/sdk/environment-setup-aarch64-xilinx-linux#echo$CCaarch64-xilinx-linux-gcc-march=armv8-a+crc......
  • CentOS Linux的最佳替代方案(三)_银河麒麟Kylin Linux Advanced Server V10 SP2 for X86
    CentOSLinux的最佳替代方案(三)_银河麒麟KylinLinuxAdvancedServerV10SP2forX86安装教程1银河麒麟KylinLinuxAdvancedServerV10简介银河麒麟高级服务器操作系统V10是针对企业级关键业务,适应虚拟化、云计算、大数据、工业互联网时代对主机系统可靠性、安全性、性能、扩......
  • Linux安装JDK并配置环境变量
    一、查询已有JAVA环境版本信息java-version二、下载OracleJDK安装包https://www.oracle.com/java/technologies/downloads/archive/四、安装+配置JDK以下方式适用于安装各版本JDK,本文以JDK1.8为例1、创建一个java目录mkdir-p/home/local/java2、进入目录cd/home/loca......
  • Linux总结,第一篇
    GPL、BSD、MIT、Mozilla、Apache和LGPL的区别BSD是“宽容自由软件许可证”中的一员,在软件复用上给予了最小限度的限制。BSD协议允许作者使用该协议下的资源,将其并入私人版本的软件,该软件可使用闭源软件协议发布。MITMIT许可证(TheMITLicense)是许多软件授权条款中,被广泛使用......
  • Debian是一种流行的自由操作系统,它基于Linux内核,采用自由软件的方式进行开发和发布 De
    Debian是一种流行的自由操作系统,它基于Linux内核,采用自由软件的方式进行开发和发布。以下是关于Debian起源和其开发者的信息:Debian的起源:Debian的起源可以追溯到1993年,最初由IanMurdock(IanAshleyMurdock,1970-2015)创建。他希望构建一个自由、开放和稳定的操作系统发行版,以及一......
  • SpringBoot3.0最新深入浅出从入门到项目实战,突出Web应用痛点解决方案
    SpringBoot3.0最新深入浅出从入门到项目实战,突出Web应用痛点解决方案SpringBoot已经成为Java开发中最流行的框架之一,它提供了一种快速构建、易于扩展的方式,使开发人员能够更加专注于业务逻辑而不是繁琐的配置。而最新的SpringBoot3.0版本将进一步改善开发体验,并提供更多的解决方......
  • SpringBoot 如何优雅的进行全局异常处理?
    在SpringBoot的开发中,为了提高程序运行的鲁棒性,我们经常需要对各种程序异常进行处理,但是如果在每个出异常的地方进行单独处理的话,这会引入大量业务不相关的异常处理代码,增加了程序的耦合,同时未来想改变异常的处理逻辑,也变得比较困难。这篇文章带大家了解一下如何优雅的进行全局异......
  • Linux vi/vim介绍和使用方法
    转载地址:https://mp.weixin.qq.com/s?src=11&timestamp=1688196184&ver=4623&signature=7grwe5qwSSbVOMLFHpVKVPbQ*P3bBkBOSecso3*W6NrVlBPyQEs8rNYi6us*saIT8H9WiRcaT0Qg6CEv-B3OUqCJzOfaAC-FpTSeREgreWCxTjI212YAnNkKBLqWCOBS&new=1......
  • Linux学习笔记
    Linux命令ls 查看文件夹下的文件cd 切换路径pwd 查看当前所在的路径位置.. 上层目录mkdir 创建文件夹touch 创建文件且要指定后缀cat 查看文件内容more 查看文件内容(支持翻页[没试过])rm 删除文件 (删除文件夹使用rm-r)cp 复制文件rm 移动文件(移动文件谨慎使......