kernel下制作动态logo
kernel下制作动态logo
在uboot中实现logo的好处是反映速度快。
在kernel中实现logo的好处是,不管是android还是什么其他平台,logo显示无需考虑上层平台。
参照三星平台的写法,logo的显示一方面是开机时产品的标志,另一方面也是lcd驱动执行后显示屏工作正常的标志。
所以logo的显示自然就藏于lcd驱动代码当中。
static int __devinit s3cfb_probe(struct platform_device *pdev)
{
struct s3cfb_global *fbdev;
fbdev = kzalloc(sizeof(struct s3cfb_global), GFP_KERNEL);
---------------------------------------------------------------
pdata = to_fb_plat(&pdev->dev);
if (!pdata) {
dev_err(fbdev->dev, "failed to get platform data\n");
ret = -EINVAL;
goto err_pdata;
}
if (pdata->cfg_gpio)
pdata->cfg_gpio(pdev);
if (pdata->clk_on)
pdata->clk_on(pdev, &fbdev->clock);
---------------------------------------------------------------
s3cfb_set_gamma(fbdev);
s3cfb_set_vsync_interrupt(fbdev, 1);
s3cfb_set_global_interrupt(fbdev, 1);
s3cfb_init_global(fbdev);
---------------------------------------------------------------
if (s3cfb_alloc_framebuffer(fbdev)) {
ret = -ENOMEM;
goto err_alloc;
}
if (s3cfb_register_framebuffer(fbdev)) {
ret = -EINVAL;
goto err_register;
}
---------------------------------------------------------------
if (pdata->backlight_on)
pdata->backlight_on(pdev);
if (!bootloaderfb && pdata->reset_lcd)
pdata->reset_lcd(pdev);
if (pdata->lcd_on)
pdata->lcd_on(pdev);
---------------------------------------------------------------
if (fb_prepare_logo( fbdev->fb[pdata->default_win], FB_ROTATE_UR)) {
printk("Start display and show logo\n");
fb_set_cmap(&fbdev->fb[pdata->default_win]->cmap, fbdev->fb[pdata->default_win]);
fb_show_logo(fbdev->fb[pdata->default_win], FB_ROTATE_UR);
}
---------------------------------------------------------------
}
《如何显示logo》
int fb_show_logo(struct fb_info *info, int rotate)
{
int y;
y = fb_show_logo_line(info, rotate, fb_logo.logo, 0, num_online_cpus());
y = fb_show_extra_logos(info, y, rotate);
return y;
}
static int fb_show_logo_line(struct fb_info *info, int rotate,
const struct linux_logo *logo, int y,
unsigned int n)
{
fb_do_show_logo(info, &image, rotate, n);//
}
static void fb_do_show_logo(struct fb_info *info, struct fb_image *image,
int rotate, unsigned int num)
{
unsigned int x;
if (rotate == FB_ROTATE_UR) {
for (x = 0;
x < num && image->dx + image->width <= info->var.xres;
x++) {
image->dx = ((info->var.xres - num*(image->width))>>1);
image->dy = ((info->var.yres - num*(image->height))>>1);
info->fbops->fb_imageblit(info, image);//-->
image->dx += image->width;
}
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在s3cfb_init_fbinfo中:
fb->fbops = &s3cfb_ops;
挂在struct fb_info上。
struct fb_ops s3cfb_ops = {
.owner = THIS_MODULE,
.fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea,
.fb_imageblit = cfb_imageblit,
.fb_check_var = s3cfb_check_var,
.fb_set_par = s3cfb_set_par,
.fb_blank = s3cfb_blank,
.fb_pan_display = s3cfb_pan_display,
.fb_setcolreg = s3cfb_setcolreg,
.fb_ioctl = s3cfb_ioctl,
.fb_open = s3cfb_open,
.fb_release = s3cfb_release,
};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void cfb_imageblit(struct fb_info *p, const struct fb_image *image)
{
。。。 。。。
if (image->depth == 1) {
} else
color_imageblit(image, p, dst1, start_index, pitch_index);//-->
}
具体画logo之处:
static inline void color_imageblit(const struct fb_image *image,
struct fb_info *p, u8 __iomem *dst1,
u32 start_index,
u32 pitch_index)
{
u32 __iomem *dst, *dst2;
u32 color = 0, val, shift;
int i, n, bpp = p->var.bits_per_pixel;
u32 null_bits = 32 - bpp;
u32 *palette = (u32 *) p->pseudo_palette;
const u8 *src = image->data;
u32 bswapmask = fb_compute_bswapmask(p);
dst2 = (u32 __iomem *) dst1;
for (i = image->height; i--; ) {//画行
n = image->width;
dst = (u32 __iomem *) dst1;
shift = 0;
val = 0;
if (start_index) {
u32 start_mask = ~fb_shifted_pixels_mask_u32(p,
start_index, bswapmask);
val = FB_READL(dst) & start_mask;
shift = start_index;
}
while (n--) {
if (p->fix.visual == FB_VISUAL_TRUECOLOR ||
p->fix.visual == FB_VISUAL_DIRECTCOLOR )
color = palette[*src];
else
color = *src;
color <<= FB_LEFT_POS(p, bpp);
val |= FB_SHIFT_HIGH(p, color, shift ^ bswapmask);
if (shift >= null_bits) {
FB_WRITEL(val, dst++);
val = (shift == null_bits) ? 0 :
FB_SHIFT_LOW(p, color, 32 - shift);
}
shift += bpp;
shift &= (32 - 1);
src++;
}
if (shift) {
u32 end_mask = fb_shifted_pixels_mask_u32(p, shift,
bswapmask);
FB_WRITEL((FB_READL(dst) & end_mask) | val, dst);
}
dst1 += p->fix.line_length;
if (pitch_index) {
dst2 += p->fix.line_length;
dst1 = (u8 __iomem *)((long __force)dst2 & ~(sizeof(u32) - 1));
start_index += pitch_index;
start_index &= 32 - 1;
}
}
}
代码分析在此不做详述,看参见网络各路分析。
要制作动态logo,无非是一帧一帧的画企鹅。先看这段代码:
if (fb_prepare_logo( fbdev->fb[pdata->default_win], FB_ROTATE_UR)) {
printk("Start display and show logo\n");
fb_set_cmap(&fbdev->fb[pdata->default_win]->cmap, fbdev->fb[pdata->default_win]);
fb_show_logo(fbdev->fb[pdata->default_win], FB_ROTATE_UR);
}
其实我们无需关注函数的细节,从函数的名字上看fb_prepare_logo准备好了一个结构体,该结构体代表了一只企鹅(.ppm图片)。
如果我要画一群不同的企鹅在屏幕上移动,那么就需要一群代表不同ppm的结构体,但内核默认情况下这样的结构体只有一个。怎么办?
以“对内核代码尽量少改动”的原则下,以上这段代码显示一帧,然后加个循环,不断显示不同的帧:
for (i = 0; i < x; i++)
{
}
即:循环一次,采集一张图,并填充这个唯一的结构体struct linux_logo,然后显示。
问题来了,fb_find_logo(int depth)只能找到固定的一只企鹅,但在我们面前的一群企鹅,难道给fb_find_logo多加个参数?
以“对内核代码尽量少改动”的原则下,我们发现,depth是32位,即使夸张的说,但其充其量也就用个16位,其他位不用简直是浪费啊浪费,然后,高8位可以用于企鹅编号,使fb_find_logo拥有识别不同企鹅的能力。然后,就可以达到不同的企鹅在屏幕移动的效果。

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
制作ppm文件
在2.6内核中修改开机LOGO
方法一:
1、在Linux系统中安装所需的包netpbm。我用的Fedora 10,刚开始安装命令是yum install netpbm,安装完成后,发现系统中还是没有相关的命令。
看来是相关的包没有安装完整,又使用命令yum install netpbm*,又安装了两个包
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
netpbm-devel i386 10.47.04-1.fc10 updates 96 k
netpbm-progs i386 10.47.04-1.fc10 updates 1.9 M
再看,发现相关的命令就有了
[root@localhost developer]# png
pngcomp pngcrush pngnq pngtopam pngtopnm
2、logo图片改成.ppm格式。首先你要有个和自己屏幕分辨率一样或者小于屏幕分辨率的图片,如linux_iunin_logo.png
①将png图片转成pnm
pngtopnm linux_iunin_logo.png > linux_iunin_logo.pnm
②将pnm图片的颜色数限制在224色
pnmquant 224 linux_iunin_logo.pnm > logo_iunin_clut224.pnm
③将pnm图片转换成我们需要的ppm
pnmtoplainpnm logo_iunin_clut224.pnm > logo_iunin_clut224.ppm
也可以使用软件,比如友善之臂的loglmaker,可以直接把图片转换成.ppm格式的。
方法二:
用RedHat9自带的图片编辑工具GIMP。
找一个任意格式的图片(JPG,BMP之类的),在图形界面中,右键单击这个图片,选“打开方式->The GIMP”,第一次打开需要安装GIMP软件,安装完后自动运行GIMP,这是一个很强大的图像处理工具,可称为Linux下的photoshop。
右键单击窗口中的图片选“图像->模式->索引”,把颜色数改为:224(这步很重要)。其他的都默认,OK后右键“文件->Save As”,保存为ppm格式的文件,确定后弹出一个对话框,选择Ascii,OK后,GIMP会把图片转换成ppm格式,把这个文件复制到logo文件夹中就可以
kernel下制作动态logo的更多相关文章
- 如何使用会声会影制作动态logo字幕
日常生活中大家在参加一些婚礼.聚会的时候,LED屏幕上播放的视频里面常常会有一行字,它随着视频的播放自己也在不断地改变颜色,非常醒目.想必大家也想把这种动态文字用在自己的视频中,为视频增添亮点.那么今 ...
- 制作动态logo教程
本人从事iOS开发工作,但对特效制作很感兴趣,现提供一份教程,制作本人logo的教程. 上图是用 Photoshop 与 After Effects 与 GIF Movie Gear 合力制作的动态图 ...
- 关于VS2013下制作和使用静态库和动态库
关于VS2013下制作和使用静态库和动态库 引言 什么是库:库是写好的现有的,成熟的,可以复用的代码. 所谓静态.动态是指链接.将一个程序编译成可执行程序的步骤: 静态库在链接阶段,会将汇编生成的目标 ...
- Linux下制作静态库 & 动态库
静态库 1.将.c生成.o文件 gcc-cadd.c-o add.o 2.使用ar工具制作静态库 ar rcs lib库名.a add.o sub.o div.o 3.编译静态库到可执行文件中 gcc ...
- Linux下制作和使用静态库和动态库
概述 Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库.linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib. 静态函数库: 这类库的名字一般是libxxx. ...
- 编译linux kernel及制作initrd ( by quqi99 )
编译linux kernel及制作initrd ( by quqi99 ) 作者:张华 发表于:2013-01-27 ( http://blog.csdn.net/quqi99 ) 运行一个l ...
- Xcode 6制作动态及静态Framework
技术交流新QQ群:414971585 有没有写SDK或者要将一些常用的工具类做成Framework的经历? 你或许自己写脚本完成了这项工作,相信也有很多的人使用 iOS-Universal-Frame ...
- Xcode 6制作动态及静态Framework和各种坑
Xcode 6制作动态及静态Framework http://www.cocoachina.com/ios/20141126/10322.html 有没有写SDK或者要将一些常用的工具类做成Frame ...
- 【转】Xcode 6制作动态及静态Framework
http://years.im/Home/Article/detail/id/52.html 创建iOS动态库 新建工程并选择默认Target为Cocoa Touch Framework, 如图: 做 ...
随机推荐
- 在调用boostrap的model时获取到是哪个html元素调用
调用的html代码: <a class="bk-round bk-border-info bk-border-darken bk-bg-lighten bk-border-3x bk- ...
- PyCharm 的初始设置2 - 打开、新建项目
03. 新建/打开一个 Python 项目 3.1 项目简介 开发 项目 就是开发一个 专门解决一个复杂业务功能的软件 通常每 一个项目 就具有一个 独立专属的目录,用于保存 所有和项目相关的文件 – ...
- HorizontalScrollView水平滚动控件
HorizontalScrollView水平滚动控件 一.简介 用法ScrollView大致相同 二.方法 1)HorizontalScrollView水平滚动控件使用方法 1.在layout布局文件 ...
- HDU 1052 贪心+dp
http://acm.hdu.edu.cn/showproblem.php?pid=1052 Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS ...
- Spring使用proxool连接池 管理数据源
一.Proxool连接池简介及其配置属性概述 Proxool是一种Java数据库连接池技术.是sourceforge下的一个开源项目,这个项目提供一个健壮.易用的连接池,最为关键的是这个连接池提供监控 ...
- 分布式_理论_04_ 3PC
一.前言 五.参考资料 1.分布式理论(四)—— 一致性协议之 3PC 2.分布式理论(四) - 3PC协议 3.
- LeetCode OJ:Kth Smallest Element in a BST(二叉树中第k个最小的元素)
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...
- ZOJ - 3201 Tree of Tree (树形背包)
题意:有一棵树,树上每个结点都有一个权值,求恰好包含k个结点的子树的最大权值. 设dp[i][j]为以结点i为根的树中包含j个结点的子树的最大权值,则可以把这个结点下的每棵子树中所包含的所有子树的大小 ...
- VS软件版本号定义、规则和相关的Visual Studio插件
http://blog.csdn.net/cnhk1225/article/details/37500593 软件版本号主要标识了软件的版本,通过其可以了解软件.类库文件的当前版本,使得软件版本控制有 ...
- 横向排列两个多个div盒子的方法(CSS浮动清除float-clear/inline)/办法
最近在做一个div css切割,昨晚发现了长期以来一直无记录下来的问题!关于兼容IE跟FF的float属性.趁现在还清醒赶紧记下笔记先:一.并排在一行的两个div样式有这种情况:ie或者ff下对于子d ...