bcm53xx: basic support for Seama format in sysupgrade
[openwrt/svn-archive/archive.git] / target / linux / bcm53xx / base-files / lib / upgrade / platform.sh
index e9a3dc49501862d0844be9b826cdcf7d30b99111..772185c9548f45c46c8b75d8ea791f5c2c38cba7 100644 (file)
@@ -100,8 +100,19 @@ platform_check_image() {
                        fi
                ;;
                "seama")
-                       echo "Seama firmware format is unsupported"
-                       error=1
+                       local img_signature=$(oseama info "$1" | grep "Meta entry:.*signature=" | sed "s/.*=//")
+                       local dev_signature=$(platform_expected_image)
+                       echo "Found Seama image with device signature: $img_signature"
+
+                       [ -n "$dev_signature" -a "seama $img_signature" != "$dev_signature" ] && {
+                               echo "Firmware signature doesn't match device signature ($dev_signature)"
+                               error=1
+                       }
+
+                       $(oseama info "$1" -e 0 | grep -q "Meta entry:.*type=firmware") || {
+                               echo "Seama container doesn't have firmware entity"
+                               error=1
+                       }
                ;;
                "trx")
                        if ! otrx check "$1"; then
@@ -119,6 +130,8 @@ platform_check_image() {
 }
 
 platform_pre_upgrade() {
+       export RAMFS_COPY_BIN="${RAMFS_COPY_BIN} /usr/bin/oseama /bin/sed"
+
        local file_type=$(platform_identify "$1")
        local dir="/tmp/sysupgrade-bcm53xx"
        local trx="$1"
@@ -130,6 +143,7 @@ platform_pre_upgrade() {
        case "$file_type" in
                "chk")          offset=$((0x$(get_magic_long_at "$1" 4)));;
                "cybertan")     offset=32;;
+               "seama")        return;;
        esac
 
        # Extract partitions from trx
@@ -200,6 +214,22 @@ platform_trx_from_cybertan_cmd() {
        echo -n dd bs=32 skip=1
 }
 
+platform_img_from_seama() {
+       local dir="/tmp/sysupgrade-bcm53xx"
+       local offset=$(oseama info "$1" -e 0 | grep "Entity offset:" | sed "s/.*:\s*//")
+       local size=$(oseama info "$1" -e 0 | grep "Entity size:" | sed "s/.*:\s*//")
+
+       # Busybox doesn't support required iflag-s
+       # echo -n dd iflag=skip_bytes,count_bytes skip=$offset count=$size
+
+       rm -fR $dir
+       mkdir -p $dir
+       dd if="$1" of=$dir/image-noheader.bin bs=$offset skip=1
+       dd if=$dir/image-noheader.bin of=$dir/image-entity.bin bs=$size count=1
+
+       echo -n $dir/image-entity.bin
+}
+
 platform_do_upgrade() {
        local file_type=$(platform_identify "$1")
        local trx="$1"
@@ -212,6 +242,7 @@ platform_do_upgrade() {
        case "$file_type" in
                "chk")          cmd=$(platform_trx_from_chk_cmd "$trx");;
                "cybertan")     cmd=$(platform_trx_from_cybertan_cmd "$trx");;
+               "seama")        trx=$(platform_img_from_seama "$trx");;
        esac
 
        default_do_upgrade "$trx" "$cmd"