应用层更换Linux机器开机启动LOGO

平台开机Logo默认是编译进内核的,更换起来很不方便,通过改写内核源码,可以实现应用层直接更换内核Logo。

1.uboot相关修改

网上教程一般会这么改

"loadlogo=mmc read 0x15000000 0x5800 0x2800;\0" \
"run loadlogo; " \

核心代码是mmc read 0x15000000 0x5800 0x2800;这个命令的作用是从MMC或SD卡的第22528(0x5800)个扇区开始,读取10240(0x2800)个扇区的数据,并将这些数据存储到内存地址0x15000000处。这种操作通常用于将存储设备上的数据加载到内存中,以便进行进一步的处理或执行。目的是将图片文件放到0x15000000处,用于后面logo.c文件中使用

但经过实践发现,这么改会存在"run loadlogo; "未执行的情况,从而导致LOGO更换不上。

故选择将最后一段改成:"else run netboot; fi; mmc read 0x15000000 0x5800 0x2800;" 解决。(可能还需要手动进uboot命令行,将bootcmd重置成默认)

2.kernel内核文件修改

修改drivers/video/logo/Kconfig文件

在最后新加一个LOGO_LINUX_CUSTOM_CLUT224的配置选项:

/* 在如下配置 */
config LOGO_LINUX_CUSTOM_CLUT224
bool "Custom 224-color linux logo"
default y
endif # LOGO

修改drivers/video/logo/logo.c文件

到这一步可以有两种修改办法,这取决于后续LOGO图片是怎么处理的

首先在头部增加如下代码

