1、背景:
OH master 主线 ,RK3568平台添加AB分区功能,uboot部分完成对ab分区标志位的读取解析,并加载和进入对应的分区,如: kernel_a 或者 kernel_b
2、环境:
rk3568 Uboot代码下载:
https://gitee.com/organizations/hihope-rockchip/projects
编译:
device_rockchip_third_party_uboot 改名为uboot
device_rockchip_third_party_rkbin 改名为rkbin
将它们放在同一级目录下:
在uboot下执行: make.sh rk3568
3、完成AB分区功能的解题思路:
、机器在正常开机使用状态,上层可以往bootctrl分区写入启动分区的flag
编辑此区域
、机器重启时会读取bootctrl分区内的flag标志,确认启动的具体分区
编辑此区域
、具体细节思路
4、uboot部分工作:
、从emmc中读取到bootctrl分区
、从bootctrl分区中读取到bootslot标志值
从emmc flash中读取到有_a或者_b后缀名的分区
通过bootslot值判断是A分区还是B分区,然后拷贝对应的镜像到它的内存地址
5、编译部分添加enable_absystem宏控制是否使能此功能
、vendor下的rk3568/config.json中添加宏定义开关
build下面添加enable_absystem宏的传递:
hb_internal/preloader/preloader.py && config/BUILDCONFIG.gn && tools/product_config_version_convert.py 中添加对应的值传递
在device下面接收enable_absystem宏的值,来判断在我们的编译产物中需要哪些镜像
rk3568/kernel/BUILD.gn中:
if (enable_absystem) {
args += [ "enable_absystem" ]
}
rk3568/kernel/build_kernel.sh中:
if [ "enable_absystem" == "${12}" ]; then
cp ${3}/loader/parameter_ab.txt ${2}/parameter_ab.txt
cp ${3}/loader/config_ab.cfg ${2}/config_ab.cfg
else
cp ${3}/loader/parameter.txt ${2}/parameter.txt
cp ${3}/loader/config.cfg ${2}/config.cfg
fi
6、修改分区表和工具配置cfg
新增 rk3568/loader/config_ab.cfg && rk3568/loader/parameter_ab.txt文件来作为ab分区的配置文件
分区表修改,添加bootctrl分区,重新划分flah地址
7、在cmdline中添加bootctrl分区
bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 hardware=rk3568 default_boot_device=fe310000.sdhci rw rootwait ohos.required_mount.system=/dev/block/platform/fe310000.sdhci/by-name/system@/usr@ext4@ro,barrier=1@wait,required ohos.required_mount.vendor=/dev/block/platform/fe310000.sdhci/by-name/vendor@/vendor@ext4@ro,barrier=1@wait,required ohos.required_mount.misc=/dev/block/platform/fe310000.sdhci/by-name/misc@none@none@none@wait,required ohos.required_mount.bootctrl=/dev/block/platform/fe310000.sdhci/by-name/bootctrl@none@none@none@wait,required";
8、bootctrl分区内容读取地址注意
在上层的interfaces/innerkits/fs_manager/fstab_mount.c文件中,有对bootctrl分区的写入操作,需要注意写入地址,需要按照uboot读取方式去写,uboot下是按照块来读的,所以在这里需要是块size大小的倍数:
const off_t PARTITION_ACTIVE_SLOT_OFFSET = 1024;
uboot中common/bootctrl/bootctrl.h定义:
#define BOOTCTRL_AB_PARTITION_CURRENT_SLOT_OFFSET (1024/512)
common/bootctrl/bootctrl.c中读取:
int read_ab_slot(struct blk_desc *dev_desc, int32_t *value, u32 size)
{
return read_bootctrl_partition(dev_desc, BOOTCTRL_AB_PARTITION_CURRENT_SLOT_OFFSET, value, size);
}