X-Git-Url: https://git.archive.openwrt.org/?p=openwrt.git;a=blobdiff_plain;f=target%2Flinux%2Fbcm53xx%2Fbase-files%2Flib%2Fupgrade%2Fplatform.sh;h=d3440b77391ad49eec17b5e5e6c9355ee2604958;hp=876da4d6f809faa37430a16ef70fda16ca3bede5;hb=d1cf0600961c3d72294cac1632065f1910663307;hpb=fbd90f8bbc67b315e79fce4c12ba105fff08f234 diff --git a/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh b/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh index 876da4d6f8..d3440b7739 100644 --- a/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh @@ -57,11 +57,6 @@ platform_identify() { platform_check_image() { [ "$#" -gt 1 ] && return 1 - [ "$(platform_flash_type)" = "nand" ] && { - echo "Firmware upgrade on NAND devices is not implemented." - return 1 - } - local file_type=$(platform_identify "$1") local magic local error=0 @@ -133,8 +128,8 @@ platform_pre_upgrade() { # Extract trx case "$file_type" in - "chk") trx="/tmp/$1.trx"; platform_extract_trx_from_chk "$1" "$trx";; - "cybertan") trx="/tmp/$1.trx"; platform_extract_trx_from_cybertan "$1" "$trx";; + "chk") trx="/tmp/$(basename $1).trx"; platform_extract_trx_from_chk "$1" "$trx";; + "cybertan") trx="/tmp/$(basename $1).trx"; platform_extract_trx_from_cybertan "$1" "$trx";; esac # Extract partitions from trx @@ -148,8 +143,31 @@ platform_pre_upgrade() { local root_type=$(identify $dir/root) [ "$root_type" != "ubi" ] && return - echo "Provided firmware contains kernel and UBI image, but flashing it is unsupported yet" - exit 1 + # Prepare TRX file with just a kernel that will replace current one + local linux_length=$(grep "\"linux\"" /proc/mtd | sed "s/mtd[0-9]*:[ \t]*\([^ \t]*\).*/\1/") + [ -z "$linux_length" ] && { + echo "Unable to find \"linux\" partition size" + exit 1 + } + linux_length=$((0x$linux_length + 28)) + rm -f /tmp/null.bin + rm -f /tmp/kernel.trx + touch /tmp/null.bin + otrx create /tmp/kernel.trx \ + -f $dir/kernel -b $linux_length \ + -f /tmp/null.bin + + # Prepare UBI image (drop unwanted extra blocks) + local ubi_length=0 + while [ "$(dd if=$dir/root skip=$ubi_length bs=1 count=4 2>/dev/null)" = "UBI#" ]; do + ubi_length=$(($ubi_length + 131072)) + done + echo "ubi_length: $ubi_length" + dd if=$dir/root of=/tmp/root.ubi bs=131072 count=$((ubi_length / 131072)) 2>/dev/null + + # Flash + mtd write /tmp/kernel.trx firmware + nand_do_upgrade /tmp/root.ubi } platform_do_upgrade() { @@ -161,8 +179,8 @@ platform_do_upgrade() { } case "$file_type" in - "chk") trx="/tmp/$1.trx"; platform_extract_trx_from_chk "$1" "$trx";; - "cybertan") trx="/tmp/$1.trx"; platform_extract_trx_from_cybertan "$1" "$trx";; + "chk") trx="/tmp/$(basename $1).trx"; platform_extract_trx_from_chk "$1" "$trx";; + "cybertan") trx="/tmp/$(basename $1).trx"; platform_extract_trx_from_cybertan "$1" "$trx";; esac shift