Implement new swap scheme for devices with large erase size using scratch with status area
diff --git a/boot/cypress/MCUBootApp/sysflash/sysflash.h b/boot/cypress/MCUBootApp/sysflash/sysflash.h
index f1fc841..961e74e 100644
--- a/boot/cypress/MCUBootApp/sysflash/sysflash.h
+++ b/boot/cypress/MCUBootApp/sysflash/sysflash.h
@@ -1,18 +1,24 @@
 /* Manual version of auto-generated version. */
 
-#ifndef __SYSFLASH_H__
-#define __SYSFLASH_H__
+#ifndef SYSFLASH_H
+#define SYSFLASH_H
 
-#define FLASH_DEVICE_INTERNAL_FLASH        (0x7F)
+#include <stdint.h>
+#include "cy_syslib.h"
 
-#define FLASH_AREA_BOOTLOADER 0
-#define FLASH_AREA_IMAGE_0 1
-#define FLASH_AREA_IMAGE_1 2
-#define FLASH_AREA_IMAGE_SCRATCH 3
-#define FLASH_AREA_IMAGE_2 5
-#define FLASH_AREA_IMAGE_3 6
+#define FLASH_AREA_BOOTLOADER               (0)
+#define FLASH_AREA_IMAGE_0                  (1u)
+#define FLASH_AREA_IMAGE_1                  (2u)
+#define FLASH_AREA_IMAGE_SCRATCH            (3u)
+#define FLASH_AREA_IMAGE_2                  (5u)
+#define FLASH_AREA_IMAGE_3                  (6u)
+#define FLASH_AREA_IMAGE_SWAP_STATUS        (7u)
 
-/* Uncomment if external flash is being used */
+/* it is related to multi-image case */
+#define FLASH_AREA_IMAGE_IDX_1                  (0u)
+#define FLASH_AREA_IMAGE_IDX_2                  (1u)
+
+/* This defines if External Flash (SMIF) will be used for Upgrade Slots */
 /* #define CY_BOOT_USE_EXTERNAL_FLASH */
 
 /* use PDL-defined offset or one from SMFI config */
@@ -22,31 +28,84 @@
 #define CY_FLASH_DEVICE_BASE                (CY_FLASH_BASE)
 
 #ifndef CY_BOOT_SCRATCH_SIZE
-#define CY_BOOT_SCRATCH_SIZE                (0x1000)
+#ifndef CY_BOOT_USE_EXTERNAL_FLASH
+#define CY_BOOT_SCRATCH_SIZE                (0x1000u)
+#else /* CY_BOOT_USE_EXTERNAL_FLASH */
+#define CY_BOOT_SCRATCH_SIZE                (0x80000)
+#endif /* CY_BOOT_USE_EXTERNAL_FLASH */
+#endif /* CY_BOOT_SCRATCH_SIZE */
+
+#ifndef CY_BOOT_SWAP_STATUS_SIZE
+#define CY_BOOT_SWAP_STATUS_SIZE            (BOOT_SWAP_STATUS_SZ_PRIM + BOOT_SWAP_STATUS_SZ_SEC)
 #endif
 
 #ifndef CY_BOOT_BOOTLOADER_SIZE
 #define CY_BOOT_BOOTLOADER_SIZE             (0x18000)
 #endif
 
+/* Sizes of CY_BOOT_IMAGE_1_SIZE and CY_BOOT_IMAGE_2_SIZE 
+ * can be defined from build system. Use default values otherwise
+*/
+#ifndef CY_BOOT_USE_EXTERNAL_FLASH
+#ifndef CY_BOOT_IMAGE_1_SIZE
+#define CY_BOOT_IMAGE_1_SIZE                (0x10000)
+#endif /* CY_BOOT_IMAGE_1_SIZE */
+#if (MCUBOOT_IMAGE_NUMBER == 2)
+#ifndef CY_BOOT_IMAGE_2_SIZE
+#define CY_BOOT_IMAGE_2_SIZE                (0x20000)
+#endif /* CY_BOOT_IMAGE_2_SIZE */
+#endif /* (MCUBOOT_IMAGE_NUMBER == 2) */
+#else /* CY_BOOT_USE_EXTERNAL_FLASH */
+#ifndef CY_BOOT_IMAGE_1_SIZE
+#define CY_BOOT_IMAGE_1_SIZE                (0xC0000)
+#endif /* CY_BOOT_IMAGE_1_SIZE */
+#if (MCUBOOT_IMAGE_NUMBER == 2)
+#ifndef CY_BOOT_IMAGE_2_SIZE
+#define CY_BOOT_IMAGE_2_SIZE                (0xC0000)
+#endif /* CY_BOOT_IMAGE_2_SIZE */
+#endif /* (MCUBOOT_IMAGE_NUMBER == 2) */
+#endif /* CY_BOOT_USE_EXTERNAL_FLASH */
+
 #ifndef CY_BOOT_PRIMARY_1_SIZE
