【rk356x】kernel升级功能

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值