/* logo's are marked __initdata. Use __init_refok to tell
* modpost that it is intended that this function uses data
* marked __initdata.
*/ #ifdef CONFIG_LOGO_LINUX_CUSTOM_CLUT224 //新增
#define IMAGE_HEAD_SIZE 54
#define IMAGE_MAX_PIXEL 2048000
#define IMAGE_MAX_SIZE (IMAGE_HEAD_SIZE+IMAGE_MAX_PIXEL+1024)
#define COLOR_MAX_NUM 224 /* linux logo just support 224 colors */
#define IMAGE_MTD_NUM 4 /* the logo saved in MTD4 */
#define IMAGE_OFFSET 0x0 /* the logo's offset int the mtd area */
volatile static unsigned char* remapped_area;
static unsigned char logo_flash_clut224_data[IMAGE_MAX_PIXEL] __initdata = {0};
static unsigned char logo_flash_clut224_clut[COLOR_MAX_NUM * 3] __initdata = {0};
static struct linux_logo logo_flash_clut224 __initdata =
{
.type = LINUX_LOGO_CLUT224,
.width = 0,
.height = 0,
.clutsize = 0,
.clut = logo_flash_clut224_clut,
.data = logo_flash_clut224_data,
};
#endif const struct linux_logo * __init_refok fb_find_logo(int depth)
{
const struct linux_logo *logo = NULL; if (nologo)...

后续分成:LINUX上处理图片WINDOWS上处理图片

如果图片在Linux上处理,在if (depth >= 8)做如下修改:

if (depth >= 8)
{
#ifdef CONFIG_LOGO_LINUX_CUSTOM_CLUT224
unsigned char head[60] = {0};
unsigned char *image = NULL;
unsigned char *clut = NULL;
unsigned char *data = NULL; int clutsize = 0;
int size = 0;
int offset = 0;
int width = 0;
int height = 0;
int count = 0;
int compress = 0;
int sizeimage = 0;
int clrused = 0; int i = 0;
int j = 0;
int fi = 0;
int li = 0; unsigned int real_width = 0;
unsigned int logo_index = 0; remapped_area = __phys_to_virt(0x15000000);
memcpy(head, remapped_area, 58);
printk("image head:%c%c\n", head[0], head[1]); if(head[0] == 'K' && head[1] == 'I'&& head[2] == 'K')
{
printk("right ppm image head");
memcpy( &logo_flash_clut224.width, remapped_area+3, 4);
memcpy( &logo_flash_clut224.height, remapped_area + 4+3, 4);
memcpy( &logo_flash_clut224.clutsize, remapped_area + 8+3, 4);
memcpy( logo_flash_clut224.data, remapped_area + 15, logo_flash_clut224.width * logo_flash_clut224.height);
memcpy( logo_flash_clut224.clut, remapped_area + 15 + (logo_flash_clut224.width * logo_flash_clut224.height), logo_flash_clut224.clutsize * 3);
logo=&logo_flash_clut224;
}
else
{
#ifdef CONFIG_LOGO_LINUX_CLUT224
printk("LINUX_clut224\n");
logo = &logo_linux_clut224;
#endif
}
#endif

如果选择在Windows上处理LOGO图片,代码改成

#ifdef CONFIG_LOGO_LINUX_CUSTOM_CLUT224
unsigned char head[60] = {0};
unsigned char *image = NULL;
unsigned char *clut = NULL;
unsigned char *data = NULL; int clutsize = 0;
int size = 0;
int offset = 0;
int width = 0;
int height = 0;
int count = 0;
int compress = 0;
int sizeimage = 0;
int clrused = 0; int i = 0;
int j = 0;
int fi = 0;
int li = 0; unsigned int real_width = 0;
unsigned int logo_index = 0; remapped_area = __phys_to_virt(0x15000000);
memcpy(head, remapped_area, 58);
printk(" %s-%d:right image head:%c%c\n", __FILE__, __LINE__, head[0], head[1]); if(1)
{
printk("right ppm image head");
memcpy( &logo_flash_clut224.width, remapped_area+4, 4);
memcpy( &logo_flash_clut224.height, remapped_area + 8, 4);
memcpy( &logo_flash_clut224.clutsize, remapped_area + 12, 4);
memcpy( logo_flash_clut224.data, remapped_area + 16, logo_flash_clut224.width * logo_flash_clut224.height);
memcpy( logo_flash_clut224.clut, remapped_area + 16 + (logo_flash_clut224.width * logo_flash_clut224.height), logo_flash_clut224.clutsize * 3);
logo=&logo_flash_clut224;
}
else
{
#ifdef CONFIG_LOGO_LINUX_CLUT224
printk("LINUX_clut224\n");
logo = &logo_linux_clut224;
#endif
}
#endif

没错,就是因为后续图片格式会有所不一样,读取图片信息的方式也不同。

之后在然后重新编译内核。配置内核时,需要去掉logo路径下的其它选项,只保留Custom 224-color linux logo这一个选项。

3.LOGO图片修改

因为Logo图片中所使用的颜色数不能超过224种,如果超过将无法正常显示,因此我们需要制作符合要求的图像。

Linux环境下制作:

先下载附件res



Windows环境下制作:方法是我自己寻找制作的,因为有这种需求,安装包放在云盘中

链接:https://pan.baidu.com/s/1Yn7BtTh4GtVqoS-cc2nU8Q?pwd=1234

提取码:1234

按照文件中readme.txt一步步执行即可

两者都是为了把图片制作成mylogo.bin提供给logo.c解读,使LOGO修改生效

你用哪种方式,上述logo.c就改成哪种就行。

4.去除linux的开机光标

光标会导致LOGO图片显示时,左上角有黑块,方法如下:

在内核的当前目录进入到drivers/video/console/fbcon.c文件

将static void fb_flashcursor(void *private) 和 static void fbcon_cursor(struct vc_data *vc, int mode) 里的内容注释掉,使之变成空函数

我的建议是在这两个函数开头直接return;就行

参考连接:

如何修改 ARM Linux 系统的启动画面

去除linux的开机光标

应用层更换内核启动logo

Linux开机LOGO更换以及附带问题的更多相关文章

  1. Linux 开机 logo 修改

    从内核被解压到文件系统被挂载,我们看到的经典画面是一个小企鹅.如果嫌小企鹅枯燥,我们可以把它换掉. 1. 准备图片 这里需要的是 ppm 图片,所以,我们需要把常见格式给转换为 .ppm 才能使用.c ...

  2. 八、启动linux内核并修改开机logo

    1. 编译并烧写linux内核 1)先准备好内核源码包urbetter-linux2.6.28-v1.0.tgz,输入命令:tar -zxvf urbetter-linux2.6.28-v1.0.tg ...

  3. linux内核开机logo显示调试

    要使内核支持开机logo显示需要配置内核 配置如下: make menuconfig: Device Drivers  --->     Graphics support  --->    ...

  4. 小白自制Linux开发板 九. 修改开机Logo

    许久不见啊,今天我们继续来修改我们的系统. 通过前面的几篇文章我们已经能轻松驾驭我们的开发板了,但是现在都是追求个性化的时代,我们在开发板上打上了自己的Logo,那我们是否可以改变开机启动的Logo呢 ...

  5. Android5.1开机LOGO与开机动画【转】

    本文转载自:http://blog.csdn.net/u014770862/article/details/52624627 android5.1中,开机LOGO部分和之前版本的并不相同,主要区别在于 ...

  6. 全网络最正确的让 Linux 开机进入字符界面的方法及设置 FrameBuffer 分辨率的方法

    引言 这个标题有点长,是为了在标题中就把问题说清楚,以便搜索引擎能够把有需要的朋友准确地带到我这里来.目前在网络上,很多关于 Linux 方面的知识是过时的和错误的.我标题中指出的两个知识点就是其中的 ...

  7. 因为强行关机, 而导致的fedora23 不能重新启动, 卡在开机logo那里的 修复 解决方案

    其实, fedora23的U盘live 也很好用, 很流畅, 主要还是 要用一个比较好的/快的 U盘. 这样live U盘在4GB(3.75GiB)的内存中还是较快的 原来的U盘live系统用得很卡, ...

  8. 开机logo以及两种修改开机动画方法

    Android开机画面总共有三屏 一.第一屏:开机logo 1.选张png格式的图片,在Linux任意下执行(安装工具): sudo apt-get install pnmtoplainpm 2.在所 ...

  9. 安卓开机logo和开机动画的几种实现方法

    安卓4.2可用方法2-4,第一种方法未验证. 从理论上来说,android 有4个开机启动画面. 第一个应该是U-BOOT的启动画面,有些设备为了满足按动电源即有显示,在UBOOT里加了开机画面,实现 ...

  10. 安卓修改开机logo和开机动画的方法

    第一种和第二种方法亲测可用,安卓版本是4.2和安卓5.1均可.第二种方法待验证 以下三种方法 Android 开机其实总共会出现3个画面: 1.第一个就是 linux 系统启动,出现Linux小企鹅画 ...

随机推荐

  1. css超出部分...显示

    首先需要设置宽 white-space: nowrap;// 文字不换行 overflow: hidden;// 超出隐藏 text-overflow: ellipsis;   实现移入后正常显示的可 ...

  2. AI五子棋_01 Python的网络通信

    AI五子棋 第一步 第一步 服务器是交战的战场,我们的AI大脑想要参战,先得找到去战场的路. 任务 1 写程序从以下网址取得下一步的指示 http://2**.2**.**.1**:9012/step ...

  3. cmd杀死占用端口号的Java进程

    下面列出两种杀死进程的方法: 1.根据jps查询.2.根据端口号查询进程. 最后根据进程id杀死进程(注意:进程id不等同于端口号) 根据jps查进程 jps命令,列出Java进程列表 根据进程id杀 ...

  4. Python实现微博舆情分析的设计与实现

    引言 随着互联网的发展,社交媒体平台如微博已经成为公众表达意见.分享信息的重要渠道.微博舆情分析旨在通过大数据技术和自然语言处理技术,对微博上的海量信息进行情感分析.热点挖掘和趋势预测,为政府.企业和 ...

  5. dorado动态修改数据验证

    view.get("#userDS.dataType").getPropertyDef("unitType").set("required" ...

  6. 使用NodeJS 搭建 Vue + TypeScipt 快速构建工具

    使用 NodeJS 搭建 Vue + TypeScipt 快速构建工具 前言: 为保证使用 Typescript 开发 Vue 的规范性和开发效率,添加组件.页面.路由.store 的时候尽量使用工具 ...

  7. .net 在线客服系统,到底能不能处理 50万 级消息量,系统架构实践

    业余时间用 .net core 写了一个在线客服系统.我把这款业余时间写的小系统丢在网上,陆续有人找我要私有化版本,我都给了,毕竟软件业的初衷就是免费和分享. 后来我索性就发了一个100%私有化版直接 ...

  8. 全网最适合入门的面向对象编程教程:59 Python并行与并发-并行与并发和线程与进程

    全网最适合入门的面向对象编程教程:59 Python 并行与并发-并行与并发和线程与进程 摘要: 在 Python 中,"并行"(parallelism)与"并发&quo ...

  9. Socket Tcp高密集信息广播转发强度测试

    在有些场中存在着大量的消息广播转发,为了了解.net socket tcp在这方面的性能表现,所以做了一个比较极端信息广播转发强度测试.测试场景是以400个连接信息相互广播为测试用例就是当其中一个连接 ...

  10. golang不同版本特性

    Go 1.0[1]  - 2012 年 3 月: 随着 Go 第一个版本发布的还有一份兼容性说明文档[2] .该文档承诺,Go 的未来版本会尽可能确保向后兼容性,不会破坏现有程序. For insta ...