ath79: add Senao 'failsafe' sysupgrade procedure
[openwrt/openwrt.git] / target / linux / ath79 / tiny / base-files / lib / upgrade / failsafe_datachk.sh
diff --git a/target/linux/ath79/tiny/base-files/lib/upgrade/failsafe_datachk.sh b/target/linux/ath79/tiny/base-files/lib/upgrade/failsafe_datachk.sh
new file mode 100644 (file)
index 0000000..de84233
--- /dev/null
@@ -0,0 +1,64 @@
+# U-Boot with the datachk patchset requires image sizes, offsets,
+# and checksums to be provided in the U-Boot environment.
+# This script is based on the dualboot version for devices that come with 2 OS partitions.
+# For Senao boards with a "failsafe" partition image, the process is almost the same.
+# Instead of booting a secondary instalation on checksum failure,
+# the failsafe image is booted instead.
+# These boards also use the OKLI lzma kernel loader and mtd-concat
+# So the kernel check is for the loader, the rootfs check is for kernel + rootfs
+
+platform_do_upgrade_failsafe_datachk() {
+       local setenv_script="/tmp/fw_env_upgrade"
+
+       local flash_base=0x9f000000
+
+       local kernel_mtd=$(find_mtd_index ${KERNEL_PART:-kernel})
+       local rootfs_mtd=$(find_mtd_index ${ROOTFS_PART:-rootfs})
+
+       local kernel_offset=$(cat /sys/class/mtd/mtd${kernel_mtd}/offset)
+       local rootfs_offset=$(cat /sys/class/mtd/mtd${rootfs_mtd}/offset)
+
+       if [ -n "$IMAGE_LIST" ]; then
+               KERNEL_FILE=$($IMAGE_LIST | grep $KERNEL_FILE)
+               ROOTFS_FILE=$($IMAGE_LIST | grep $ROOTFS_FILE)
+       fi
+
+       local kernel_size=$($IMAGE_CMD $KERNEL_FILE | wc -c)
+       local rootfs_size=$($IMAGE_CMD $ROOTFS_FILE | wc -c)
+
+       # rootfs without JFFS2
+       local rootfs_blocks=$((rootfs_size / 4096))
+       rootfs_size=$((rootfs_blocks * 4096))
+
+       local kernel_md5=$($IMAGE_CMD $KERNEL_FILE | md5sum | cut -d ' ' -f1)
+       local rootfs_md5=$($IMAGE_CMD $ROOTFS_FILE | dd bs=4k count=$rootfs_blocks iflag=fullblock | md5sum | cut -d ' ' -f1)
+
+       # prepare new u-boot-env vars
+       printf "vmlinux_start_addr 0x%08x\n" $((flash_base + kernel_offset)) >> $setenv_script
+       printf "vmlinux_size 0x%08x\n" ${kernel_size} >> $setenv_script
+       printf "vmlinux_checksum %s\n" ${kernel_md5} >> $setenv_script
+
+       printf "rootfs_start_addr 0x%08x\n" $((flash_base + rootfs_offset)) >> $setenv_script
+       printf "rootfs_size 0x%08x\n" ${rootfs_size} >> $setenv_script
+       printf "rootfs_checksum %s\n" ${rootfs_md5} >> $setenv_script
+
+       # store u-boot-env
+       mkdir -p /var/lock
+       fw_setenv -s $setenv_script || {
+               echo 'failed to update U-Boot environment'
+               exit 1
+       }
+
+       # sysupgrade
+       sleep 2
+       sync
+       echo 3 > /proc/sys/vm/drop_caches
+       $IMAGE_CMD $KERNEL_FILE | mtd $MTD_ARGS write - ${KERNEL_PART:-kernel}
+       sleep 2
+       sync
+       if [ -n "$UPGRADE_BACKUP" ]; then
+               $IMAGE_CMD $ROOTFS_FILE | mtd $MTD_ARGS $MTD_CONFIG_ARGS -j $UPGRADE_BACKUP write - ${ROOTFS_PART:-rootfs}
+       else
+               $IMAGE_CMD $ROOTFS_FILE | mtd $MTD_ARGS write - ${ROOTFS_PART:-rootfs}
+       fi
+}