failsafe_datachk.sh 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. # U-Boot with the datachk patchset requires image sizes, offsets,
  2. # and checksums to be provided in the U-Boot environment.
  3. # This script is based on the dualboot version for devices that come with 2 OS partitions.
  4. # For Senao boards with a "failsafe" partition image, the process is almost the same.
  5. # Instead of booting a secondary instalation on checksum failure,
  6. # the failsafe image is booted instead.
  7. # These boards also use the OKLI lzma kernel loader and mtd-concat
  8. # So the kernel check is for the loader, the rootfs check is for kernel + rootfs
  9. platform_do_upgrade_failsafe_datachk() {
  10. local flash_base=0x9f000000
  11. local kernel_mtd=$(find_mtd_index ${KERNEL_PART:-kernel})
  12. local rootfs_mtd=$(find_mtd_index ${ROOTFS_PART:-rootfs})
  13. local kernel_offset=$(cat /sys/class/mtd/mtd${kernel_mtd}/offset)
  14. local rootfs_offset=$(cat /sys/class/mtd/mtd${rootfs_mtd}/offset)
  15. if [ -n "$IMAGE_LIST" ]; then
  16. KERNEL_FILE=$($IMAGE_LIST | grep $KERNEL_FILE)
  17. ROOTFS_FILE=$($IMAGE_LIST | grep $ROOTFS_FILE)
  18. fi
  19. local kernel_size=$($IMAGE_CMD $KERNEL_FILE | wc -c)
  20. local rootfs_size=$($IMAGE_CMD $ROOTFS_FILE | wc -c)
  21. # rootfs without JFFS2
  22. local rootfs_blocks=$((rootfs_size / 4096))
  23. rootfs_size=$((rootfs_blocks * 4096))
  24. local kernel_md5=$($IMAGE_CMD $KERNEL_FILE | md5sum | cut -d ' ' -f1)
  25. local rootfs_md5=$($IMAGE_CMD $ROOTFS_FILE | dd bs=4k count=$rootfs_blocks iflag=fullblock | md5sum | cut -d ' ' -f1)
  26. # prepare new u-boot-env vars
  27. printf "vmlinux_start_addr 0x%08x\n" $((flash_base + kernel_offset)) >> $ENV_SCRIPT
  28. printf "vmlinux_size 0x%08x\n" ${kernel_size} >> $ENV_SCRIPT
  29. printf "vmlinux_checksum %s\n" ${kernel_md5} >> $ENV_SCRIPT
  30. printf "rootfs_start_addr 0x%08x\n" $((flash_base + rootfs_offset)) >> $ENV_SCRIPT
  31. printf "rootfs_size 0x%08x\n" ${rootfs_size} >> $ENV_SCRIPT
  32. printf "rootfs_checksum %s\n" ${rootfs_md5} >> $ENV_SCRIPT
  33. # store u-boot-env
  34. mkdir -p /var/lock
  35. [ -n "$SKIP_HASH" ] || fw_setenv -s $ENV_SCRIPT || {
  36. echo 'failed to update U-Boot environment'
  37. exit 1
  38. }
  39. # sysupgrade
  40. sleep 2 && sync && echo 3 > /proc/sys/vm/drop_caches
  41. $IMAGE_CMD $KERNEL_FILE | mtd $MTD_ARGS write - ${KERNEL_PART:-kernel}
  42. sleep 2 && sync && echo 3 > /proc/sys/vm/drop_caches
  43. if [ -n "$UPGRADE_BACKUP" ]; then
  44. $IMAGE_CMD $ROOTFS_FILE | mtd $MTD_ARGS $MTD_CONFIG_ARGS -j $UPGRADE_BACKUP write - ${ROOTFS_PART:-rootfs}
  45. else
  46. $IMAGE_CMD $ROOTFS_FILE | mtd $MTD_ARGS write - ${ROOTFS_PART:-rootfs}
  47. fi
  48. sync
  49. }