android ICS 系统启动之Logo相关学习总结

前几天把android init 进程看了一遍,这次回过头来再把android系统启动的Logo相关学习内容做一个梳理和总结。我们知道android系统的启动logo包括3个启动画面(这里不对uboot中的logo做解析),第一个是android系统启动时,linux内核启动阶段显示的logo,这个和普通的linux像类似。下面主要针对logo的相关修改以及一些配置和注意点做个总结。

1.第一个logo从何处启动?

linux下使用帧缓冲(Framebuffer)的概念来表示一个显示接口,通俗理解就表示一块LCD。帧缓冲区的相关驱动在内核启动时调用fbmem_init,在该函数中主要完成使用register_chrdev来注册了一个名称为fb的字符设备,最后调用函数class_create在/sys/class目录下创建了一个graphics目录等。同样的驱动加载中会调用硬件平台(我的是EVM AM37xx)相关LCD的驱动初始化函数omapfb_init。

static int __init omapfb_init(void)
{DBG("omapfb_init\n");if (platform_driver_register(&omapfb_driver)) {printk(KERN_ERR "failed to register omapfb driver\n");return -ENODEV;}return 0;
}

了解驱动的人都知道,最终这个平台驱动会调用probe探针函数完成一些硬件的初始化。在该函数的实现中会出现register_framebuffer函数注册相关的fb

register_framebuffer(struct fb_info *fb_info)
{int i;struct fb_event event;struct fb_videomode mode;if (num_registered_fb == FB_MAX)return -ENXIO;if (fb_check_foreignness(fb_info))return -ENOSYS;
。。。num_registered_fb++;for (i = 0 ; i < FB_MAX; i++)if (!registered_fb[i])break;
。。。fb_info->dev = device_create(fb_class, fb_info->device,MKDEV(FB_MAJOR, i), NULL, "fb%d", i);//fb_class=/sys/class/graphics,/dev/graphics/fb0if (IS_ERR(fb_info->dev)) {/* Not fatal */printk(KERN_WARNING "Unable to create device for framebuffer %d; errno = %ld\n", i, PTR_ERR(fb_info->dev));fb_info->dev = NULL;} elsefb_init_device(fb_info);
。。。。fb_var_to_videomode(&mode, &fb_info->var);fb_add_videomode(&mode, &fb_info->modelist);registered_fb[i] = fb_info;
。。。fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event);//notify consoleunlock_fb_info(fb_info);return 0;
}

这个函数会针对对个fb,完成相关节点的创建在/dev/graphics/fb0,fb1...等。主设备号为29.一旦完成创建,会调用fb_notifier_call_chain,函数通知控制fb的console(理解为控制台).每一个fb都会对应于一个console来控制。而logo的显示启动,就是在fbcon_init和fbcon_switch中来完成的。

在fbcon_init中使用fbcon_prepare_logo函数准备需要显示的logo数据源,在fbcon_switch使用fb_show_logo来显示logo。

2 如何将任意的图片jpg格式的图片,作为第一个logo。最终在LCD上显示

操作步骤如下:

a.首先是对内核进行相关配置,对.config添加下面两行内容

   CONFIG_FRAMEBUFFER_CONSOLE

     CONFIG_LOGO

表示的就是logo以及fb的控制台。

b。对jpg进行格式的转换

我们先来看logo目录下的相关文件,重点是logo.c和Makefile

先来解析一下linux内核中的Makefile,正好学习一番。

