diff options
Diffstat (limited to 'package/base-files/files/lib')
-rw-r--r-- | package/base-files/files/lib/upgrade/emmc.sh | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/package/base-files/files/lib/upgrade/emmc.sh b/package/base-files/files/lib/upgrade/emmc.sh new file mode 100644 index 0000000000..15fa370cd9 --- /dev/null +++ b/package/base-files/files/lib/upgrade/emmc.sh @@ -0,0 +1,64 @@ +# Copyright (C) 2021 OpenWrt.org +# + +. /lib/functions.sh + +emmc_upgrade_tar() { + local tar_file="$1" + [ "$CI_KERNPART" -a -z "$EMMC_KERN_DEV" ] && export EMMC_KERN_DEV="$(find_mmc_part $CI_KERNPART $CI_ROOTDEV)" + [ "$CI_ROOTPART" -a -z "$EMMC_ROOT_DEV" ] && export EMMC_ROOT_DEV="$(find_mmc_part $CI_ROOTPART $CI_ROOTDEV)" + [ "$CI_DATAPART" -a -z "$EMMC_DATA_DEV" ] && export EMMC_DATA_DEV="$(find_mmc_part $CI_DATAPART $CI_ROOTDEV)" + local has_kernel + local has_rootfs + local board_dir=$(tar tf "$tar_file" | grep -m 1 '^sysupgrade-.*/$') + board_dir=${board_dir%/} + + tar tf "$tar_file" ${board_dir}/kernel 1>/dev/null 2>/dev/null && has_kernel=1 + tar tf "$tar_file" ${board_dir}/root 1>/dev/null 2>/dev/null && has_rootfs=1 + + [ "$has_kernel" = 1 -a "$EMMC_KERN_DEV" ] && + export EMMC_KERNEL_BLOCKS=$(($(tar xf "$tar_file" ${board_dir}/kernel -O | dd of="$EMMC_KERN_DEV" bs=512 2>&1 | grep "records out" | cut -d' ' -f1))) + + [ "$has_rootfs" = 1 -a "$EMMC_ROOT_DEV" ] && + export EMMC_ROOTFS_BLOCKS=$(($(tar xf "$tar_file" ${board_dir}/root -O | dd of="$EMMC_ROOT_DEV" bs=512 2>&1 | grep "records out" | cut -d' ' -f1))) + + if [ -z "$UPGRADE_BACKUP" ]; then + if [ "$EMMC_DATA_DEV" ]; then + dd if=/dev/zero of="$EMMC_DATA_DEV" bs=512 count=8 + elif [ "$EMMC_ROOTFS_BLOCKS" ]; then + dd if=/dev/zero of="$EMMC_ROOT_DEV" bs=512 seek=$EMMC_ROOTFS_BLOCKS count=8 + elif [ "$EMMC_KERNEL_BLOCKS" ]; then + dd if=/dev/zero of="$EMMC_KERN_DEV" bs=512 seek=$EMMC_KERNEL_BLOCKS count=8 + fi + fi +} + +emmc_upgrade_fit() { + local fit_file="$1" + [ "$CI_KERNPART" -a -z "$EMMC_KERN_DEV" ] && export EMMC_KERN_DEV="$(find_mmc_part $CI_KERNPART $CI_ROOTDEV)" + + if [ "$EMMC_KERN_DEV" ]; then + export EMMC_KERNEL_BLOCKS=$(($(get_image "$fit_file" | fwtool -i /dev/null -T - | dd of="$EMMC_KERN_DEV" bs=512 2>&1 | grep "records out" | cut -d' ' -f1))) + + [ -z "$UPGRADE_BACKUP" ] && dd if=/dev/zero of="$EMMC_KERN_DEV" bs=512 seek=$EMMC_KERNEL_BLOCKS count=8 + fi +} + +emmc_copy_config() { + if [ "$EMMC_DATA_DEV" ]; then + dd if="$UPGRADE_BACKUP" of="$EMMC_DATA_DEV" bs=512 + elif [ "$EMMC_ROOTFS_BLOCKS" ]; then + dd if="$UPGRADE_BACKUP" of="$EMMC_ROOT_DEV" bs=512 seek=$EMMC_ROOTFS_BLOCKS + elif [ "$EMMC_KERNEL_BLOCKS" ]; then + dd if="$UPGRADE_BACKUP" of="$EMMC_KERN_DEV" bs=512 seek=$EMMC_KERNEL_BLOCKS + fi +} + +emmc_do_upgrade() { + local file_type=$(identify $1) + + case "$file_type" in + "fit") emmc_upgrade_fit $1;; + *) emmc_upgrade_tar $1;; + esac +} |