diff options
Diffstat (limited to 'target/linux/bcm53xx/base-files/lib/upgrade')
-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 } |