Linux2.6的LOGO制作与显示

2024-03-31 10:58
文章标签 显示 制作 logo linux2.6

本文主要是介绍Linux2.6的LOGO制作与显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前不久,因为工作需要更换了液晶屏,分辨率由原来的640*480换成了800*600。

当然首先更改了液晶屏驱动,修改了相应的参数。把开机Logo也进行了更换,分辨率修改为800*600。

但是开机时,Logo无法显示,提示以下错误。

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

真是扯淡啊,查看源代码,该提示在drvers/video/console/Fbcon.c下,在此截取这段代码。

static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info,int cols, int rows, int new_cols, int new_rows)
{/* Need to make room for the logo */struct fbcon_ops *ops = info->fbcon_par;int cnt, erase = vc->vc_video_erase_char, step;unsigned short *save = NULL, *r, *q;int logo_height;if (info->flags & FBINFO_MODULE) {logo_shown = FBCON_LOGO_DONTSHOW;return;}/** remove underline attribute from erase character* if black and white framebuffer.*/if (fb_get_color_depth(&info->var, &info->fix) == 1)erase &= ~0x400;logo_height = fb_prepare_logo(info, ops->rotate);//logo_lines在此赋值logo_lines = DIV_ROUND_UP(logo_height, vc->vc_font.height);q = (unsigned short *) (vc->vc_origin +vc->vc_size_row * rows);step = logo_lines * cols;for (r = q - logo_lines * cols; r < q; r++)if (scr_readw(r) != vc->vc_video_erase_char)break;if (r != q && new_rows >= rows + logo_lines) {save = kmalloc(logo_lines * new_cols * 2, GFP_KERNEL);if (save) {int i = cols < new_cols ? cols : new_cols;scr_memsetw(save, erase, logo_lines * new_cols * 2);r = q - step;for (cnt = 0; cnt < logo_lines; cnt++, r += i)scr_memcpyw(save + cnt * new_cols, r, 2 * i);r = q;}}if (r == q) {/* We can scroll screen down */r = q - step - cols;for (cnt = rows - logo_lines; cnt > 0; cnt--) {scr_memcpyw(r + step, r, vc->vc_size_row);r -= cols;}if (!save) {int lines;if (vc->vc_y + logo_lines >= rows)lines = rows - vc->vc_y - 1;elselines = logo_lines;vc->vc_y += lines;vc->vc_pos += lines * vc->vc_size_row;}}scr_memsetw((unsigned short *) vc->vc_origin,erase,vc->vc_size_row * logo_lines);if (CON_IS_VISIBLE(vc) && vc->vc_mode == KD_TEXT) {fbcon_clear_margins(vc, 0);update_screen(vc);}if (save) {q = (unsigned short *) (vc->vc_origin +vc->vc_size_row *rows);scr_memcpyw(q, save, logo_lines * new_cols * 2);vc->vc_y += logo_lines;vc->vc_pos += logo_lines * vc->vc_size_row;kfree(save);}//错误提示在此if (logo_lines > vc->vc_bottom) {logo_shown = FBCON_LOGO_CANSHOW;printk(KERN_INFO"fbcon_init: disable boot-logo (boot-logo bigger than screen).\n");} else if (logo_shown != FBCON_LOGO_DONTSHOW) {logo_shown = FBCON_LOGO_DRAW;vc->vc_top = logo_lines;}
}

可以发现是因为logo_lines > vc->vc_bottom引起的。

其中logo_lines = DIV_ROUND_UP(logo_height, vc->vc_font.height);    //(DIV_ROUND_UP是向上取整的意思)

而vc->vc_bottom代码读下来为vc->vc_bottom  = info->var.yres/ vc->vc_font.height;

其关键就是vc->vc_font.height了,Linux下vc->vc_font.height默认为16,所以当液晶屏和Logo的分辨率都为800*600时,600/16无法整除,故取整logo_lines =38;  vc->vc_bottom = 37;提示错误无法显示。

只要把logo的改小一下,改为592,则logo_lines = 592/16=37;  vc->vc_bottom = 600/16=37;就可以正常显示了。



在移植linux2.6.24到YC2440的过程中,在logo显示部分遇到问题,终于解决,特此记录。

