[openwrt/openwrt] mediatek: Implement sysupgrade support for Banana Pi R2

LEDE Commits lede-commits at lists.infradead.org
Wed Jul 8 17:23:00 EDT 2020


ynezz pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/af9932c9b7b94417d46ba59439793514e93ba8a6

commit af9932c9b7b94417d46ba59439793514e93ba8a6
Author: David Woodhouse <dwmw2 at infradead.org>
AuthorDate: Mon Jun 15 17:48:19 2020 +0100

    mediatek: Implement sysupgrade support for Banana Pi R2
    
    Based on work by Alexey Loukianov <lx2 at lexa2.ru> and others.
    
    Signed-off-by: David Woodhouse <dwmw2 at infradead.org>
---
 target/linux/mediatek/image/Config.in              |   2 +-
 .../mt7623/base-files/lib/preinit/79_move_config   |  20 +++-
 .../mt7623/base-files/lib/upgrade/platform.sh      | 118 +++++++++++++++++++--
 3 files changed, 128 insertions(+), 12 deletions(-)

diff --git a/target/linux/mediatek/image/Config.in b/target/linux/mediatek/image/Config.in
index f32f83c321..0e5449e2f9 100644
--- a/target/linux/mediatek/image/Config.in
+++ b/target/linux/mediatek/image/Config.in
@@ -1,4 +1,4 @@
 config BANANA_PI_BOOT_PARTSIZE
        int "Boot (SD Card) filesystem partition size (in MiB)"
-       depends on TARGET_mediatek_mt7623_DEVICE_bpi_bananapi-r2
+       depends on TARGET_mediatek_mt7623_DEVICE_bpi_bananapi-r2 || TARGET_DEVICE_mediatek_mt7623_DEVICE_bpi_bananapi-r2
        default 32
diff --git a/target/linux/mediatek/mt7623/base-files/lib/preinit/79_move_config b/target/linux/mediatek/mt7623/base-files/lib/preinit/79_move_config
index 895240a3bc..cbb6c604c8 100644
--- a/target/linux/mediatek/mt7623/base-files/lib/preinit/79_move_config
+++ b/target/linux/mediatek/mt7623/base-files/lib/preinit/79_move_config
@@ -2,16 +2,28 @@
 
 . /lib/upgrade/common.sh
 
-RECOVERY_PART=/dev/mmcblk0p1
-
 move_config() {
-	if [ -b $RECOVERY_PART ]; then
+	local partdev partnum
+
+	case $(board_name) in
+	bananapi,bpi-r2)
+		partnum=2
+		;;
+	unielec,u7623-02-emmc-512m)
+		partnum=1
+		;;
+	*)
+		return 1
+		;;
+	esac
+
+	if export_bootdevice && export_partdevice partdev $partnum; then
 		insmod nls_cp437
 		insmod nls_iso8859-1
 		insmod fat
 		insmod vfat
 		mkdir -p /recovery
-		mount -o rw,noatime $RECOVERY_PART /recovery
+		mount -o rw,noatime "/dev/$partdev" -t vfat /recovery
 		[ -f "/recovery/$BACKUP_FILE" ] && mv -f "/recovery/$BACKUP_FILE" /
 		umount /recovery
 	fi
