aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ipq806x/base-files/lib/upgrade
diff options
context:
space:
mode:
authorAndré Valentin <avalentin@marcant.net>2016-10-25 08:40:36 +0200
committerJohn Crispin <john@phrozen.org>2016-10-26 12:37:47 +0200
commit1465bebd74537fc38d1b4457a331331d58ca6d43 (patch)
tree5050c580c991143da0ab80a21c46c26de45ee7ea /target/linux/ipq806x/base-files/lib/upgrade
parentd8059e3a306ab74b7b6eadace8566a69798bf787 (diff)
downloadupstream-1465bebd74537fc38d1b4457a331331d58ca6d43.tar.gz
upstream-1465bebd74537fc38d1b4457a331331d58ca6d43.tar.bz2
upstream-1465bebd74537fc38d1b4457a331331d58ca6d43.zip
ipq806x/nbg6817: add sysupgrade support
Add new way of flashing to mmc devices based on rootfs split with loop devices. Signed-off-by: André Valentin <avalentin@marcant.net>
Diffstat (limited to 'target/linux/ipq806x/base-files/lib/upgrade')
-rw-r--r--target/linux/ipq806x/base-files/lib/upgrade/platform.sh12
-rw-r--r--target/linux/ipq806x/base-files/lib/upgrade/zyxel.sh87
2 files changed, 99 insertions, 0 deletions
diff --git a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
index 8768930653..53cdc874cd 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 0000000000..fc48cb1d02
--- /dev/null
+++ b/target/linux/ipq806x/base-files/lib/upgrade/zyxel.sh
@@ -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
+}