在S5PV210 ANDROID2.3 平台上做了一个initlogo.rle 显示不正常。
原因是initlogo.rle是16位数据,而我们的LCD是32位的,需要将initlogo.rle转换位32位的。
源码路径:android_source/system/core/init/logo.c
#define fb_size(fb) ((fb)->vi.xres * (fb)->vi.yres * 2)
是用于16位的,修改如下:
#define fb_size(fb) ((fb)->vi.xres * (fb)->vi.yres * ((fb)->vi.bits_per_pixel/8))
添加
#define fb_bpp(fb) ((fb)->vi.bits_per_pixel) //帧缓冲设备的每像素位数
在函数 int load_565rle_image(char *fn) 之前定义16 bits to 32 bits 转换函数如下:
void convert_565rle_to_32(unsigned short val,unsigned short ** pbits,unsigned int *pn)
{
uint32_t rgb32, red, green, blue, alpha;
red = ((val >> 11) & 0x1F);
red = (red << 3) | (red >> 2);
green = ((val >> 5) & 0x3F);
green = (green << 2) | (green >> 4);
blue = ((val) & 0x1F);
blue = (blue << 3) | (blue >> 2);
alpha = 0xff;
rgb32 = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0);
android_memset32((uint32_t *)(*pbits), rgb32, (*pn) << 2);
*pbits += ((*pn) * 2);
}
然后在int load_565rle_image(char *fn)函数中,将
android_memset16(bits, ptr[1], n << 1);
bits += n;
修改如下:
if (fb_bpp(&fb) == 16) { //16位
android_memset16(bits, ptr[1], n << 1);
bits += n;
} else if(32 == fb_bpp(&fb)){ // 32位
convert_565rle_to_32(ptr[1],&bits,&n);
}
这样,即可正常显示了。
不过烧入系统首次启动能够看到图片,重新启动就看不到了,提示没有initlogo.rle:
init: cannot open '/initlogo.rle'
在网上搜索到了如下解决办法:
在system/core/init/init.c[load_565rle_image]-->logo.c中,显示完毕initlogo.rle之后作了 unlink 操作。该操作对于android默认的只读型system.img是没问题,但对于自定义的yaffs格式的可读写型的system.img时就有问题了。会造成将initlogo.rle删除,下次启动时读取不到该文件。可以通过注释掉logo.c的load_565rle_image()中的 unlink(fn)语句来解决该问题。
向解决该问题的前辈鞠躬!
initlogo.rle 制作方法:
1. 制作与LCD尺寸相同的png图片logo.png
2. 将图片转换为raw格式
# convert -depth 8 logo.png rgb:logo.raw
3. 将raw格式转化为rle文件
# android_source/out/host/linux-x86/bin/rgb2565 -rle <logo.raw> initlogo.rle