[LEDE-DEV] [PATCH v3 3/5] ipq806x/nbg6817: add sysupgrade support

André Valentin avalentin at marcant.net
Sun Oct 23 07:25:31 PDT 2016


Add new way of flashing to mmc devices based on rootfs split with loop devices.

Signed-off-by: André Valentin <avalentin at marcant.net>
---
 .../ipq806x/base-files/lib/upgrade/platform.sh     | 12 +++
 .../linux/ipq806x/base-files/lib/upgrade/zyxel.sh  | 94 ++++++++++++++++++++++
 2 files changed, 106 insertions(+)
 create mode 100644 target/linux/ipq806x/base-files/lib/upgrade/zyxel.sh

diff --git a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
index 8768930..53cdc87 100644
--- a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
@@ -9,6 +9,7 @@ platform_check_image() {
 	ap148 |\
 	d7800 |\
 	ea8500 |\
+	nbg6817 |\
 	r7500 |\
 	r7500v2 |\
 	r7800)
@@ -34,6 +35,7 @@ platform_pre_upgrade() {
 	case "$board" in
 	ap148 |\
 	d7800 |\
+	nbg6817 |\
 	r7500 |\
 	r7500v2 |\
 	r7800)
@@ -60,6 +62,16 @@ platform_do_upgrade() {
 	esac
 }
 
+platform_nand_pre_upgrade() {
+	local board=$(ipq806x_board_name)
+
+	case "$board" in
+	nbg6817)
+		zyxel_do_upgrade "$1"
+		;;
+	esac
+}
+
 blink_led() {
 	. /etc/diag.sh; set_state upgrade
 }
diff --git a/target/linux/ipq806x/base-files/lib/upgrade/zyxel.sh b/target/linux/ipq806x/base-files/lib/upgrade/zyxel.sh
new file mode 100644
index 0000000..d228dab
--- /dev/null
+++ b/target/linux/ipq806x/base-files/lib/upgrade/zyxel.sh
@@ -0,0 +1,94 @@
+#
+# Copyright (C) 2016 lede-project.org
+#
+
+zyxel_get_rootfs() {
+	local rootfsdev
+
+	if read cmdline < /proc/cmdline; then
+		case "$cmdline" in
+			*block2mtd=*)
+				rootfsdev="${cmdline##*block2mtd=}"
+				rootfsdev="${rootfsdev%%,*}"
+			;;
+			*root=*)
+				rootfsdev="${cmdline##*root=}"
+				rootfsdev="${rootfsdev%% *}"
+			;;
+		esac
+
+		echo "${rootfsdev}"
+	fi
+}
+
+zyxel_do_flash() {
+	local tar_file=$1
+	local board=$2
+	local kernel=$3
+	local rootfs=$4
+	local blocksize=65536
+
+	# keep sure its unbound
+	losetup --detach-all || {
+		echo Failed to detach all loop devices. Skip this try.
+		reboot -f
+	}
+
+	echo "flashing kernel to /dev/${kernel}"
+	tar xf $tar_file sysupgrade-$board/kernel -O >/dev/$kernel
+
+	echo "flashing rootfs to ${rootfs}"
+	tar xf $tar_file sysupgrade-$board/root -O >"${rootfs}"
+
+	local offset=$(tar xf $tar_file sysupgrade-$board/root -O | wc -c)
+	offset=$(( (($offset + $blocksize - 1) / $blocksize) * $blocksize ))
+
+	# Sanity
+	[ $offset -lt $blocksize ] && {
+		echo Wrong size for rootfs: $offset
+		sleep 10
+		reboot -f
+	}
+
+	# Mount loop for rootfs_data
+	losetup -o $offset /dev/loop0 "${rootfs}" || {
+		echo "Failed to mount looped rootfs_data."
+		sleep 10
+		reboot -f
+	}
+
+	echo "Format new rootfs_data at position ${offset}."
+	mkfs.ext4 -F -L rootfs_data /dev/loop0
+	mkdir /tmp/new_root
+	mount -t ext4 /dev/loop0 /tmp/new_root  && {
+		echo "Saving config to rootfs_data at position ${offset}."
+		cp -v /tmp/sysupgrade.tgz /tmp/new_root/
+		umount /tmp/new_root
+	}
+
+	# Cleanup
+	losetup -d /dev/loop0 >/dev/null 2>&1
+	sync
+	umount -a
+	reboot -f
+}
+
+zyxel_do_upgrade() {
+	local tar_file="$1"
+	local board=$(cat /tmp/sysinfo/board_name)
+	local rootfs="$(zyxel_get_rootfs)"
+	local kernel=
+
+	[ -b "${rootfs}" ] || return 1
+	case "$board" in
+	nbg6817)
+		kernel=mmcblk0p4
+		;;
+	*)
+		return 1
+	esac
+
+	zyxel_do_flash $tar_file $board $kernel $rootfs
+
+	return 0
+}
-- 
2.1.4




More information about the Lede-dev mailing list