ipq806x/nbg6817: add sysupgrade support
authorAndré Valentin <avalentin@marcant.net>
Tue, 25 Oct 2016 06:40:36 +0000 (08:40 +0200)
committerJohn Crispin <john@phrozen.org>
Wed, 26 Oct 2016 10:37:47 +0000 (12:37 +0200)
Add new way of flashing to mmc devices based on rootfs split with loop devices.

Signed-off-by: André Valentin <avalentin@marcant.net>
target/linux/ipq806x/base-files/lib/upgrade/platform.sh
target/linux/ipq806x/base-files/lib/upgrade/zyxel.sh [new file with mode: 0644]

index 87689306531accb13114e742db873bfdc5de93c2..53cdc874cdf177c708bcdc366d5d05ab83cf5f03 100644 (file)
@@ -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 (file)
index 0000000..fc48cb1
--- /dev/null
@@ -0,0 +1,87 @@
+#
+# Copyright (C) 2016 lede-project.org
+#
+
+zyxel_get_rootfs() {
+       local rootfsdev
+
+       if read cmdline < /proc/cmdline; then
+               case "$cmdline" in
+                       *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
+
+       # 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}"
+
+       # a padded rootfs is needed for overlay fs creation
+       local offset=$(tar xf $tar_file sysupgrade-$board/root -O | wc -c)
+       [ $offset -lt 65536 ] && {
+               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
+}