-#define CY_BOOT_PRIMARY_1_SIZE              (0x10000)
+#define CY_BOOT_PRIMARY_1_SIZE              CY_BOOT_IMAGE_1_SIZE
 #endif
 
 #ifndef CY_BOOT_SECONDARY_1_SIZE
-#define CY_BOOT_SECONDARY_1_SIZE            (0x10000)
+#define CY_BOOT_SECONDARY_1_SIZE            CY_BOOT_IMAGE_1_SIZE
 #endif
 
 #if (MCUBOOT_IMAGE_NUMBER == 2) /* if dual-image */
 #ifndef CY_BOOT_PRIMARY_2_SIZE
-#define CY_BOOT_PRIMARY_2_SIZE              (0x10000)
+#define CY_BOOT_PRIMARY_2_SIZE              CY_BOOT_IMAGE_2_SIZE
 #endif
 
 #ifndef CY_BOOT_SECONDARY_2_SIZE
-#define CY_BOOT_SECONDARY_2_SIZE            (0x10000)
+#define CY_BOOT_SECONDARY_2_SIZE            CY_BOOT_IMAGE_2_SIZE
 #endif
 #endif
 
+#ifndef CY_BOOT_EXTERNAL_FLASH_SECONDARY_1_OFFSET
+#define CY_BOOT_EXTERNAL_FLASH_SECONDARY_1_OFFSET  (0x0u)
+#endif
+
+#ifndef CY_BOOT_EXTERNAL_FLASH_SECONDARY_2_OFFSET
+#define CY_BOOT_EXTERNAL_FLASH_SECONDARY_2_OFFSET  (0x240000u)
+#endif
+
+#ifndef CY_BOOT_EXTERNAL_FLASH_SCRATCH_OFFSET
+#define CY_BOOT_EXTERNAL_FLASH_SCRATCH_OFFSET      (0x440000u)
+#endif
+
+#ifndef CY_BOOT_SECONDARY_1_EXT_MEM_OFFSET
+#define CY_BOOT_SECONDARY_1_EXT_MEM_OFFSET  (CY_SMIF_BASE_MEM_OFFSET + CY_BOOT_EXTERNAL_FLASH_SECONDARY_1_OFFSET)
+#endif
+
+#ifndef CY_BOOT_SECONDARY_2_EXT_MEM_OFFSET
+#define CY_BOOT_SECONDARY_2_EXT_MEM_OFFSET  (CY_SMIF_BASE_MEM_OFFSET + CY_BOOT_EXTERNAL_FLASH_SECONDARY_2_OFFSET)
+#endif
+
+#define BOOT_MAX_SWAP_STATUS_SECTORS        (64)
+
 #if (MCUBOOT_IMAGE_NUMBER == 1)
 #define FLASH_AREA_IMAGE_PRIMARY(x)    (((x) == 0) ?          \
                                          FLASH_AREA_IMAGE_0 : \
@@ -57,6 +116,7 @@
 
 #elif (MCUBOOT_IMAGE_NUMBER == 2)
 
+#ifndef CY_FLASH_MAP_EXT_DESC
 #define FLASH_AREA_IMAGE_PRIMARY(x)    (((x) == 0) ?          \
                                          FLASH_AREA_IMAGE_0 : \
                                         ((x) == 1) ?          \
@@ -67,10 +127,55 @@
                                         ((x) == 1) ?          \
                                          FLASH_AREA_IMAGE_3 : \
                                          255)
-
 #else
-#warning "Image slot and flash area mapping is not defined"
+__STATIC_INLINE uint8_t FLASH_AREA_IMAGE_PRIMARY(uint32_t areaID)
+{
+    uint8_t result;
+
+    if (0U == areaID)
+    {
+        result = FLASH_AREA_IMAGE_0;
+    }
+    else
+    if (1U == areaID)
+    {
+        result = FLASH_AREA_IMAGE_2;
+    }
+    else
+    {
+        result = 0xFF;
+    }
+
+    return result;
+}
+
+__STATIC_INLINE uint8_t FLASH_AREA_IMAGE_SECONDARY(uint32_t areaID)
+{
+    uint8_t result;
+
+    if (0U == areaID)
+    {
+        result = FLASH_AREA_IMAGE_1;
+    }
+    else
+    if (1U == areaID)
+    {
+        result = FLASH_AREA_IMAGE_3;
+    }
+    else
+    {
+        result = 0xFF;
+    }
+
+    return result;
+}
 #endif
+#endif
+
+// #else
+// #warning "Image slot and flash area mapping is not defined"
+// #endif
+
 #define CY_IMG_HDR_SIZE 0x400
 
 #ifndef CY_FLASH_MAP_EXT_DESC
@@ -78,4 +183,4 @@
 /* #define CY_FLASH_MAP_EXT_DESC */
 #endif
 
-#endif /* __SYSFLASH_H__ */
+#endif /* SYSFLASH_H */