许久不见啊,今天我们继续来修改我们的系统。

通过前面的几篇文章我们已经能轻松驾驭我们的开发板了,但是现在都是追求个性化的时代,我们在开发板上打上了自己的Logo,那我们是否可以改变开机启动的Logo呢,那就开始吧

本篇参考了

【正点原子】I.MX6U 修改开机进度条及内核logo参考手册V1.0

1. 显示Linux内核Logo

我们知道Linux内核是默认带启动Logo的,对就是那个小企鹅,关注过我在哇酷网站同步更新的帖子( https://whycan.com/t_7275.html) 的同学应该知道,

这个Logo文件在哪呢?就在下面的路径中(因为我已经使用了新的Logo所以,请忽略复件二字),而且大家发现没有,这个logo的扩展名是*.ppm

那么这应该如何显示呢,我们需要在

make menuconfig

中进行配置


Device Drivers  --->
    Graphics support  --->
       [*] Bootup logo  --->
            ........
           [*] Standard 224-color Linux logo

然后重新编译内核,不出意外就可以看到对应的Logo文件了,如果不显示,可以通过工程清理命令 make clean  清理一下内核代码,然后重新编译。

2.制作Logo文件

小企鹅已经显示,但是明显还不够个性呀,怎么办?当然是自己制作啊,但是我们通过常规软件只能做出*.jpg、*.png之类的图片,但是那里面的logo是*.ppm,直接手动改扩展名肯定是不对的,那就要借助一个特殊的图片转换工具netpdm

安装netpdm:

sudo apt-get install netpbm

这个工具可以把png图片转换为ppm格式,使用方式如下

pngtopnm logo-linux.png > logo-linux.pnm                  #将png图片转成pnm
pnmquant 224 logo-linux.pnm > logo-linux224.pnm #将pnm图片的颜色数限制在224色
pnmtoplainpnm logo-linux224.pnm > logo_linux_clut224.ppm #将pnm图片转换成我们需要的ppm

这里需要注意一下logo-linux.png 尺寸一定要小于和等于当前屏幕的尺寸,我们这里的logo大小是240*135 ,也就是那个tft屏幕的大小。否则会报错(其实等于也就是全屏显示有的时候也会报错,但是我们后续会处理)

得到ppm图片以后,我们就可以当前logo复制到前面提到的Linux内核存放logo的文件夹下,注意如果以后需要那个小企鹅,就需要备份一下,然后粘贴我们自制的logo,替换原有的logo。

3.修改代码

替换logo以后,如果直接编译内核文件,大概率不会显示Logo文件,并且会在启动日志中显示如下报错信息

fbcon_init:disable boot-logo(boot-logo bigger than screen)。

我们制作的图片大小和屏幕是一致的呀,为啥会报错呢,先来分析报错出处,在/linux-5.7.1/drivers/video/fbdev/core/fbcon.c 文件的fbcon_prepare_logo()函数中。

发现计算屏幕显示所需行数是计算方法为:
logo_lines = DIV_ROUND_UP(logo_height, vc->vc_font.height);
通过日志输出,logo_lines 为 17 ,DIV_ROUND_UP() 为向上取整。
而vc->vc_bottom 计算方法如下:
vc->vc_bottom=info->var.yres(屏幕高度)/vc_font.height;

vc->vc_bottom输出为 16

不明白为什么会这样计算,然后通过下面比较

这样自然就会加载失败。过多的原理不想去深究,那我们怎么改呢,简单,我们改一下Logo_lines的计算方式:

logo_lines = DIV_ROUND_UP(logo_height, (vc->vc_font.height+1));

对,你没看错就是在DIV_ROUND_UP() 函数第二个参数加了个1  ,然而我在这里吧啦吧啦了半天

4. 展示

最后到喜闻乐见的展示环节了

我们可以看到启动Logo是显示了,但是下面有一行是被加载日志给覆盖了,这个怎么处理呢,墨云暂时还没有办法,后续如果有进展,会在第一时间更新,这里还请大佬们指点一下。

5. 修改u-boot中的Model字段

我们来改一个与本节关系不大,而且不易发觉的地方,那就是u-boot中的Model 字段,毕竟我们要武装到牙齿嘛。

这个其实只需要修改u-boot项目中的arch/arm/dts/suniv-f1c100s-licheepi-nano.dts 设备树文件就行,是的u-boot中也有对应的设备树文件。

修改根节点下面的model字段,编译u-boot,重新烧写到tf卡,如果不清楚怎么操作,可以去看第二篇。


好了,又水完了一篇

小白自制Linux开发板 九. 修改开机Logo的更多相关文章

  1. 小白自制Linux开发板 二. u-boot移植

    上一篇:小白自制Linux开发板 一. 瞎抄原理图与乱画PCB  中我们做了一个小型而没用的开发板,用的是Licheepi Nano的镜像,那从本篇开始我们开始自己构建它的灵魂吧. 我们都知道,PC在 ...

  2. 小白自制Linux开发板 三. Linux内核与文件系统移植

    上一篇完成了uboot的移植,但是想要愉快的在开发板上玩耍还需要移植Linux内核和文件系统. 1.Linux内核 事实上对于F1C100S/F1C200S,Linux官方源码已经对licheepi ...

  3. 小白自制Linux开发板 六. SPI TFT屏幕修改与移植

    本文章参考:https://www.bilibili.com/read/cv9947785?spm_id_from=333.999.0.0 本篇通过SPI接口,使用ST7789V TFT焊接屏(13p ...

  4. 小白自制Linux开发板 八. Linux音频驱动配置

    不知不觉小白自制开发板系列已经到第八篇了,本篇要配置的是音频驱动,也算是硬件部分的最后一片了,积攒的文章也差不多全放完了,后续更新可能会放缓,还请见谅. 对于F1C200s是自带了多媒体处理功能的,所 ...

  5. 小白自制Linux开发板 四. 通过SPI使用ESP8266做无线网卡

    本文章基于 WhyCan Forum(哇酷开发者社区) https://whycan.com/t_4149.htmlhttps://whycan.com/t_5870.html整理而成. 为了尊重原作 ...

  6. 小白自制Linux开发板 一. 瞎抄原理图与乱画PCB

    因为墨云是基于高中物理水平的电路知识来学习.而且此前也就玩过树莓派.Esp8266之类的开发板,水平基础趋近于零,所以在写这个系列的时候抱着记录的心态.还望不足之处还望大佬们指正. <论语> ...

  7. 小白自制Linux开发板 七. USB驱动配置

    本文章基于https://whycan.com/t_3087.htmlhttps://whycan.com/t_6021.html整理 F1c100s芯片支持USB的OTG模式,也就是可以通过更改Us ...

  8. 小白自制Linux开发板 十. NES游戏玩起来

    本篇基于我们制作的Debian文件系统而展开,而且我们这会玩一些高级的操作方式--用我们的小电脑进行程序编译.   所以本篇操作全部都在我们个的开发板上完成.   1. 开发环境搭建 首先安装gcc, ...

  9. 小白自制Linux开发板(第二季 V3s篇) 一. 换个核心再来一次

    1.前言 大家心心念念(个人认为)的小白自制开发板全新系列正式来了,之前我们使用全志的F1C200s芯片制作了一个小电脑,众所周知,调试很艰难,坑也很多,以至于墨云到现在还是没找到对应的补救方案,为了 ...

随机推荐

  1. go相关

    mac 上build go  如果想要在centos上面执行 必须使用下面的方式 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o hello ...

  2. TP5更新数据成功,但判断结果不符

    thinkphp的CURD中,使用save方法时会出现一个奇怪的问题,即如果数据没有更新(与原数据相同),返回值判断为false.其实很久之前就发现了这个问题,一度以为是官方代码的问题,但是一直拖延到 ...

  3. httpd进程数统计,IP封禁,IP连接数量情况查看

    ps -ef|grep httpd|wc -l 统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器. 查看Apache的并发请求数及其TCP连接状态:netstat -n | aw ...

  4. nginx使用用户真实IP做hash(解决经过CND后ip_hash失效问题)

    在nginx中常用的有以下四种负载均衡的算法,分别是:round-robin.ip-hash.least-connected和weighted.当然在实际生产中或许使用最多的就是ip-hash了,一般 ...

  5. Java基础系列(18)- if选择结构

    if单选择结构 我们很多时候需要去判断一个东西是否可行,然后我们才去执行,这样一个过程在程序中用if语句来表示 语法 if (布尔表达式){ //如果布尔表达式为True将执行的语句 } packag ...

  6. Nginx系列(5)- nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)

    启动Windows版本的Nginx时候,cmd报错,报错信息为[emerg] 4276#4280: bind() to 0.0.0.0:80 failed(10013: An attempt was ...

  7. Docker系列(8)- 常用其他命令(1) | 日志、元数据、进程的查看

    后台启动容器 # 命令 docker run -d 镜像名 [root@localhost ~]# docker run -d centos #问题:docker ps,发现centos停止了 #常见 ...

  8. Shell系列(21)- 字符截取命令printf

    作用 printf是标准格式输出命令,控制输出格式,不会自动加入换行符.awk会用到该条命令 命令 printf '输出类型输出格式' 输出内容 #''双引号不能少,输出类型和输出格式之间没有空格 输 ...

  9. 如何快速下载ubuntu镜像

    使用国内镜像地址下载: 中科大http://mirrors.ustc.edu.cn/ubuntu-releases/ 阿里云开源镜像站http://mirrors.aliyun.com/ubuntu- ...

  10. 自己写登陆验证及借用auth的is_authenticated验证是否登陆

    一. 自己写登陆需要注册,一个session的处理,还有一个session的删除 #自定义一个闭包装饰器,来验证def checkLogin(func): def wrapper(request, * ...