ext/lib/mgmt/mcumgr: align zephyr port to changes in dfu sybsy'es

Changes in flash_map API makes flash_area structure proper
interface for point the image area instead of direct flash-bank-offsets.

This patch align code to changed APIa and allows to support operation
on the partition in any flash device.

Signed-off-by: Findlay Feng <i@fengch.me>
diff --git a/ext/lib/mgmt/mcumgr/cmd/img_mgmt/port/zephyr/src/zephyr_img_mgmt.c b/ext/lib/mgmt/mcumgr/cmd/img_mgmt/port/zephyr/src/zephyr_img_mgmt.c
index 8407228..2951d4d 100644
--- a/ext/lib/mgmt/mcumgr/cmd/img_mgmt/port/zephyr/src/zephyr_img_mgmt.c
+++ b/ext/lib/mgmt/mcumgr/cmd/img_mgmt/port/zephyr/src/zephyr_img_mgmt.c
@@ -19,6 +19,7 @@
 
 #include <assert.h>
 #include <flash.h>
+#include <flash_map.h>
 #include <zephyr.h>
 #include <soc.h>
 #include <init.h>
@@ -29,15 +30,13 @@
 #include <img_mgmt/img_mgmt.h>
 #include "../../../src/img_mgmt_priv.h"
 
-static struct device *zephyr_img_mgmt_flash_dev;
-static struct flash_img_context zephyr_img_mgmt_flash_ctxt;
-
 /**
  * Determines if the specified area of flash is completely unwritten.
  */
 static int
