Reference hardware platforms:AM37x/DM37x
OS Kernel: Linux 2.6.37
Android: Gingerbread 2.3.4
Reference hardware platforms: Jorjin DM37 AP module on PantherBoard
Build Host: Ubuntu 10.04 LTS
This release also corresponds to the JorJin internal release.
Android : PA_R2.0.2-dsp
Kernel : PA_R2.0.3
U-boot : PA_R1.0.2
X-loader : PA_R2.0.0
Source from:http://blog.csdn.net/mxl_mxl/article/details/8775763
Security Classification: Public
在DM3730 ANDROID2.3.4 平台上做了一個initlogo.rle 顯示不正常。
原因是initlogo.rle是16 bit(RGB565),而我們的LCD是24 bit色深(RGB888),需要將initlogo.rle轉換成24/32 bit(RGB888/ARGB8888)。
Source code路徑:android/system/core/init/logo.c 請Search下列的Code
#define fb_size(fb) ((fb)->vi.xres * (fb)->vi.yres * 2)
上列是定義Frame Buffer為16-bit,我們將其修改如下:
#define fb_size(fb) ((fb)->vi.xres * (fb)->vi.yres * ((fb)->vi.bits_per_pixel/8))
此外我們再添加,來Check Frame buffer中,每個Pixel的bit數
#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) { //如Frame Buffer 為16 bit,則執行下列 android_memset16(bits, ptr[1], n << 1); bits += n; } else if(32 == fb_bpp(&fb)){ // 如果Frame Buffer為24或32bit的話,則執行RGB656格式 extend的函式 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 Default的Read-only 的system.img是沒問題,但對於自定義的yaffs格式的可讀寫型的system.img時就有問題了。會造成將initlogo.rle刪除,下次啟動時讀取不到該文件。 可以通過註釋掉logo.c的load_565rle_image()中的unlink(fn)語句來解決該問題。
向解決該問題的前輩鞠躬!
initlogo.rle 製作方法:
# convert -depth 8 logo.png rgb:logo.raw
# android_source/out/host/linux-x86/bin/rgb2565 -rle <logo.raw> initlogo.rle