diff --git a/target/linux/mediatek/mt7623/base-files/lib/upgrade/platform.sh b/target/linux/mediatek/mt7623/base-files/lib/upgrade/platform.sh
index 225fec0bca..2b37846456 100755
--- a/target/linux/mediatek/mt7623/base-files/lib/upgrade/platform.sh
+++ b/target/linux/mediatek/mt7623/base-files/lib/upgrade/platform.sh
@@ -2,6 +2,75 @@ platform_do_upgrade() {
 	local board=$(board_name)
 
 	case "$board" in
+	bananapi,bpi-r2)
+		local diskdev partdev diff
+
+		export_bootdevice && export_partdevice diskdev 0 || {
+			echo "Unable to determine upgrade device"
+			return 1
+		}
+
+		#Keep the persistent random mac address (if it exists)
+		mkdir -p /tmp/recovery
+		export_partdevice recoverydev 2
+		if mount -o rw,noatime "/dev/$recoverydev" -tvfat /tmp/recovery; then
+			[ -f "/tmp/recovery/mac_addr" ] && cp /tmp/recovery/mac_addr /tmp/
+			umount /tmp/recovery
+		fi
+		sync
+
+		if [ "$SAVE_PARTITIONS" = "1" ]; then
+			get_partitions "/dev/$diskdev" bootdisk
+
+			#extract the boot sector from the image
+			get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b
+
+			get_partitions /tmp/image.bs image
+
+			#compare tables
+			diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
+		else
+			diff=1
+		fi
+
+		if [ -n "$diff" ]; then
+			get_image "$@" | dd of="/dev/$diskdev" bs=4096 conv=fsync
+
+			# Separate removal and addtion is necessary; otherwise, partition 1
+			# will be missing if it overlaps with the old partition 2
+			partx -d - "/dev/$diskdev"
+			partx -a - "/dev/$diskdev"
+		else
+			#iterate over each partition from the image and write it to the boot disk
+			while read part start size; do
+				part="$(($part - 2))"
+				if export_partdevice partdev $part; then
+					echo "Writing image to /dev/$partdev..."
+					get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync
+				else
+				    echo "Unable to find partition $part device, skipped."
+				fi
+			done < /tmp/partmap.image
+
+			#copy partition uuid
+			echo "Writing new UUID to /dev/$diskdev..."
+			get_image "$@" | dd of="/dev/$diskdev" bs=1 skip=440 count=4 seek=440 conv=fsync
+		fi
+
+		if mount -o rw,noatime "/dev/$recoverydev" -t vfat /tmp/recovery; then
+			[ -f "/tmp/mac_addr" ] && cp /tmp/mac_addr /tmp/recovery
+
+			if [ "$diskdev" = "mmcblk0" -a -r /tmp/recovery/eMMCboot.bin ]; then
+				echo 0 > /sys/block/mmcblk0boot0/force_ro
+				dd if=/tmp/recovery/eMMCboot.bin of=/dev/mmcblk0boot0 conv=fsync
+				sync
+				echo 1 > /sys/block/mmcblk0boot0/force_ro
+			fi
+			sync
+			umount /tmp/recovery
+		fi
+		;;
+
 	unielec,u7623-02-emmc-512m)
 		#Keep the persisten random mac address (if it exists)
 		mkdir -p /tmp/recovery
@@ -30,11 +99,39 @@ PART_NAME=firmware
 platform_check_image() {
 	local board=$(board_name)
 	local magic="$(get_magic_long "$1")"
+	local diskdev partdev diff
 
 	[ "$#" -gt 1 ] && return 1
 
 	case "$board" in
-	bananapi,bpi-r2|\
+	bananapi,bpi-r2)
+		[ "$magic" != "53444d4d" ] && {
+			echo "Invalid image type."
+			return 1
+		}
+		export_bootdevice && export_partdevice diskdev 0 || {
+			echo "Unable to determine upgrade device"
+			return 1
+		    }
+
+		get_partitions "/dev/$diskdev" bootdisk
+
+		#extract the boot sector from the image
+		get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b 2>/dev/null
+
+		get_partitions /tmp/image.bs image
+
+		#compare tables
+		diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
+
+		rm -f /tmp/image.bs /tmp/partmap.bootdisk /tmp/partmap.image
+
+		if [ -n "$diff" ]; then
+			echo "Partition layout has changed. Full image will be written."
+			ask_bool 0 "Abort" && exit 1
+			return 0
+		fi
+		;;
 	unielec,u7623-02-emmc-512m)
 		[ "$magic" != "27051956" ] && {
 			echo "Invalid image type."
@@ -52,17 +149,24 @@ platform_check_image() {
 }
 
 platform_copy_config_emmc() {
-	mkdir -p /recovery
-	mount -o rw,noatime /dev/mmcblk0p1 /recovery
-	cp -af "$UPGRADE_BACKUP" "/recovery/$BACKUP_FILE"
-	sync
-	umount /recovery
+	local partdev
+
+	if export_bootdevice && export_partdevice partdev $1; then
+		mkdir -p /recovery
+		mount -o rw,noatime "/dev/$partdev" -t vfat /recovery
+		cp -af "$UPGRADE_BACKUP" "/recovery/$BACKUP_FILE"
+		sync
+		umount /recovery
+	fi
 }
 
 platform_copy_config() {
 	case "$(board_name)" in
+	bananapi,bpi-r2)
+		platform_copy_config_emmc 2
+		;;
 	unielec,u7623-02-emmc-512m)
-		platform_copy_config_emmc
+		platform_copy_config_emmc 1
 		;;
 	esac
 }



More information about the lede-commits mailing list