在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