aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ipq807x/base-files/lib/upgrade/mmc.sh
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/ipq807x/base-files/lib/upgrade/mmc.sh')
-rw-r--r--target/linux/ipq807x/base-files/lib/upgrade/mmc.sh83
1 files changed, 83 insertions, 0 deletions
diff --git a/target/linux/ipq807x/base-files/lib/upgrade/mmc.sh b/target/linux/ipq807x/base-files/lib/upgrade/mmc.sh
new file mode 100644
index 0000000000..dac9ddd568
--- /dev/null
+++ b/target/linux/ipq807x/base-files/lib/upgrade/mmc.sh
@@ -0,0 +1,83 @@
+#
+# Copyright (C) 2016 lede-project.org
+#
+
+# this can be used as a generic mmc upgrade script
+# just add a device entry in platform.sh,
+# define "kernelname" and "rootfsname" and call mmc_do_upgrade
+# after the kernel and rootfs flash a loopdev (as overlay) is
+# setup on top of the rootfs partition
+# for the proper function a padded rootfs image is needed, basically
+# append "pad-to 64k" to the image definition
+# this is based on the ipq806x zyxel.sh mmc upgrade
+
+. /lib/functions.sh
+
+mmc_do_upgrade() {
+ local tar_file="$1"
+ local rootfs=
+ local kernel=
+
+ [ -z "$kernel" ] && kernel=$(find_mmc_part ${kernelname})
+ [ -z "$rootfs" ] && rootfs=$(find_mmc_part ${rootfsname})
+
+ [ -z "$kernel" ] && echo "Upgrade failed: kernel partition not found! Rebooting..." && reboot -f
+ [ -z "$rootfs" ] && echo "Upgrade failed: rootfs partition not found! Rebooting..." && reboot -f
+
+ mmc_do_flash $tar_file $kernel $rootfs
+
+ return 0
+}
+
+mmc_do_flash() {
+ local tar_file=$1
+ local kernel=$2
+ local rootfs=$3
+
+ # keep sure its unbound
+ losetup --detach-all || {
+ echo Failed to detach all loop devices. Skip this try.
+ reboot -f
+ }
+
+ # 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 ${board_dir}/root -O >"${rootfs}"
+
+ # a padded rootfs is needed for overlay fs creation
+ local offset=$(tar xf $tar_file ${board_dir}/root -O | wc -c)
+ [ $offset -lt 65536 ] && {
+ echo Wrong size for rootfs: $offset
+ sleep 10
+ reboot -f
+ }
+
+ # Mount loop for rootfs_data
+ 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 $loopdev
+ mkdir /tmp/new_root
+ mount -t ext4 $loopdev /tmp/new_root && {
+ echo "Saving config to rootfs_data at position ${offset}."
+ cp -v "$UPGRADE_BACKUP" "/tmp/new_root/$BACKUP_FILE"
+ umount /tmp/new_root
+ }
+
+ # Cleanup
+ losetup -d $loopdev >/dev/null 2>&1
+ sync
+ umount -a
+ reboot -f
+}