新增开机logo

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*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值