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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章