diff options
Diffstat (limited to 'target/linux/mediatek/mt7622/base-files/lib/upgrade/platform.sh')
-rwxr-xr-x | target/linux/mediatek/mt7622/base-files/lib/upgrade/platform.sh | 63 |
1 files changed, 51 insertions, 12 deletions
diff --git a/target/linux/mediatek/mt7622/base-files/lib/upgrade/platform.sh b/target/linux/mediatek/mt7622/base-files/lib/upgrade/platform.sh index 2cea6ce378..07efe13363 100755 --- a/target/linux/mediatek/mt7622/base-files/lib/upgrade/platform.sh +++ b/target/linux/mediatek/mt7622/base-files/lib/upgrade/platform.sh @@ -1,15 +1,52 @@ -RAMFS_COPY_BIN='fw_printenv fw_setenv' +RAMFS_COPY_BIN='fw_printenv fw_setenv blockdev' RAMFS_COPY_DATA='/etc/fw_env.config /var/lock/fw_printenv.lock' +get_cmdline_var() { + local var=$1 + local cmdlinevar tmp + local cmdline="$(cat /proc/cmdline)" + + for cmdlinevar in $cmdline; do + tmp=${cmdlinevar##${var}} + [ "=" = "${tmp:0:1}" ] && echo ${tmp:1} + done +} + +get_rootdev() { + local rootvol rootdev + rootvol=$(get_cmdline_var root) + rootvol=$(basename $rootvol) + [ -e /sys/class/block/$rootvol/partition ] || { + echo $rootvol + return + } + rootdev=$(busybox readlink -f /sys/class/block/$rootvol) + rootdev=$(basename ${rootdev%%/${rootvol}}) + [ -e /sys/class/block/$rootdev ] && echo $rootdev +} + +get_partition() { + for partname in /sys/class/block/$1/*/name; do + [ "$(cat ${partname})" = "$2" ] && { + basename ${partname%%/name} + break + } + done +} + platform_do_upgrade() { local board=$(board_name) local file_type=$(identify $1) case "$board" in - bananapi,bpi-r64-rootdisk) - #2097152=0x200000 is the offset in bytes from the start - #of eMMC and to the location of the kernel - get_image "$1" | dd of=/dev/mmcblk0 bs=2097152 seek=1 conv=fsync + bananapi,bpi-r64) + local rootdev=$(get_rootdev) + local fitpart=$(get_partition $rootdev production) + [ "$fitpart" ] || exit 1 + dd if=/dev/zero of=/dev/$fitpart bs=4096 count=1 2>/dev/null + blockdev --rereadpt /dev/$rootdev + get_image "$1" | dd of=/dev/$fitpart + echo $rootdev > /tmp/sysupgrade.rootdev ;; linksys,e8450-ubi|\ mediatek,mt7622,ubi) @@ -51,18 +88,20 @@ platform_check_image() { return 0 } -platform_copy_config_emmc() { - mkdir -p /recovery - mount -o rw,noatime /dev/mmcblk0p6 /recovery - cp -af "$UPGRADE_BACKUP" "/recovery/$BACKUP_FILE" +platform_copy_config_mmc() { + local rootdev=$(cat /tmp/sysupgrade.rootdev) + blockdev --rereadpt /dev/$rootdev + local datadev=$(get_partition $rootdev rootfs_data) + [ "$datadev" ] || echo "no rootfs_data partition, cannot keep configuration." >&2 + dd if="$UPGRADE_BACKUP" of=/dev/$datadev sync - umount /recovery + sleep 4 } platform_copy_config() { case "$(board_name)" in - bananapi,bpi-r64-rootdisk) - platform_copy_config_emmc + bananapi,bpi-r64) + platform_copy_config_mmc ;; esac } |