bcm53xx: basic support for Seama format in sysupgrade
authorRafał Miłecki <zajec5@gmail.com>
Thu, 28 Jan 2016 22:38:37 +0000 (22:38 +0000)
committerRafał Miłecki <zajec5@gmail.com>
Thu, 28 Jan 2016 22:38:37 +0000 (22:38 +0000)
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
SVN-Revision: 48535

target/linux/bcm53xx/Makefile
target/linux/bcm53xx/base-files/lib/upgrade/platform.sh

index 7654f1646e10995072c676790a73a393b826d0d0..717a44203ad5d494d62cd9ebbe3d30b166bc7567 100644 (file)
@@ -23,7 +23,7 @@ endef
 
 KERNELNAME:=zImage dtbs
 
-DEFAULT_PACKAGES += swconfig wpad-mini nvram otrx \
+DEFAULT_PACKAGES += swconfig wpad-mini nvram oseama otrx \
        kmod-gpio-button-hotplug \
        kmod-leds-gpio kmod-ledtrig-default-on kmod-ledtrig-timer
 
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"