zyxel_do_flash() {
local tar_file=$1
- local board=$2
- local kernel=$3
- local rootfs=$4
+ local kernel=$2
+ local rootfs=$3
+ local dualflagmtd=$4
# keep sure its unbound
losetup --detach-all || {
reboot -f
}
- echo "flashing kernel to /dev/${kernel}"
- tar xf $tar_file sysupgrade-$board/kernel -O >/dev/$kernel
+ # use the first found directory in the tar archive
+ local board_dir=$(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$')
+ board_dir=${board_dir%/}
+
+ echo "flashing kernel to $kernel"
+ tar xf $tar_file ${board_dir}/kernel -O >$kernel
echo "flashing rootfs to ${rootfs}"
- tar xf $tar_file sysupgrade-$board/root -O >"${rootfs}"
+ tar xf $tar_file ${board_dir}/root -O >"${rootfs}"
# a padded rootfs is needed for overlay fs creation
- local offset=$(tar xf $tar_file sysupgrade-$board/root -O | wc -c)
+ local offset=$(tar xf $tar_file ${board_dir}/root -O | wc -c)
[ $offset -lt 65536 ] && {
echo Wrong size for rootfs: $offset
sleep 10
}
# Mount loop for rootfs_data
- losetup -o $offset /dev/loop0 "${rootfs}" || {
+ local loopdev="$(losetup -f)"
+ losetup -o $offset $loopdev $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
+ mkfs.ext4 -F -L rootfs_data $loopdev
mkdir /tmp/new_root
- mount -t ext4 /dev/loop0 /tmp/new_root && {
+ mount -t ext4 $loopdev /tmp/new_root && {
echo "Saving config to rootfs_data at position ${offset}."
- cp -v /tmp/sysupgrade.tgz /tmp/new_root/
+ cp -v "$CONF_TAR" "/tmp/new_root/$BACKUP_FILE"
umount /tmp/new_root
}
+ # flashing successful, toggle the dualflag
+ case "$rootfs" in
+ "/dev/mmcblk0p5")
+ printf "\xff" >$dualflagmtd
+ ;;
+ "/dev/mmcblk0p8")
+ printf "\x01" >$dualflagmtd
+ ;;
+ esac
+
# Cleanup
- losetup -d /dev/loop0 >/dev/null 2>&1
+ losetup -d $loopdev >/dev/null 2>&1
sync
umount -a
reboot -f
[ -b "${rootfs}" ] || return 1
case "$board" in
- nbg6817)
+ zyxel,nbg6817)
+ local dualflagmtd="$(find_mtd_part 0:DUAL_FLAG)"
+ [ -b $dualflagmtd ] || return 1
+
case "$rootfs" in
"/dev/mmcblk0p5")
- kernel=mmcblk0p4
+ # booted from the primary partition set
+ # write to the alternative set
+ kernel="/dev/mmcblk0p7"
+ rootfs="/dev/mmcblk0p8"
;;
"/dev/mmcblk0p8")
- kernel=mmcblk0p7
+ # booted from the alternative partition set
+ # write to the primary set
+ kernel="/dev/mmcblk0p4"
+ rootfs="/dev/mmcblk0p5"
;;
*)
return 1
;;
esac
- zyxel_do_flash $tar_file $board $kernel $rootfs
+ zyxel_do_flash $tar_file $kernel $rootfs $dualflagmtd
return 0
}