网上关于Android的logo的资料有很多,如
http://jishublog.iteye.com/blog/1782918
由于我们公司在uboot中是读分区显示logo的,到kernel的时候会有四只企鹅(4核CPU)出现,到Android的动画这一阶段,重新读取分区里的logo数据。在kernel将企鹅屏蔽掉后,显示在uboot中的logo会被刷掉,出现黑屏现象。网上寻找一系列解决方案后,没有发现合适的。看到三星的kernel源码中可以实现在内核中重刷uboot图像方法,这个能将这种解决方案移植到我们现在这个平台上,不就可以解决问题了吗?所以还是要多看看内核源码哦。
原始代码如下
#define bootloaderfb 0x48000000
if (bootloaderfb) {
u8 *logo_virt_buf;
logo_virt_buf =ioremap_nocache(bootloaderfb,
fb->var.yres * fb->fix.line_length);
memcpy(fb->screen_base, logo_virt_buf,
fb->var.yres * fb->fix.line_length);
iounmap(logo_virt_buf);
}
其中bootloaderfb为uboot中lcd的显示基地址。其他代码就不多解释了。开始的时候ioremap_nocache这个函数总是报错。百度一下这个函数http://www.cnblogs.com/dodo-bear/archive/2011/05/04/dodo.html。发现有可能lcd这一段显示内存在进入内核后被占用,造成申请这一段内存失败。这里将uboot中lcd的显示基地址改成内存中的高地址后,该段内存就申请成功了。这样便实现了uboot的图像进入内核后可以持续显示了。这段代码的关键为bootloaderfb这个地址的确定,这个地址为内存的物理地址,可参考芯片手册的内存分布来确定,并设为内存中比较靠后的那段地址(高地址),被申请的可能性较小。另外,拷贝的时候注意一下uboot的显示模式和kernel的是否一致,否则会出现图像偏移的现象。