1、MTK平台下
在放logo的地方新增logo(各项目有所不同),如下图,
alps/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/hdplus1612
然后在alps/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/rules.mk文件中,修改如下:
在alps/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/update文件中,修改如下:
MTK平台logo下标是保存在nvram中的,需要去掉nvram保护,在alps/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6763/write_protect.c文件中修改如下:
在uboot中显示logo,在alps/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6763/mt_logo.c文件中,如下
#define YYT_LOGO_OFFSET 200//116 // barcode:64 + imei:40 + 64 + 170 + 128
#define YYT_BLOCK_SIZE 512
int yyt_read_nvlogo_info(char* buf)
{
int tmp = 0;
char* buf_blk = (char*)0;
//if (!buf) return 0;
buf_blk = malloc(YYT_BLOCK_SIZE);
if (!buf_blk)
{
dprintf(CRITICAL, "[error] alloc proinfo buffer fail.\n");
return 0;
}
memset(buf_blk, 0, YYT_BLOCK_SIZE);
dprintf(CRITICAL, "begin read proinfo\n");
tmp = mboot_recovery_load_raw_part("proinfo", buf_blk, YYT_BLOCK_SIZE);
if (tmp != YYT_BLOCK_SIZE)
{
dprintf(CRITICAL, "[error] read proinfo fail, only read size %d, block size %d.\n",
tmp, YYT_BLOCK_SIZE);
free(buf_blk);
return 0;
}
memcpy(buf, buf_blk + YYT_LOGO_OFFSET, 1);
buf[1] = '\0';
dprintf(CRITICAL, "get aging cv from proinfo: \"%s\"\n", buf);
free(buf_blk);
return tmp;
}
/*
* Show first boot logo when phone boot up
*
*/
void mt_disp_show_boot_logo(void)
{
unsigned char aging_cv_str[2] = { 0 };
int nvram_len = 0;
dprintf(INFO, "[lk logo: %s %d]\n",__FUNCTION__,__LINE__);
mt_logo_get_custom_if();
if (logo_cust_if->show_boot_logo) {
logo_cust_if->show_boot_logo();
} else {
///show_logo(0);
init_fb_screen();
nvram_len = yyt_read_nvlogo_info(aging_cv_str);
dprintf(INFO, "[lk logo: %s %d nvram_len=%d logo=%d]\n",__FUNCTION__,__LINE__,nvram_len,aging_cv_str[0]);
fill_animation_logo(BOOT_LOGO_INDEX + 38 + aging_cv_str[0], mt_get_fb_addr(), (void *)mt_get_tempfb_addr(), logo_addr, phical_screen);
mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
}
return;
}
在kernel中显示logo,在alps/vendor/mediatek/proprietary/external/libshowlogo/charging_animation.cpp文件中,如下:
#define NVRAM_LOGO_PATH "/dev/block/platform/bootdevice/by-name/proinfo"
/*
* Show kernel logo when phone boot up
*
*/
void show_kernel_logo()
{
SLOGE("[libshowlogo: %s %d--------]\n",__FUNCTION__,__LINE__); //luwl
int size = 512;
char buf[size];
if(!read_from_file(NVRAM_LOGO_PATH, buf, size)){
SLOGE("[libshowlogo: %s %d read NVRAM_LOGO_PATH fail]\n",__FUNCTION__,__LINE__); //luwl
}
SLOGE("[libshowlogo: %s %d logo=%d other=%d\n",__FUNCTION__,__LINE__,buf[200],buf[481]); //luwl
if (MTK_LOG_ENABLE == 1) {
SLOGD("[libshowlogo: %s %d]show kernel logo, index = 38 \n",__FUNCTION__,__LINE__);
}
if (error_flag == 0) {
// lbm add start
char* logoBuffer=(char *)malloc(4);
sprintf(logoBuffer, "%d", buf[200]);
property_set("persist.sys.bootanimation", logoBuffer);
// lbm add end
anim_show_logo(kernel_logo_position + buf[200]);
}
}
kernel读取logo下标需要添加权限,在alps/device/mediatek/mt6763/sepolicy/basic/boot_logo_updater.te文件中,添加如下
allow boot_logo_updater nvram_device:blk_file { read write ioctl open };
allow boot_logo_updater pro_info_device:blk_file { read write ioctl open };
allow boot_logo_updater pro_info_device:chr_file { read write ioctl open };
allow boot_logo_updater sysfs_boot_mode:file read;
allow boot_logo_updater system_prop:property_service set;
2、SPRD平台下:
新增logo图片,各项目会有所不同,如在U_sprd_rls_vnd/device/sprd/qogirl6/bnd/N60/8_port/bmp_file_default目录下,
读取开机logo下标,U_sprd_rls_vnd/bsp/bootloader/lk/app/sprdboot/boot_parse.c目录下
/*add by yanglh start*/
int read_logo_choice(void)
{
int tmp = 0;
printf("yanglh read_logo_choice @start = %d.\n", tmp);
if (!common_raw_read("miscdata", 1, 806 * 1024 + 1, &tmp))
{
//tmp
printf("yanglh read_logo_choice tmp = %d.\n", tmp);
}
printf("yanglh read_logo_choice @end = %d.\n", tmp);
return tmp;
}
/*add by yanglh end*/
int sprd_set_preload(int lcd_on, uint32_t brightness)
{
struct pre_load_operations *preload = &sprd_pre_load;
//pmic & wakeup configure
if (preload->power)
preload->power();
#ifdef CONFIG_SPLASH_SCREEN
//lcd/backlight/vibrator configure
if (preload->display) {
if (POWEROFF_CHARGE_LOGO_SUPPORT && !strcmp("charger", g_env_bootmode))
preload->display(LOGO_POWEROFF_CHARGE, brightness, lcd_on);
else
{
int index = read_logo_choice();
preload->display(LOGO_NORMAL_POWER + 1 + index, brightness, lcd_on);
}
}
#endif
if (preload->vibrator)
preload->vibrator(0);
return 0;
}
添加权限:
U_sprd_rls_vnd/device/sprd/vnd_sepolicy/vendor/system_app.te
+allow system_app prod_file:dir remove_name;
+allow system_app phasecheckserver:unix_stream_socket connectto;
U_sprd_rls_vnd/system/sepolicy/prebuilts/api/33.0/private/coredomain.te
U_sprd_rls_vnd/system/sepolicy/prebuilts/api/33.0/private/property.te
U_sprd_rls_vnd/system/sepolicy/prebuilts/api/33.0/public/domain.te
U_sprd_rls_vnd/system/sepolicy/private/coredomain.te
U_sprd_rls_vnd/system/sepolicy/private/property.te
U_sprd_rls_vnd/system/sepolicy/public/domain.te
sprd的logo下标是通过LocalSocket跨进程在phasecheckserver.cpp保存的,所以要添加如下
U_sprd_rls_vnd/vendor/sprd/tools/phasecheckserver/engphasecheck.h
#define TYPE_WRITE_BOOTANIM 88
#define TYPE_READ_BOOTANIM 89
U_sprd_rls_vnd/vendor/sprd/tools/phasecheckserver/phasecheckserver.cpp
/*add by yanglh start*/
case TYPE_WRITE_BOOTANIM:
{
//write offset value
jint offset = data.readInt32();
jint write_count = data.readInt32();
char *value = (char *)malloc(write_count);
data.read(value,write_count);
ALOGD("phasecheck_sprd nativeservice write offset=%d,write_count=%d",offset, write_count);
int ret = eng_writeOffset(offset, write_count, value);
ALOGD("phasecheck_sprd nativeservice write ret=%d",ret);
free(value);
return NO_ERROR;
}
case TYPE_READ_BOOTANIM:
{
//read byte array with offset
jint offset = data.readInt32();
jint read_count = data.readInt32();
char *value = (char *)malloc(read_count);
ALOGD("phasecheck_sprd nativeservice read offset=%d,read_count=%d",offset,read_count);
int ret = eng_readOffset(offset, read_count, value);
ALOGD("phasecheck_sprd nativeservice read offset is 0x%x, ret = %d", value, ret);
reply->write(value, ret);
free(value);
return NO_ERROR;
}
/*add by yanglh end*/