From c0edf30bdce48f83a56e24bfd1caae17e206e840 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
Date: Thu, 28 Jan 2016 22:38:37 +0000
Subject: [PATCH] bcm53xx: basic support for Seama format in sysupgrade
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>

SVN-Revision: 48535
---
 target/linux/bcm53xx/Makefile                 |  2 +-
 .../base-files/lib/upgrade/platform.sh        | 35 +++++++++++++++++--
 2 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/target/linux/bcm53xx/Makefile b/target/linux/bcm53xx/Makefile
index 7654f1646e..717a44203a 100644
--- a/target/linux/bcm53xx/Makefile
+++ b/target/linux/bcm53xx/Makefile
@@ -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
 
diff --git a/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh b/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh
index e9a3dc4950..772185c954 100644
--- a/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh
+++ b/target/linux/bcm53xx/base-files/lib/upgrade/platform.sh
@@ -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"
-- 
2.30.2