android initlogo.rle 在32位LCD上显示

在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


你可能感兴趣的:(android,initlogo.rle,32位LCD)