APP应用操作
1、
fw_setenv update_flag 0
fw_setenv update_flag 0
2、
fw_printenv -n update_slot
如果为1---->升级分区mmcblk0p6
如果为0---->升级分区mmcblk0p5
升级方式dd升级(dd if=boot.img of=/dev/mmcblk0p5,dd if=boot.img of=/dev/mmcblk0p8)
在通过dd读取出来(dd if=/dev/mmcblk0p5 of=/work/boot.bak.ver bs=1M count=32),校验。是否相同
3、
fw_setenv update_flag 1
fw_setenv update_flag 1
4、
sync
reboot
内核操作,并将android_bootloader_boot_b_flow中的
+#if 1
+ unsigned long update_slot = 0,update_flag = 0;
+ update_slot = env_get_ulong("update_slot", 10, 0);
+ update_flag = env_get_ulong("update_flag", 10, 0);
+ if(update_flag == 1){
+ env_set_ulong("update_flag", 0);
+ env_set_ulong("update_slot", !!!update_slot);
+ }
+ if(update_slot == 0){
+ printf("BBBBBBBBBBBBBBBBB\n");
+ ret = android_bootloader_boot_b_flow(dev_desc, load_address);
+ if (ret < 0) {
+ printf("Android boot failed, error %d. will reset ....\n", ret);
+ run_command("reset", 0);
+ return CMD_RET_FAILURE;
+ }
+ }else{
+ printf("AAAAAAAAAAAAAAAAAA\n");
+ ret = android_bootloader_boot_flow(dev_desc, load_address);
+ if (ret < 0) {
+ printf("Android boot failed, error %d. will reset ....\n", ret);
+ run_command("reset", 0);
+ return CMD_RET_FAILURE;
+ }
+ }
+
在u-boot/include/configs/rk3568_common.h中增加两个属性
#define CONFIG_EXTRA_ENV_SETTINGS \
ENV_MEM_LAYOUT_SETTINGS \
"partitions=" PARTS_RKIMG \
ROCKCHIP_DEVICE_SETTINGS \
RKIMG_DET_BOOTDEV \
BOOTENV \
"update_slot=0\0" \
"update_flag=1\0"
#endif
系统烧录后第一次开机默认update_slot为0 ,update_flag为1,当系统启动的时候,uboot中,检测udate_flag为1,将update_flag设置为0(也就是不是升级模式下),并将update_slot取反。此时update_slot分区设置为1(app更新的是B分区)。但是此时update_slot启动的是A分区。(只是将update_slot设置为1了)。
应用层升级过程如上所示,为啥要设置两次,env分区保存两个地方,设置后读取需要(fw_printenv -n update_slot)需要更新那个分区,为0 则更新A分区,为1则更新B分区,通过dd写入,在dd读取,后进行校验。
+#!/bin/bash
+BOOT_UPGRADE_LOG="/work/app/tmp/log/boot_upgrade.log"
+CMD_GET_UPDATE_SLOT=`fw_printenv -n update_slot`
+BOOT_IMAGE_FILE="/work/app/image_patch/boot.img"
+BOOT_IMAGE_VER_FILE="/work/app/image_patch/boot.ver"
+BOOT_IMAGE_BAK_FILE="/work/boot.bak.ver"
+CUR_KERNEL_VERSION=`cat /sys/huidagpio/kernelver`
+
+
+
+function setupdate_falg
+{
+ fw_setenv update_flag $1
+ fw_setenv update_flag $1
+}
+
+function upgrade_boot
+{
+ SRC_BOOT_FILE_SIZE=`ls -l $BOOT_IMAGE_FILE | awk '{print $5}'`
+ SLOT_VALUE=$CMD_GET_UPDATE_SLOT
+ if [ "$SLOT_VALUE" == "1" ]; then
+ dd if=$BOOT_IMAGE_FILE of=/dev/mmcblk0p8
+ sync
+ dd if=/dev/mmcblk0p8 of=$BOOT_IMAGE_BAK_FILE bs=$SRC_BOOT_FILE_SIZE count=1
+ sync
+ diff $BOOT_IMAGE_BAK_FILE $BOOT_IMAGE_FILE
+ if [[ $? == 0 ]]; then
+ echo "sector 8 upgrade success" >> $BOOT_UPGRADE_LOG
+ setupdate_falg 1
+ rm -rf $BOOT_IMAGE_BAK_FILE
+ rm -rf $BOOT_IMAGE_FILE
+ sync
+ reboot -f
+ else
+ echo "sector 8 upgrade fail" >> $BOOT_UPGRADE_LOG
+ fi
+ elif [ "$SLOT_VALUE" == "0" ]; then
+ dd if=$BOOT_IMAGE_FILE of=/dev/mmcblk0p7
+ sync
+ dd if=/dev/mmcblk0p7 of=$BOOT_IMAGE_BAK_FILE bs=$SRC_BOOT_FILE_SIZE count=1
+ sync
+ diff $BOOT_IMAGE_BAK_FILE $BOOT_IMAGE_FILE
+ if [[ $? == 0 ]]; then
+ echo "sector 7 upgrade success" >> $BOOT_UPGRADE_LOG
+ setupdate_falg 1
+ rm -rf $BOOT_IMAGE_BAK_FILE
+ rm -rf $BOOT_IMAGE_FILE
+ sync
+ reboot -f
+ else
+ echo "sector 8 upgrade fail" >> $BOOT_UPGRADE_LOG
+ fi
+ else
+ echo "slot value is illegality $SLOT_VALUE" >> $BOOT_UPGRADE_LOG
+ fi
+}
+
+if [ -f $BOOT_IMAGE_FILE ];then
+ if [ -f $BOOT_IMAGE_VER_FILE ];then
+ EXPECT_KERNEL_VERSION=`cat $BOOT_IMAGE_VER_FILE`
+ if [ "$CUR_KERNEL_VERSION" == "$EXPECT_KERNEL_VERSION" ]; then
+ echo "version is same,not need upgrade $CUR_KERNEL_VERSION==$EXPECT_KERNEL_VERSION" >> $BOOT_UPGRADE_LOG
+ else
+ echo "version is diff,need upgrade $CUR_KERNEL_VERSION!=$EXPECT_KERNEL_VERSION" >> $BOOT_UPGRADE_LOG
+ if [ -f $BOOT_IMAGE_BAK_FILE ];then
+ rm -rf $BOOT_IMAGE_BAK_FILE
+ sync
+ fi
+ upgrade_boot
+ fi
+ else
+ echo "boot version file no exist,not need upgrade" >> $BOOT_UPGRADE_LOG
+ fi
+else
+ echo "boot file no exist,not need upgrade" >> $BOOT_UPGRADE_LOG
+fi