产品需要给到客户去自定义开机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