From 1465bebd74537fc38d1b4457a331331d58ca6d43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Valentin?= Date: Tue, 25 Oct 2016 08:40:36 +0200 Subject: [PATCH] ipq806x/nbg6817: add sysupgrade support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add new way of flashing to mmc devices based on rootfs split with loop devices. Signed-off-by: André Valentin --- .../base-files/lib/upgrade/platform.sh | 12 +++ .../ipq806x/base-files/lib/upgrade/zyxel.sh | 87 +++++++++++++++++++ 2 files changed, 99 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 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 +}