Chinaunix首页 | 论坛 | 博客
  • 博客访问: 432160
  • 博文数量: 69
  • 博客积分: 957
  • 博客等级: 准尉
  • 技术积分: 1161
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-26 14:54
文章分类

全部博文(69)

文章存档

2013年(15)

2012年(12)

2011年(42)

分类: Android平台

2013-09-28 12:08:23

一. 如果有源码,在Linux环境下:
     1、安装pngtopnm工具。
       $ sudo apt-get install netpbm  注:安装完以后就会有pngtopnm,pnmquant,pnmtoplainpnm三个工具。      
     2、选择logo的图片:  
       首先选择一个自己喜欢的图片,然后通过GIMP软件将该图片保存为.png格式,比如保为linuxlogo.png.      3、制作.ppm格式的图片:
       $ pngtopnm linuxlogo.png > linuxlogo.pnm
       $ pnmquant 224 linuxlogo.pnm > linuxlogo224.pnm
       $ pnmtoplainpnm linuxlogo224.pnm > linuxlogo224.ppm
      或者  
       $bmptoppm linuxlogo.bmp > linuxlogo.ppm    //生成ppm  
       $ppmquant 224 linuxlogo.ppm > linuxlogo224.ppm   //转换成224颜色  
       $pnmnoraw linuxlogo224.ppm > linuxlogo224.ppm    //转换成ascii格式
      4、替换原有的图片。      
       $ make clean SUB_DIR=./drivers/video/logo/      //来清除logo目录下的.c.o文件

源码分析:开机图片(Linux小企鹅) (Android 1.5及以上版本已经取消加载图片); 
Linux Kernel引导启动后,加载该图片。 
logo.c中定义nologo,在fb_find_logo(int depth)函数中根据nologo的值判断是否需要加载相应图片。 
代码如下: 
static int nologo; 
module_param(nologo, bool, 0); 
MODULE_PARM_DESC(nologo, "Disables startup logo");
 
const struct linux_logo * __init_refok fb_find_logo(int depth) 

const struct linux_logo *logo = NULL;
if (nologo) 
return NULL; 
        ...... 

相关代码: 
/kernel/drivers/video/fbmem.c 
/kernel/drivers/video/logo/logo.c 
/kernel/drivers/video/logo/Kconfig 
/kernel/include/linux/linux_logo.h



二. 如果没有源码【转于:】
      
第一屏LOGO位于kernel.img中,而瑞芯微没有对kernel.img开发而无法解包,所以针对这个第一屏替换比较繁琐,我们要用到“UltraEdit32”或“WinHex”等16进制工具来修改kernel.img文件,lajidong在RK28固件小组里非常详细的公布了修改办法,现在本人直接转过来,值得注意的是,lajidong是针对RK2818方案其他机型的固件作出的修改,所以N系列仅做参考,以自己的固件参数为主。
        
针对第一屏的详细修改教程(作者:lajidong)

1、将kernel.img重命名为kernel.bak,用WinHex打开kernel.bak,记下04~07偏移处数据,本例中是D8 91 4C 00,即16进制数4C91D8;
 
2、选定kernel.bak最前面8个字节,按Delete键删除,询问时选择“YES”;
 
3、按下快捷键Alt+G,在弹出的对话框里填入第1步记下的数字4C91D8,然后点“OK”,光标将跳转到4C91D8处;
 
4、在4C91D8偏移处数据上弹出右键菜单,选“Beginning of block”,或者直接按下快捷键Alt+1;
 
5、将滚动条拉到最后,在文件最后一个字节处弹出右键菜单,选“End of block”,或者点击最后一个字节后直接按下快捷键Alt+2;
 
6、按Delete键删除,询问时选择“YES”;
 
7、查找16进制串0300000020030000E0010000,这里姑且叫它特征串;
 
8、在208A0偏移处查找到了该特征串,记下紧跟着该特征串的那个字节,本例中是D6,转换到10进制就是214,表示调色板内颜色总数;特征串偏移加上18(16进制),即208A0+18=208B8处是调色板起始地址,调色板数据大小为颜色总数的3倍,本例中是D6*3=282(16进制),因此调色板数据的偏移为208B8到20B39,在这之后,4倍边界处20B3C就是logo的像素数据的起始地址,数据大小为800*480=384000(10进制),因此像素数据的偏移为20B3C到7E73B;
 
9、准备一张800x480分辨率的图片,用图片编辑器将图片垂直翻转并转换为索引模式,调色板最大颜色数设置为上一步记下的214,然后把图片保存为未压缩的BMP格式;

 
10、用WinHex打开上一步制作的BMP,注意查看0A~0B偏移处数据,本例中是8E 03,即16进制数38E,那么从偏移38E到文件结尾的所有数据就是该BMP的像素数据
  
选定像素数据,选择“Edit”菜单下的“Modify Data”项,按下图设置给每个字节加上16进制数20,然后点“OK”,再把这些数据复制覆盖到第8步像素数据区(20B3C到7E73B),注意数据是覆盖而不是插入;
 
11、BMP中16进制偏移36到38D内数据为调色板数据,为了便于下一步操作,把调色板数据复制到一个新文件;
12、用WinHex打开上一步建的调色板数据文件,选择“Edit”菜单下的“Modify Data”项,按下图设置,选择“32-bit byte swap”,然后点OK;
 
13、删除调色板数据文件最前面的字节“00”;
 
14、按下图设置替换16进制串;
 
15、把调色板数据覆盖到kernel.bak的调色板数据区(208B8到20B39),同样要注意数据是覆盖而不是插入;
16、保存kernel.bak;
17、在命令行下输入AddCrc32 kernel.bak kernel.img,生成的kernel.img即可用于刷机;

阅读(6571) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~