procd: update to latest git HEAD
[openwrt/openwrt.git] / package / system / procd / files / nand.sh
index 78ac206f4a2e17da61cf44d331ede7642fe5f122..9c831df3b4247d12d7e882da349eafea5894fabc 100644 (file)
@@ -4,8 +4,23 @@
 
 . /lib/functions.sh
 
+# 'kernel' partition on NAND contains the kernel
+CI_KERNPART="${CI_KERNPART:-kernel}"
+
 # 'ubi' partition on NAND contains UBI
-CI_UBIPART="ubi"
+CI_UBIPART="${CI_UBIPART:-ubi}"
+
+ubi_mknod() {
+       local dir="$1"
+       local dev="/dev/$(basename $dir)"
+
+       [ -e "$dev" ] && return 0
+
+       local devid="$(cat $dir/dev)"
+       local major="${devid%%:*}"
+       local minor="${devid##*:}"
+       mknod "$dev" c $major $minor
+}
 
 nand_find_volume() {
        local ubidevdir ubivoldir
@@ -15,6 +30,7 @@ nand_find_volume() {
                [ ! -d "$ubivoldir" ] && continue
                if [ "$( cat $ubivoldir/name )" = "$2" ]; then
                        basename $ubivoldir
+                       ubi_mknod "$ubivoldir"
                        return 0
                fi
        done
@@ -30,13 +46,14 @@ nand_find_ubi() {
                [ ! "$mtdnum" ] && continue
                if [ "$mtdnum" = "$cmtdnum" ]; then
                        ubidev=$( basename $ubidevdir )
+                       ubi_mknod "$ubidevdir"
                        echo $ubidev
                        return 0
                fi
        done
 }
 
-get_magic_long() {
+nand_get_magic_long() {
        dd if="$1" skip=$2 bs=4 count=1 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"'
 }
 
@@ -70,7 +87,7 @@ identify_magic() {
 
 
 identify() {
-       identify_magic $(get_magic_long "$1" "${2:-0}")
+       identify_magic $(nand_get_magic_long "$1" "${2:-0}")
 }
 
 identify_tar() {
@@ -119,7 +136,7 @@ nand_upgrade_prepare_ubi() {
                ubiattach -m "$mtdnum"
                sync
                ubidev="$( nand_find_ubi "$CI_UBIPART" )"
-               [ -z "$has_env" ] || {
+               [ "$has_env" -gt 0 ] && {
                        ubimkvol /dev/$ubidev -n 0 -N ubootenv -s 1MiB
                        ubimkvol /dev/$ubidev -n 1 -N ubootenv2 -s 1MiB
                }
@@ -177,13 +194,15 @@ nand_upgrade_prepare_ubi() {
 
 nand_do_upgrade_success() {
        local conf_tar="/tmp/sysupgrade.tgz"
-       
+
        sync
        [ -f "$conf_tar" ] && nand_restore_config "$conf_tar"
-       echo "sysupgrade successfull"
+       echo "sysupgrade successful"
+       umount -a
        reboot -f
 }
 
+# Flash the UBI image to MTD partition
 nand_upgrade_ubinized() {
        local ubi_file="$1"
        local mtdnum="$(find_mtd_index "$CI_UBIPART")"
@@ -195,6 +214,7 @@ nand_upgrade_ubinized() {
 
        if [ ! "$mtdnum" ]; then
                echo "cannot find mtd device $CI_UBIPART"
+               umount -a
                reboot -f
        fi
 
@@ -206,11 +226,12 @@ nand_upgrade_ubinized() {
        nand_do_upgrade_success
 }
 
+# Write the UBIFS image to UBI volume
 nand_upgrade_ubifs() {
        local rootfs_length=`(cat $1 | wc -c) 2> /dev/null`
 
        nand_upgrade_prepare_ubi "$rootfs_length" "ubifs" "0" "0"
-       
+
        local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
        local root_ubivol="$(nand_find_volume $ubidev rootfs)"
        ubiupdatevol /dev/$root_ubivol -s $rootfs_length $1
@@ -218,23 +239,32 @@ nand_upgrade_ubifs() {
        nand_do_upgrade_success
 }
 
+nand_board_name() {
+       if type 'platform_nand_board_name' >/dev/null 2>/dev/null; then
+               platform_nand_board_name
+               return
+       fi
+
+       cat /tmp/sysinfo/board_name
+}
+
 nand_upgrade_tar() {
        local tar_file="$1"
-       local board_name="$(cat /tmp/sysinfo/board_name)"
-       local kernel_mtd="$(find_mtd_index kernel)"
+       local board_name="$(nand_board_name)"
+       local kernel_mtd="$(find_mtd_index $CI_KERNPART)"
 
        local kernel_length=`(tar xf $tar_file sysupgrade-$board_name/kernel -O | wc -c) 2> /dev/null`
        local rootfs_length=`(tar xf $tar_file sysupgrade-$board_name/root -O | wc -c) 2> /dev/null`
 
-       local rootfs_type="$(identify_tar "$tar_file" root)"
+       local rootfs_type="$(identify_tar "$tar_file" sysupgrade-$board_name/root)"
 
        local has_kernel=1
        local has_env=0
 
-       [ "kernel_length" = 0 -o -z "$kernel_mtd" ] || {
-               tar xf $tar_file sysupgrade-$board_name/kernel -O | mtd write - kernel
+       [ "$kernel_length" != 0 -a -n "$kernel_mtd" ] && {
+               tar xf $tar_file sysupgrade-$board_name/kernel -O | mtd write - $CI_KERNPART
        }
-       [ "kernel_length" = 0 -o ! -z "$kernel_mtd" ] && has_kernel=0
+       [ "$kernel_length" = 0 -o ! -z "$kernel_mtd" ] && has_kernel=0
 
        nand_upgrade_prepare_ubi "$rootfs_length" "$rootfs_type" "$has_kernel" "$has_env"
 
@@ -252,14 +282,21 @@ nand_upgrade_tar() {
        nand_do_upgrade_success
 }
 
+# Recognize type of passed file and start the upgrade process
 nand_do_upgrade_stage2() {
        local file_type=$(identify $1)
 
+       if type 'platform_nand_pre_upgrade' >/dev/null 2>/dev/null; then
+               platform_nand_pre_upgrade "$1"
+       fi
+
        [ ! "$(find_mtd_index "$CI_UBIPART")" ] && CI_UBIPART="rootfs"
 
-       [ "$file_type" == "ubi" ] && nand_upgrade_ubinized $1
-       [ "$file_type" == "ubifs" ] && nand_upgrade_ubifs $1
-       nand_upgrade_tar $1
+       case "$file_type" in
+               "ubi")          nand_upgrade_ubinized $1;;
+               "ubifs")        nand_upgrade_ubifs $1;;
+               *)              nand_upgrade_tar $1;;
+       esac
 }
 
 nand_upgrade_stage2() {
@@ -296,12 +333,24 @@ nand_upgrade_stage1() {
                [ "$SAVE_CONFIG" != 1 -a -f "$CONF_TAR" ] &&
                        rm $CONF_TAR
 
-               ubus call system nandupgrade "{\"path\": \"$path\" }"
+               ubus call system nandupgrade "{\"prefix\": \"$RAM_ROOT\", \"path\": \"$path\" }"
                exit 0
        }
 }
-append sysupgrade_pre_upgrade nand_upgrade_stage1
 
+# Check if passed file is a valid one for NAND sysupgrade. Currently it accepts
+# 3 types of files:
+# 1) UBI - should contain an ubinized image, header is checked for the proper
+#    MAGIC
+# 2) UBIFS - should contain UBIFS partition that will replace "rootfs" volume,
+#    header is checked for the proper MAGIC
+# 3) TAR - archive has to include "sysupgrade-BOARD" directory with a non-empty
+#    "CONTROL" file (at this point its content isn't verified)
+#
+# You usually want to call this function in platform_check_image.
+#
+# $(1): board name, used in case of passing TAR file
+# $(2): file to be checked
 nand_do_platform_check() {
        local board_name="$1"
        local tar_file="$2"
@@ -313,8 +362,15 @@ nand_do_platform_check() {
                return 1
        }
 
-       echo -n $2 > /tmp/sysupgrade-nand-path
-       cp /sbin/upgraded /tmp/
-
        return 0
 }
+
+# Start NAND upgrade process
+#
+# $(1): file to be used for upgrade
+nand_do_upgrade() {
+       echo -n $1 > /tmp/sysupgrade-nand-path
+       install_bin /sbin/upgraded
+       ln -s "$RAM_ROOT"/sbin/upgraded /tmp/upgraded
+       nand_upgrade_stage1
+}