aboot: Preliminary support for meta image format

Add support for meta image format; this allows multiple images
packaged in meta image to be programmed using single 'flash'
command.

Change-Id: I1e5a5fdf1660dec8c2ff54dcf6a39f5a6285b15f
diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c
index 25755a1..35373d8 100644
--- a/app/aboot/aboot.c
+++ b/app/aboot/aboot.c
@@ -68,6 +68,7 @@
 #include "bootimg.h"
 #include "fastboot.h"
 #include "sparse_format.h"
+#include "meta_format.h"
 #include "mmc.h"
 #include "devinfo.h"
 #include "board.h"
@@ -2016,6 +2017,33 @@
 	return;
 }
 
+void cmd_flash_meta_img(const char *arg, void *data, unsigned sz)
+{
+	int i, images;
+	meta_header_t *meta_header;
+	img_header_entry_t *img_header_entry;
+
+	meta_header = (meta_header_t*) data;
+	img_header_entry = (img_header_entry_t*) (data+sizeof(meta_header_t));
+
+	images = meta_header->img_hdr_sz / sizeof(img_header_entry_t);
+
+	for (i=0; i<images; i++) {
+
+		if((img_header_entry[i].ptn_name == NULL) ||
+			(img_header_entry[i].start_offset == 0) ||
+			(img_header_entry[i].size == 0))
+			break;
+
+		cmd_flash_mmc_img(img_header_entry[i].ptn_name,
+					(void *) data + img_header_entry[i].start_offset,
+					img_header_entry[i].size);
+	}
+
+	fastboot_okay("");
+	return;
+}
+
 void cmd_flash_mmc_sparse_img(const char *arg, void *data, unsigned sz)
 {
 	unsigned int chunk;
@@ -2193,6 +2221,7 @@
 void cmd_flash_mmc(const char *arg, void *data, unsigned sz)
 {
 	sparse_header_t *sparse_header;
+	meta_header_t *meta_header;
 
 #ifdef SSD_ENABLE
 	/* 8 Byte Magic + 2048 Byte xml + Encrypted Data */
@@ -2279,10 +2308,13 @@
 #endif
 
 	sparse_header = (sparse_header_t *) data;
-	if (sparse_header->magic != SPARSE_HEADER_MAGIC)
-		cmd_flash_mmc_img(arg, data, sz);
-	else
+	meta_header = (meta_header_t *) data;
+	if (sparse_header->magic == SPARSE_HEADER_MAGIC)
 		cmd_flash_mmc_sparse_img(arg, data, sz);
+	else if (meta_header->magic == META_HEADER_MAGIC)
+		cmd_flash_meta_img(arg, data, sz);
+	else
+		cmd_flash_mmc_img(arg, data, sz);
 	return;
 }