X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fopenwrt.git;a=blobdiff_plain;f=package%2Fsystem%2Fprocd%2Ffiles%2Fnand.sh;h=9c831df3b4247d12d7e882da349eafea5894fabc;hp=fd2f943ba39d6168baca40fdb523904ad869e0c7;hb=8008765f1f4d03737d5aeb07bb9a9bf4d0321564;hpb=4c490c79b2e8f43e01d9be35a71469ad5aca3d35 diff --git a/package/system/procd/files/nand.sh b/package/system/procd/files/nand.sh index fd2f943ba3..9c831df3b4 100644 --- a/package/system/procd/files/nand.sh +++ b/package/system/procd/files/nand.sh @@ -5,10 +5,10 @@ . /lib/functions.sh # 'kernel' partition on NAND contains the kernel -CI_KERNPART="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" @@ -194,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 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")" @@ -212,6 +214,7 @@ nand_upgrade_ubinized() { if [ ! "$mtdnum" ]; then echo "cannot find mtd device $CI_UBIPART" + umount -a reboot -f fi @@ -223,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 @@ -235,9 +239,18 @@ 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 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` @@ -248,10 +261,10 @@ nand_upgrade_tar() { local has_kernel=1 local has_env=0 - [ "kernel_length" = 0 -o -z "$kernel_mtd" ] || { + [ "$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" @@ -269,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() { @@ -313,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" @@ -330,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 +}