# Makefile for the Linux logosobj-$(CONFIG_LOGO)         += logo.o
obj-$(CONFIG_LOGO_LINUX_MONO)       += logo_linux_mono.o
obj-$(CONFIG_LOGO_LINUX_VGA16)      += logo_linux_vga16.o
obj-$(CONFIG_LOGO_LINUX_CLUT224)    += logo_linux_clut224.o
obj-$(CONFIG_LOGO_BLACKFIN_CLUT224) += logo_blackfin_clut224.o
obj-$(CONFIG_LOGO_BLACKFIN_VGA16)   += logo_blackfin_vga16.o
obj-$(CONFIG_LOGO_DEC_CLUT224)      += logo_dec_clut224.o
obj-$(CONFIG_LOGO_MAC_CLUT224)      += logo_mac_clut224.o
obj-$(CONFIG_LOGO_PARISC_CLUT224)   += logo_parisc_clut224.o
obj-$(CONFIG_LOGO_SGI_CLUT224)      += logo_sgi_clut224.o
obj-$(CONFIG_LOGO_SUN_CLUT224)      += logo_sun_clut224.o
obj-$(CONFIG_LOGO_SUPERH_MONO)      += logo_superh_mono.o
obj-$(CONFIG_LOGO_SUPERH_VGA16)     += logo_superh_vga16.o
obj-$(CONFIG_LOGO_SUPERH_CLUT224)   += logo_superh_clut224.o
obj-$(CONFIG_LOGO_M32R_CLUT224)     += logo_m32r_clut224.o
obj-$(CONFIG_SPU_BASE)          += logo_spe_clut224.o
#by gzz
obj-$(CONFIG_LOGO_ICS_CLUT224)        +=logo_ics_clut224.o# How to generate logo's# Use logo-cfiles to retrieve list of .c files to be built
logo-cfiles = $(notdir $(patsubst %.$(2), %.c, \$(wildcard $(srctree)/$(src)/*$(1).$(2))))# Mono logos
extra-y += $(call logo-cfiles,_mono,pbm)# VGA16 logos
extra-y += $(call logo-cfiles,_vga16,ppm)# 224 Logos
extra-y += $(call logo-cfiles,_clut224,ppm)# Gray 256
extra-y += $(call logo-cfiles,_gray256,pgm)pnmtologo := scripts/pnmtologo# Create commands like "pnmtologo -t mono -n logo_mac_mono -o ..."
quiet_cmd_logo = LOGO    $@cmd_logo = $(pnmtologo) \-t $(patsubst $*_%,%,$(notdir $(basename $<))) \-n $(notdir $(basename $<)) -o $@ $<$(obj)/%_mono.c: $(src)/%_mono.pbm $(pnmtologo) FORCE$(call if_changed,logo)$(obj)/%_vga16.c: $(src)/%_vga16.ppm $(pnmtologo) FORCE$(call if_changed,logo)$(obj)/%_clut224.c: $(src)/%_clut224.ppm $(pnmtologo) FORCE$(call if_changed,logo)$(obj)/%_gray256.c: $(src)/%_gray256.pgm $(pnmtologo) FORCE$(call if_changed,logo)# Files generated that shall be removed upon make clean
clean-files := *.o *_mono.c *_vga16.c *_clut224.c *_gray256.c
.PHONY:clean
clean:rm $(clean-files)

对这部分内容做一些分析,quiet_cmd_logo,这是linux内核定义的命令格式规则,先看这里的目标文件obj/%_mono.c,依赖于ppm等格式的图形文件, 在这里一旦执行到if_changed发生改变,就执行logo命令,该命令使用pnmtologo脚本,完成ppm,pgm到.c文件的转变。我们来分析cmd_logo这句脚本命令执行的内容。比如有logo_ics_clut224.ppm格式的图像源文件,那么这句脚本解析如下:

先说明$@=.../logo_ics_clut224.c $<=.../logo_ics_clut224.ppm $*=logo_ics(目标%模式前的部分)

所以cmd_logo= scripts/pnmtologo -t clut224 -n logo_ics_clut224 -o .../logo_ics_clut224.c  .../logo_ics_clut224.ppm

最终图像文件编成了一个.c文件,其实是完成了相关像素点数据的提取。

回到前面的,根据这个makefile我们需要做的是获取.ppm,pbm等格式的图像.下面介绍普通的jpg格式在ubuntu下转换为ppm格式的图片。

1):使用gimp image软件随意修改图片的像素大小

2)使用终端命令convert xxx.jpg xxx.png

3) 使用如下命令完成最终的转换(被转换的文件必须是png格式)

# pngtopnm xxx.png > xxx.pnm

# pnmquant 224 xxx.pnm > xxx224.pnm

注意:上句命令前后的输入输出,名字需要不一样,否则出现错误(pnmcolormap: EOF / read error reading magic number pnmcolormap failed, rc=256)

# pnmtoplainpnm xxx224.pnm > xxx224.ppm

通过以上命令完成最终的转换,都是基于终端下的命令完成。

c 对logo.c等源文件做一定的修改

主要修改find_logo_c的相关内容

const struct linux_logo * __init_refok fb_find_logo(int depth)
{const struct linux_logo *logo = NULL;if (nologo)return NULL;。。。。。。。if (depth >= 8) {
#ifdef CONFIG_LOGO_ICS_CLUT224logo = &logo_ics_clut224;  //gzzprintk("depth=%d,logo=logo_ics_clut224\n",depth);//by gzz
#endif#ifdef CONFIG_LOGO_LINUX_CLUT224/* Generic Linux logo */logo = &logo_linux_clut224;
#endif
#ifdef CONFIG_LOGO_BLACKFIN_CLUT224/* Blackfin Linux logo */logo = &logo_blackfin_clut224;
#endif
#ifdef CONFIG_LOGO_DEC_CLUT224/* DEC Linux logo on MIPS/MIPS64 or ALPHA */logo = &logo_dec_clut224;
#endif
#ifdef CONFIG_LOGO_MAC_CLUT224/* Macintosh Linux logo on m68k */if (MACH_IS_MAC)logo = &logo_mac_clut224;
#endif
#ifdef CONFIG_LOGO_PARISC_CLUT224/* PA-RISC Linux logo */logo = &logo_parisc_clut224;
#endif
#ifdef CONFIG_LOGO_SGI_CLUT224/* SGI Linux logo on MIPS/MIPS64 and VISWS */logo = &logo_sgi_clut224;
#endif
#ifdef CONFIG_LOGO_SUN_CLUT224/* Sun Linux logo */logo = &logo_sun_clut224;
#endif
#ifdef CONFIG_LOGO_SUPERH_CLUT224/* SuperH Linux logo */logo = &logo_superh_clut224;
#endif
#ifdef CONFIG_LOGO_M32R_CLUT224/* M32R Linux logo */logo = &logo_m32r_clut224;
#endif}return logo;

添加如下代码在上述的函数中:

#ifdef CONFIG_LOGO_ICS_CLUT224
        logo = &logo_ics_clut224;  //gzz
        printk("depth=%d,logo=logo_ics_clut224\n",depth);//by gzz
#endif
这样在前面讲到的fbcon_init的过程中会调用该函数,完成logo数据文件的查找。确定要显示的logo图片文件。

通过以上a,b.c3个部分的内容就可以完成logo图像的修改以及显示,但是位置在左上角。

3.  修改部分代码,在合适位置显示logo

主要修改部分在fb_show_logo_line,这个函数实现logo的完全显示,部分代码如下:

static int fb_show_logo_line(struct fb_info *info, int rotate,const struct linux_logo *logo, int y,unsigned int n)
{printk("enter fb_show_logo_line\n");//gzzu32 *palette = NULL, *saved_pseudo_palette = NULL;unsigned char *logo_new = NULL, *logo_rotate = NULL;struct fb_image image;/* Return if the frame buffer is not mapped or suspended *///if (logo == NULL || info->state != FBINFO_STATE_RUNNING ||//info->flags & FBINFO_MODULE)//return 0;
。。。。if (fb_logo.depth <= 4) {logo_new = kmalloc(logo->width * logo->height, GFP_KERNEL);if (logo_new == NULL) {kfree(palette);if (saved_pseudo_palette)info->pseudo_palette = saved_pseudo_palette;return 0;}image.data = logo_new;fb_set_logo(info, logo, logo_new, fb_logo.depth);}//   image.dx = 0;
//  image.dy = y;image.dx = (info->var.xres/2) -(logo->width/2);image.dy =  (info->var.yres/2) -(logo->height/2); //by gzz   image.width = logo->width;//140image.height = logo->height;//153if (rotate) {logo_rotate = kmalloc(logo->width *logo->height, GFP_KERNEL);if (logo_rotate)fb_rotate_logo(info, logo_rotate, &image, rotate);}fb_do_show_logo(info, &image, rotate, n);//rotate=0,n=1。。。return logo->height;
}

在这个函数中,要显示的图像信息都保存在里image结构体中,同时logo显示的起点在image.dx,image.dy这个坐标上。这里可以修改这对坐标值,完成位置的修改。比如这里配置的是显示在LCD(480*640)的正中间.

另外需要修改的地方在fbcon_prepare_logo中,需要修改logo_height = fb_prepare_logo(info, ops->rotate);这个数值,因为logo_height是图片的垂直像素点。一旦显示位置发生偏移的话,图像实际DRAW时,需要的logo_lines = DIV_ROUND_UP(logo_height, vc->vc_font.height);会相应的增加,这样才可以正常显示。当然这个logo_lines最大为40即640的垂直height.否则会报出:“ fbcon_init: disable boot-logo (boot-logo bigger than screen) ”。

到这里1,2,3总结在一起后就完成了android ICS 启动的第一个画面,总结一下,方便以后的操作。

android ICS 系统启动之Logo有关学习总结相关推荐

  1. android ICS 系统启动之Logo相关学习总结

    前几天把android init 进程看了一遍,这次回过头来再把android系统启动的Logo相关学习内容做一个梳理和总结.我们知道android系统的启动logo包括3个启动画面(这里不对uboo ...

  2. android 程序 读logo,Android端APP更换logo和名称后都需要些测试哪些内容呢?

    原标题:Android端APP更换logo和名称后都需要些测试哪些内容呢? 之前有人在搜狗测试粉丝群中问过APP更换logo和名称后需要怎么测试呢?小编正好经历过这样的需求,下面来系统整理一下APP更 ...

  3. Android 服务类Service 的详细学习

    http://blog.csdn.net/vipzjyno1/article/details/26004831 Android服务类Service学习四大组建 目录(?)[+] 什么是服务 服务有什么 ...

  4. 2020年Android GMS 认证 boot logo 最新要求

    Android GMS 认证 boot logo 要求 下面是GMS认证对开机logo的8点要求,以下是特别容易忽略的几点: 第6点("Powered by Android"标志模 ...

  5. 2019年Android GMS 认证 boot logo 最新要求

    Android GMS 认证 boot logo 要求 下面是GMS认证对开机logo的8点要求,以下是特别容易忽略的几点: 第6点("Powered by Android"标志模 ...

  6. Android程序员该如何进阶学习以预防35岁中年职场危机?

    一.大家都在担心的问题 不只是Android,很多程序员都在担心业界的"35岁危机",担心自己到35岁后就被市场淘汰. 比如最近就经常被大家问到这样的问题,比如这样的: 大佬好,目 ...

  7. Android开发英语听力软件,基于Android平台的大学英语听力学习系统的设计与实现...

    摘要: 随着信息技术的飞速发展,移动设备给学习提供了一种全新的学习模式,使学者能够在任何时间.任何地点获得自己想要的知识,实现自主学习.本文对基于Android平台的大学英语听力学习系统展开研究,旨在 ...

  8. Android Studio 设置图标LOGO,APP下载到手机以后图标无变化

    Android Studio 设置图标LOGO,APP下载到手机以后显示小机器人 最近刚入门Android studio,一直都是默认图标,今天心血来潮想自定义图标,发现搜索到的各种方法都没办法成功更 ...

  9. Android 进阶——系统启动之SystemServer创建并启动Installer服务(八)

    文章大纲 引言 一.Intsaller系统服务概述 二.com.android.server.SystemService概述 三.Intsaller系统服务的启动 1.com.android.serv ...

最新文章

  1. 4K P60 444 相关的事
  2. 一文详解PnP算法原理
  3. oracle不能用uuid,Oracle 应用之--VirtualBox UUID问题
  4. 在Prefetcher中取消robots.txt的限制
  5. cmd常用命令与演示
  6. 神经网络粒子和物理粒子的一个本质差别
  7. springboot @RequestBody 接收字符串
  8. 为什么 SAP 电商云 Spartacus UI SSR 模式下的客户端应用,不会发起 product 请求
  9. 滑动关机代码bat_BAT面试算法进阶--(2) 无重复字符的最长子串(滑动法优化+ASCII码法)...
  10. E06-libcrypto.so.10 遗失的解决办法
  11. 58页PPT揭示图神经网络研究最新进展
  12. 计算机导论答案解析,计算机导论答案解析内容.doc
  13. 单片机有没有想象中那么好学,很迷茫有说正面有说负面
  14. TortoiseHg笔记
  15. 井下三专两闭锁的内容_三专两闭锁
  16. 面试突击63:distinct 和 group by有什么区别?
  17. git 某个分支直接覆盖当前master分支
  18. 常用算法设计技术总结
  19. MIPI_DSI协议
  20. PPP over Ethernet(PPPoE)协议

热门文章

  1. JAVA 开发统一规范(规约)
  2. Co-LncRNA:lncRNA与蛋白编码基因的共表达网络数据库
  3. C++实现简易数据库
  4. 繁凡的对抗攻击论文精读(三)ICLR2019 利用先验知识进行高效黑盒对抗攻击的 bandits 算法(MIT)
  5. 基于Java的实时聊天系统设计与实现
  6. 爬虫股票交易接口系统怎么运用多空指标获取数据?
  7. js 进度条demo
  8. python批量下载b站_PYTHON批量下载B站视频小脚本
  9. JavaScript实现页面动态验证码
  10. Vue项目目录结构介绍讲解