方法一:准备一张和LCD分辨率一样大小的png图片logo.png,在高通源码目录device/qcom/common/display/logo下面,有readme.txt文件,里面有说明生成镜像文件的方法:
执行命令:python ./logo_gen.py logo.png,在当前目录下面会生成splash.img,用flash工具将splash.img刷进splash分区即可。
若想将splash.img放进刷机包,则修改刷机包中的rawprogram_unsparse.xml文件:
-<program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="" label="splash" num_partition_sectors="20480" physical_partition_number="0" size_in_KB="10240.0" sparse="false" start_byte_hex="0x8a82400" start_sector="283666" />
+<program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="splash.img" label="splash" num_partition_sectors="20480" physical_partition_number="0" size_in_KB="10240.0" sparse="false" start_byte_hex="0x8a82400" start_sector="283666" />
方法二:准备一张png图片logo.png,分辨率不要超过320*200,执行下列命令:
convert logo.png -recolor "0 0 1,0 1 0,1 0 0" logo_new.png
convert -depth 8 logo_new.png rgb:logo_raw.raw
xxd -c16 -i logo_raw.raw > splash.h
用splash.h文件中数组的内容替换bootable/bootloader/lk/platform/msm_shared/include/splash.h中的数组imageBuffer_rgb888,然后重编lk,将生成的emmc_appsboot.mbn烧进单板即可。
注意:方法二需要保证splash分区为空,splash分区非空,方法二是不起作用的,所以用方法二之前,最好先擦除splash分区。原因如下:
void display_default_image_on_screen(void)
{
unsigned i = 0;
unsigned total_x;
unsigned total_y;
unsigned bytes_per_bpp;
unsigned image_base;
if (!config) {
dprintf(CRITICAL,"NULL configuration, image cannot be displayed\n");
return;
}
fbcon_clear(); // clear screen with Black color
total_x = config->width;
total_y = config->height;
bytes_per_bpp = ((config->bpp) / 8);
image_base = ((((total_y/2) - (SPLASH_IMAGE_HEIGHT / 2) - 1) *
(config->width)) + (total_x/2 - (SPLASH_IMAGE_WIDTH / 2)));
#if DISPLAY_TYPE_MIPI
if (bytes_per_bpp == 3) {
for (i = 0; i < SPLASH_IMAGE_HEIGHT; i++) {
memcpy (config->base + ((image_base + (i * (config->width))) * bytes_per_bpp),
imageBuffer_rgb888 + (i * SPLASH_IMAGE_WIDTH * bytes_per_bpp),
SPLASH_IMAGE_WIDTH * bytes_per_bpp);
}
}
fbcon_flush();
#if DISPLAY_MIPI_PANEL_NOVATEK_BLUE
if(is_cmd_mode_enabled())
mipi_dsi_cmd_mode_trigger();
#endif
#else
if (bytes_per_bpp == 2) {
for (i = 0; i < SPLASH_IMAGE_HEIGHT; i++) {
memcpy (config->base + ((image_base + (i * (config->width))) * bytes_per_bpp),
imageBuffer + (i * SPLASH_IMAGE_WIDTH * bytes_per_bpp),
SPLASH_IMAGE_WIDTH * bytes_per_bpp);
}
}
fbcon_flush();
#endif
}
void display_image_on_screen(void)
{
#if DISPLAY_TYPE_MIPI
int fetch_image_from_partition();
if (fetch_image_from_partition() < 0) {
display_default_image_on_screen();
} else {
/* data has been put into the right place */
fbcon_flush();
}
#else
display_default_image_on_screen();
#endif
}
lk运行后,程序会bootable/bootloader/lk/dev/fbcon/fbcon.c文件中的display_image_on_screen函数,它会从splash分区获取图像数据,如果成功,就直接将splash分区中的图像数据显示在LCD上,获取失败才会调用fbcon_flush函数,该函数将imageBuffer_rgb888数组中的内容显示在LCD上。