Infineon: Add cyw20829 platform, shared slot feature, json memory map, psoc6 xip

Based in 1.8.0 release of MCUBoot library

This commit adds CYW20829 Infineon platform support with following capabilities:
1. Overwrite and swap upgrade mode support
2. Multi-image with up to 4 images
3. Hardware security counter is supported for CYW20829 platform

Add XIP support for PSOC6 platform - place BOOT slot in external memory and execute it in place using SMIF in XIP mode

and some new features for Infineon devices.

1. Shared upgrade slot feature - use one shared area for upgrade slots of multiple images
2. Memory map defined using JSON file - define memory regions for bootloader and user app in conventional way using JSON file
diff --git a/boot/cypress/scripts/bin2c.py b/boot/cypress/scripts/bin2c.py
new file mode 100644
index 0000000..04bc67a
--- /dev/null
+++ b/boot/cypress/scripts/bin2c.py
@@ -0,0 +1,95 @@
+#!/usr/bin/env python
+
+import os
+import sys
+import argparse
+import binascii
+
+number_of_columns = 16
+
+copyright = """/***************************************************************************//**
+* \\file {}
+*
+* \\brief
+* Cortex-M0+ prebuilt application image.
+*
+********************************************************************************
+* \\copyright
+* Copyright (c) 2018-2019 Cypress Semiconductor Corporation
+* SPDX-License-Identifier: LicenseRef-PBL
+*
+* Licensed under the Permissive Binary License
+*******************************************************************************/
+
+"""
+
+header = """
+#if defined(__APPLE__) && defined(__clang__)
+__attribute__ ((__section__("__CY_M0P_IMAGE,__cy_m0p_image"), used))
+#elif defined(__GNUC__) || defined(__ARMCC_VERSION)
+__attribute__ ((__section__(".cy_m0p_image"), used))
+#elif defined(__ICCARM__)
+#pragma  location=".cy_m0p_image"
+#else
+#error "An unsupported toolchain"
+#endif
+const uint8_t cy_m0p_image[] = {
+"""
+
+c_list = []
+
+
+# Get component name from the command line
+parser = argparse.ArgumentParser()
+parser.add_argument("bin_path", help="Specify path the input binary file to be converted to a C array.")
+parser.add_argument("c_path", help="Specify path the output C file with the C array.")
+parser.add_argument("c_macro", help="Specify the C preprocessor macro to wrap the variable.")
+args = parser.parse_args()
+bin_path = args.bin_path
+c_path = args.c_path
+c_macro = args.c_macro
+
+c_file=os.path.basename(c_path)
+
+f = open(bin_path, "rb")
+data = list(f.read())
+
+with open(c_path, "w") as c_fd:
+
+    # Clear content of the file
+    c_fd.seek(0)
+    c_fd.truncate()
+
+    # Write copyright
+    c_fd.write(copyright.format(c_file))
+
+    # Include headers
+    c_fd.write("#include <stdint.h>\n")
+    c_fd.write("#include \"cy_device_headers.h\"\n")
+    c_fd.write("\n")
+
+    # Open conditional block
+    if c_macro:
+        c_fd.write("#if defined(" + c_macro + ")\n")
+
+    # Write template
+    c_fd.write(header)
+
+    # Generate list of the data bytes
+    for n in data:
+        c_list.append(format(n, '#04x'))
+
+    for i in range(int(len(c_list) / number_of_columns) + 1):
+        line_list = c_list[i * number_of_columns: (i + 1) * number_of_columns]
+        c_fd.write("   ")
+        for item in line_list:
+            c_fd.write(" %su," % item)
+        c_fd.write("\n")
+
+    c_fd.write("};\n")
+
+    # Close conditional block
+    if c_macro:
+        c_fd.write("#endif /* defined(" + c_macro + ") */")
+    c_fd.write("\n")
+f.close()