一、首先说明logo显示相关程序。
(1)在driver/video/console/fbcon.c文件中,函数fncon_init(),为虚拟设备结构体VC赋值,并调用本文件中的fbcon_prepare_logo()函数,为显示logo做准备。
(2)fbcon_prepare_logo(),调用了fb_prepare_logo()函数(此函数在driver/video/fbmem.c中)。
(3)fb_prepare_logo()中调用了fb_find_logo()函数(此函数在driver/video/logo/logo.c中),这个函数会根据配置文件找到相应的logo数据,这个数据就是logo文件夹下logo_xxx_xxx.ppm生成的,我的linux就是logo_linux_clut224.ppm。
(4)fb_prepare_logo()函数获取了照片信息后进行一次判断,看图片高度是否超过屏幕高度,否则,不显示。
(5)fbcon_prepare_logo()函数获取图片数据后,又进一步处理判断,用照片的高度除以字模高度后,于屏高度除以字模高度的值相比较,判断图片可否显示。若过大,则打印显示“fbcon_init:disable boot-logo(boot-logo bigger than screen)”。

二、然后,在以上的基础,说明我的问题,我的屏幕是800*600,移植同等大小图片后不显示,且打印fbcon_init:disable boot-logo(boot-logo bigger than screen)。
不明白为什么同样大小的图片不显示??
仔细阅读源码,定位于fbcon_prepare_logo()函数,发现计算屏幕显示所需行数是计算方法为:
logo_lines=(logo_height+vc->vc_font.height-1)/vc->vc_font.height;
而后来与之相比较的vc->vc_bottom=info->var.yres(屏幕高度)/vc_font.height;
不明白这是为什么??这样算法不公平的啊??
于是,更改为:
logo_lines=(logo_height)/vc->vc_font.height;
编译后,800*600图片显示成功!!

其关键就是vc->vc_font.height了,Linux下vc->vc_font.height默认为16,所以当液晶屏和Logo的分辨率都为800*600时,600/16无法整除,故取整logo_lines =38;  vc->vc_bottom = 37;提示错误无法显示。

只要把logo的改小一下,改为592,则logo_lines = 592/16=37;  vc->vc_bottom = 600/16=37;就可以正常显示了。


不知道这样有什么隐患。至少现在没发现……

三、最后,说明图片的制作,这个网上一堆资料……哈哈!

首先准备一幅自己喜欢的图片,然后将该图片保存成png格式,例如linuxlogo.png。在Linux下使用下面的命令: 
# pngtopnm linuxlogo.png > linuxlogo.pnm 
# pnmquant 224 linuxlogo.pnm > linuxlogo224.pnm 
# pnmtoplainpnm linuxlogo224.pnm > linuxlogo224.ppm 
mv linuxlogo224.ppm logo_linux_clut224.ppm
然后将logo_linux_clut224.ppm替换$WORKSPACE/linux-2.6.8.1/drivers/video/logo文件夹中的logo_linux_clut224.ppm(最好做好备份)

好,结束!O(∩_∩)O哈哈~!


这篇关于Linux2.6的LOGO制作与显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/864166

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t

小程序button控件上下边框的显示和隐藏

问题 想使用button自带的loading图标功能,但又不需要button显示边框线 button控件有一条淡灰色的边框,在控件上了样式 border:none; 无法让button边框隐藏 代码如下: <button class="btn">.btn{border:none; /*一般使用这个就是可以去掉边框了*/} 解决方案 发现button控件有一个伪元素(::after

MFC中Spin Control控件使用,同时数据在Edit Control中显示

实现mfc spin control 上下滚动,只需捕捉spin control 的 UDN_DELTAPOD 消息,如下:  OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) {  LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);  // TODO: 在此添加控件通知处理程序代码    if

OpenStack离线Train版安装系列—0制作yum源

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack镜像制作系列5—Linux镜像

本系列文章主要对如何制作OpenStack镜像的过程进行描述记录 CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1—环境准备 OpenStack镜像制作系列2—Windows7镜像 OpenStack镜像制作系列3—Windows10镜像 OpenStack镜像制作系列4—Windows Server2019镜像 OpenStack镜像制作