DM3730:在24 bit的LCD上顯示 RGB656的android initlogo.rle Logo

DM3730:在24 bit的LCD上顯示 RGB656的android initlogo.rle Logo

Introduction

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

Cause

在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

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

你可能感兴趣的:(DM3730:在24 bit的LCD上顯示 RGB656的android initlogo.rle Logo)