diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2016-06-11 01:50:34 +0200 |
---|---|---|
committer | Rafał Miłecki <zajec5@gmail.com> | 2016-06-20 08:02:32 +0200 |
commit | 776b24d9aa7dcc1dfa1ecb9c9d70764b46b0c46f (patch) | |
tree | 3b7f8333004e3e190c096d34924c8361a381935d /target/linux/bcm53xx | |
parent | 7e08f2ccbdb717c502810085457b824d0f2d067b (diff) | |
download | upstream-776b24d9aa7dcc1dfa1ecb9c9d70764b46b0c46f.tar.gz upstream-776b24d9aa7dcc1dfa1ecb9c9d70764b46b0c46f.tar.bz2 upstream-776b24d9aa7dcc1dfa1ecb9c9d70764b46b0c46f.zip |
bcm53xx: properly support sysupgrade using Seama on NAND devices
It updates kernel and then formats UBI without loosing erase counters.
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Diffstat (limited to 'target/linux/bcm53xx')
-rw-r--r-- | target/linux/bcm53xx/base-files/lib/upgrade/platform.sh | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh b/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh index d613595a66..f0a48ddeec 100644 --- a/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh @@ -197,6 +197,53 @@ platform_pre_upgrade_trx() { nand_do_upgrade /tmp/root.ubi } +platform_pre_upgrade_seama() { + local dir="/tmp/sysupgrade-bcm53xx" + local seama="$1" + local tmp + + # Extract Seama entity from Seama seal + rm -fR $dir + mkdir -p $dir + oseama extract "$seama" \ + -e 0 \ + -o $dir/seama.entity + [ $? -ne 0 ] && { + echo "Failed to extract Seama entity." + return + } + local entity_size=$(wc -c $dir/seama.entity | cut -d ' ' -f 1) + + local ubi_offset=0 + tmp=0 + while [ 1 ]; do + [ $tmp -ge $entity_size ] && break + [ "$(dd if=$dir/seama.entity skip=$tmp bs=1 count=4 2>/dev/null)" = "UBI#" ] && { + ubi_offset=$tmp + break + } + tmp=$(($tmp + 131072)) + done + [ $ubi_offset -eq 0 ] && { + echo "Failed to find UBI in Seama entity." + return + } + + local ubi_length=0 + while [ "$(dd if=$dir/seama.entity skip=$(($ubi_offset + $ubi_length)) bs=1 count=4 2>/dev/null)" = "UBI#" ]; do + ubi_length=$(($ubi_length + 131072)) + done + + dd if=$dir/seama.entity of=$dir/kernel.seama bs=131072 count=$(($ubi_offset / 131072)) 2>/dev/null + dd if=$dir/seama.entity of=$dir/root.ubi bs=131072 skip=$(($ubi_offset / 131072)) count=$(($ubi_length / 131072)) 2>/dev/null + + # Flash + local kernel_size=$(sed -n 's/mtd[0-9]*: \([0-9a-f]*\).*"\(kernel\|linux\)".*/\1/p' /proc/mtd) + mtd write $dir/kernel.seama firmware + mtd ${kernel_size:+-c 0x$kernel_size} fixseama firmware + nand_do_upgrade $dir/root.ubi +} + platform_pre_upgrade() { export RAMFS_COPY_BIN="${RAMFS_COPY_BIN} /usr/bin/oseama /bin/sed" @@ -208,7 +255,7 @@ platform_pre_upgrade() { case "$file_type" in "chk") platform_pre_upgrade_trx "$1" $((0x$(get_magic_long_at "$1" 4)));; "cybertan") platform_pre_upgrade_trx "$1" 32;; - "seama") return;; + "seama") platform_pre_upgrade_seama "$1";; "trx") platform_pre_upgrade_trx "$1";; esac } |