关于增加logo分区并支持直接刷bmp格式图片

产品需要给到客户去自定义开机logo并且不同的客户logo也不一样。所以我们需要同一个版本客户可以自定义开机logo。并需要方便的替换开机logo的图片。
可以参考RK吴工的博客【rockchip Android平台动态替换开机logo的实现】
我们的平台是rk3326 andorid9属于安卓低版本,并不支持在BoardConfig.mk直接添加分区。那我们就在分区表直接定义一个分区(不同的平台做法其实都差不多就是添加一个分区而已)
diff --git a/rk3326_pie/parameter.txt b/rk3326_pie/parameter.txt index f5eeb10..e4318c3 100755 --- a/rk3326_pie/parameter.txt +++ b/rk3326_pie/parameter.txt -00@0x00964c00(nvrom),-@0x0096cc00(userdata:grow) +000@0x00964c00(nvrom),0x00008000@0x0096cc00(logo),-@0x0096d400(userdata:grow) uuid:system=af01642c-9b84-11e8-9b2a-234eb5e198a0
然后我们开机的时候通过ls -l dev/block/by-name下会有一个logo分区。
因为RK已经实现了你有logo分区就会直接读logo分区里面的信息。有的平台是没有实现的可以去掉他原本加载logo图片的位置,然后使用(linxu根据分区名字获取分区信息的函数比如RK使用的函数是int part_get_info_by_name(struct blk_desc *dev_desc,const char *name, disk_partition_t *info); 返回的就是disk_partition_t 分区的一个结构体)
追一下part_get_info_by_name函数实际调用的是那个linux的自带的读分区函数

int part_get_info_by_name(struct blk_desc *dev_desc, const char *name,
        disk_partition_t *info)
{
   
   
        struct part_driver *part_drv;
        int ret;
        int i;

        part_drv = part_driver_lookup_type(dev_desc);
        if (!part_drv)
                return -1;
        for (i = 1; i < part_drv->max_entries; i++) {
   
   
                ret = part_drv->get_info(dev_desc, i, info);
                if (ret != 0) {
   
   
                        /* no more entries in table */
                        break;
                }
                if (strcmp(name, (const char *)info->name) == 0) {
   
   
                        /* matched */
                        return i;
                }
        }

        return -1;
}
实际调用的是part_drv->get_info,并匹配每一个分区的info->name跟"logo"匹配
匹配成功就返回getinfo的(info)结构体
.get_info	= part_get_info_ptr(part_get_info_rkparm),
static int part_get_info_rkparm(struct blk_desc *dev_desc, int idx,
		      disk_partition_t *info)
{
   
   
	struct list_head *node;
	struct rkparm_part *p = NULL;
	int part_num = 1;
	int ret = 0;

	if (idx < 1) {
   
   
		printf("%s Invalid partition no.%d\n", __func__, idx);
		return -EINVAL;
	}

	if (list_empty(&parts_head) ||
	    (dev_num != ((dev_desc->if_type << 8) + dev_desc->devnum)))
		ret = rkparm_init_param(dev_desc, &parts_head);

	if (ret) {
   
   
		printf("%s Invalid rkparm partition\n", __func__);
		return -1;
	}

	list_for_each(node, &parts_head) {
   
   
		p = list_entry(node, struct rkparm_part, node);
		if (idx == part_num)
			break;
		part_num ++;
	}

	if (part_num > idx) {
   
   
		printf("%s Invalid partition no.%d\n", __func__, idx);
		return -EINVAL;
	}

	info->start = p->start;
	info->size = p->size;
	info->blksz = dev_
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值