-zephyr_img_mgmt_flash_check_empty(off_t offset, size_t size, bool *out_empty)
+zephyr_img_mgmt_flash_check_empty(u8_t fa_id, bool *out_empty)
 {
+    const struct flash_area *fa;
     uint32_t data[16];
     off_t addr;
     off_t end;
@@ -45,57 +44,65 @@
     int rc;
     int i;
 
-    assert(size % 4 == 0);
+    rc = flash_area_open(fa_id, &fa);
+    if (rc != 0) {
+        return MGMT_ERR_EUNKNOWN;
+    }
 
-    end = offset + size;
-    for (addr = offset; addr < end; addr += sizeof data) {
+    assert(fa->fa_size % 4 == 0);
+
+    end = fa->fa_size;
+    for (addr = 0; addr < end; addr += sizeof data) {
         if (end - addr < sizeof data) {
             bytes_to_read = end - addr;
         } else {
             bytes_to_read = sizeof data;
         }
 
-        rc = flash_read(zephyr_img_mgmt_flash_dev, addr, data, bytes_to_read);
+        rc = flash_area_read(fa, addr, data, bytes_to_read);
         if (rc != 0) {
+            flash_area_close(fa);
             return MGMT_ERR_EUNKNOWN;
         }
 
         for (i = 0; i < bytes_to_read / 4; i++) {
             if (data[i] != 0xffffffff) {
                 *out_empty = false;
+                flash_area_close(fa);
                 return 0;
             }
         }
     }
 
     *out_empty = true;
+    flash_area_close(fa);
     return 0;
 }
 
 /**
- * Converts an offset within an image slot to an absolute address.
+ * Get flash_area ID for a image slot number.
  */
-static off_t
-zephyr_img_mgmt_abs_offset(int slot, off_t sub_offset)
+static u8_t
+zephyr_img_mgmt_flash_area_id(int slot)
 {
-    off_t slot_start;
+    u8_t fa_id;
 
     switch (slot) {
     case 0:
-        slot_start = FLASH_AREA_IMAGE_0_OFFSET;
+        fa_id = DT_FLASH_AREA_IMAGE_0_ID;
         break;
 
     case 1:
-        slot_start = FLASH_AREA_IMAGE_1_OFFSET;
+        fa_id = DT_FLASH_AREA_IMAGE_1_ID;
         break;
 
     default:
         assert(0);
-        slot_start = FLASH_AREA_IMAGE_1_OFFSET;
+        fa_id = DT_FLASH_AREA_IMAGE_1_ID;
         break;
     }
 
-    return slot_start + sub_offset;
+    return fa_id;
 }
 
 int
@@ -104,15 +111,14 @@
     bool empty;
     int rc;
 
-    rc = zephyr_img_mgmt_flash_check_empty(FLASH_AREA_IMAGE_1_OFFSET,
-                                           FLASH_AREA_IMAGE_1_SIZE,
+    rc = zephyr_img_mgmt_flash_check_empty(DT_FLASH_AREA_IMAGE_1_ID,
                                            &empty);
     if (rc != 0) {
         return MGMT_ERR_EUNKNOWN;
     }
 
     if (!empty) {
-        rc = boot_erase_img_bank(FLASH_AREA_IMAGE_1_OFFSET);
+        rc = boot_erase_img_bank(DT_FLASH_AREA_IMAGE_1_ID);
         if (rc != 0) {
             return MGMT_ERR_EUNKNOWN;
         }
@@ -155,11 +161,17 @@
 img_mgmt_impl_read(int slot, unsigned int offset, void *dst,
                    unsigned int num_bytes)
 {
-    off_t abs_offset;
+    const struct flash_area *fa;
     int rc;
 
-    abs_offset = zephyr_img_mgmt_abs_offset(slot, offset);
-    rc = flash_read(zephyr_img_mgmt_flash_dev, abs_offset, dst, num_bytes);
+    rc = flash_area_open(zephyr_img_mgmt_flash_area_id(slot), &fa);
+    if (rc != 0) {
+        return MGMT_ERR_EUNKNOWN;
+    }
+
+    rc = flash_area_read(fa, offset, dst, num_bytes);
+    flash_area_close(fa);
+
     if (rc != 0) {
         return MGMT_ERR_EUNKNOWN;
     }
@@ -171,28 +183,55 @@
 img_mgmt_impl_write_image_data(unsigned int offset, const void *data,
                                unsigned int num_bytes, bool last)
 {
-    int rc;
+	int rc;
+#if (CONFIG_HEAP_MEM_POOL_SIZE > 0)
+	static struct flash_img_context *ctx = NULL;
+#else
+	static struct flash_img_context ctx_data;
+#define ctx (&ctx_data)
+#endif
 
-    if (offset == 0) {
-        flash_img_init(&zephyr_img_mgmt_flash_ctxt, zephyr_img_mgmt_flash_dev);
-    }
+#if (CONFIG_HEAP_MEM_POOL_SIZE > 0)
+	if (offset != 0 && ctx == NULL) {
+		return MGMT_ERR_EUNKNOWN;
+	}
+#endif
 
-    /* Cast away const. */
-    rc = flash_img_buffered_write(&zephyr_img_mgmt_flash_ctxt, (void *)data,
-                                  num_bytes, false);
-    if (rc != 0) {
-        return MGMT_ERR_EUNKNOWN;
-    }
+	if (offset == 0) {
+#if (CONFIG_HEAP_MEM_POOL_SIZE > 0)
+		if (ctx == NULL) {
+			ctx = k_malloc(sizeof(*ctx));
 
-    if (last) {
-        rc = flash_img_buffered_write(&zephyr_img_mgmt_flash_ctxt,
-                                      NULL, 0, true);
-        if (rc != 0) {
-            return MGMT_ERR_EUNKNOWN;
-        }
-    }
+			if (ctx == NULL) {
+				return MGMT_ERR_ENOMEM;
+			}
+		}
+#endif
+		rc = flash_img_init(ctx);
 
-    return 0;
+		if (rc != 0) {
+			return MGMT_ERR_EUNKNOWN;
+		}
+	}
+
+	if (offset != ctx->bytes_written + ctx->buf_bytes) {
+		return MGMT_ERR_EUNKNOWN;
+	}
+
+	/* Cast away const. */
+	rc = flash_img_buffered_write(ctx, (void *)data, num_bytes, last);
+	if (rc != 0) {
+		return MGMT_ERR_EUNKNOWN;
+	}
+
+#if (CONFIG_HEAP_MEM_POOL_SIZE > 0)
+	if (last) {
+		k_free(ctx);
+		ctx = NULL;
+	}
+#endif
+
+	return 0;
 }
 
 int
@@ -212,17 +251,3 @@
         return IMG_MGMT_SWAP_TYPE_NONE;
     }
 }
-
-static int
-zephyr_img_mgmt_init(struct device *dev)
-{
-    ARG_UNUSED(dev);
-
-    zephyr_img_mgmt_flash_dev = device_get_binding(DT_FLASH_DEV_NAME);
-    if (zephyr_img_mgmt_flash_dev == NULL) {
-        return -ENODEV;
-    }
-    return 0;
-}
-
-SYS_INIT(zephyr_img_mgmt_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY);