[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