Infineon: Add Direct-XIP feature for CYW20829 devices
diff --git a/boot/cypress/scripts/bin2c.py b/boot/cypress/scripts/bin2c.py
index 04bc67a..8cdf147 100644
--- a/boot/cypress/scripts/bin2c.py
+++ b/boot/cypress/scripts/bin2c.py
@@ -15,7 +15,7 @@
 *
 ********************************************************************************
 * \\copyright
-* Copyright (c) 2018-2019 Cypress Semiconductor Corporation
+* Copyright (c) 2018-2025 Cypress Semiconductor Corporation
 * SPDX-License-Identifier: LicenseRef-PBL
 *
 * Licensed under the Permissive Binary License
diff --git a/boot/cypress/scripts/feature.py b/boot/cypress/scripts/feature.py
index a0a61c4..63d7cb9 100644
--- a/boot/cypress/scripts/feature.py
+++ b/boot/cypress/scripts/feature.py
@@ -1,5 +1,5 @@
 """
-Copyright 2024 Cypress Semiconductor Corporation (an Infineon company)
+Copyright 2025 Cypress Semiconductor Corporation (an Infineon company)
 or an affiliate of Cypress Semiconductor Corporation. All rights reserved.
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/boot/cypress/scripts/find_cysectools.py b/boot/cypress/scripts/find_cysectools.py
index 8733575..83faaba 100644
--- a/boot/cypress/scripts/find_cysectools.py
+++ b/boot/cypress/scripts/find_cysectools.py
@@ -1,5 +1,5 @@
 """
-Copyright (c) 2019 Cypress Semiconductor Corporation
+Copyright (c) 2025 Cypress Semiconductor Corporation
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/boot/cypress/scripts/memorymap.py b/boot/cypress/scripts/memorymap.py
index d0799d6..3215dc4 100644
--- a/boot/cypress/scripts/memorymap.py
+++ b/boot/cypress/scripts/memorymap.py
@@ -1,14 +1,21 @@
 """MCUBoot Flash Map Converter (JSON to .h)
-Copyright (c) 2022 Infineon Technologies AG
+Copyright (c) 2025 Infineon Technologies AG
 """
 
 import sys
 import getopt
 import json
+import os
 from enum import Enum
-import os.path
+from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
 
 MAX_IMAGE_NUMBERS = 16
+NONCE_GEN_RETRIES = 10
+NONCE_RAND_SIZE = 12
+AES_BLOCK_SIZE = 16
+IMG_OK_OFFSET = 8 + 16  # flag_size + magic_size
+IMG_OK_VALUE = 0x01
+SHAB_ADDR = 0x08000000
 
 class Error(Enum):
     ''' Application error codes '''
@@ -230,31 +237,36 @@
         self.plat_id = ''
         self.in_file = ''
         self.out_file = ''
+        self.mk_file = ''
         self.fa_file = ''
+        self.nonce_file = None
         self.img_id = None
         self.policy = None
         self.set_core = False
         self.image_boot_config = False
 
         usage = 'USAGE:\n' + sys.argv[0] + \
-                ''' -p <platform> -i <flash_map.json> -o <memorymap.c> -a <memorymap.h> -d <img_id> -c <policy.json>
+                ''' -p <platform> -i <flash_map.json> -o <memorymap.c> -k <memorymap.mk> -a <memorymap.h> -d <img_id> -c <policy.json>
 
 OPTIONS:
--h  --help       Display the usage information
--p  --platform=  Target (e.g., PSOC_062_512K)
--i  --ifile=     JSON flash map file
--o  --ofile=     C file to be generated
--a  --fa_file=   path where to create 'memorymap.h'
--d  --img_id     ID of application to build
--c  --policy     Policy file in JSON format
--m  --core       Detect and set Cortex-M CORE
+-h  --help              Display the usage information
+-p  --platform          Target (e.g., PSOC_062_512K)
+-i  --ifile             JSON flash map file
+-o  --ofile             C file to be generated
+-k  --mk_file           Path where to create 'memorymap.mk'
+-a  --fa_file           Path where to create 'memorymap.h'
+-n  --nonce_file        Path where to create file with NONCE
+-d  --img_id            ID of application to build
+-c  --policy            Policy file in JSON format
+-m  --core              Detect and set Cortex-M CORE
 -x  --image_boot_config Generate image boot config structure
 '''
 
         try:
             opts, unused = getopt.getopt(
-                sys.argv[1:], 'hi:o:a:p:d:c:x:m',
-                ['help', 'platform=', 'ifile=', 'ofile=', "fa_file=", 'img_id=', 'policy=', 'core', 'image_boot_config'])
+                sys.argv[1:], 'h:i:o:k:a:n:p:d:c:x:m',
+                ['help', 'platform=', 'ifile=', 'ofile=', 'mk_file=', 'fa_file=',
+                 'nonce_file=', 'img_id=', 'policy=', 'core', 'image_boot_config'])
         except getopt.GetoptError:
             print(usage, file=sys.stderr)
             sys.exit(Error.ARG)
@@ -269,8 +281,12 @@
                 self.in_file = arg
             elif opt in ('-o', '--ofile'):
                 self.out_file = arg
+            elif opt in ('-k', '--mk_file'):
+                self.mk_file = arg
             elif opt in ('-a', '--fa_file'):
                 self.fa_file = arg
+            elif opt in ('-n', '--nonce_file'):
+                self.nonce_file = arg
             elif opt in ('-d', '--img_id'):
                 self.img_id = arg
             elif opt in ('-c', '--policy'):
@@ -280,7 +296,7 @@
             elif opt in ('x', '--image_boot_config'):
                 self.image_boot_config = True
 
-        if len(self.in_file) == 0 or len(self.out_file) == 0 or len(self.fa_file) == 0:
+        if any(len(x) == 0 for x in (self.in_file, self.out_file, self.mk_file, self.fa_file)):
             print(usage, file=sys.stderr)
             sys.exit(Error.ARG)
 
@@ -351,6 +367,7 @@
         self.plat = plat
         self.flash = flash
         self.use_overwrite = use_overwrite
+        self.use_direct_xip = False
         self.areas = []
         self.peers = {}
         self.trailers = {}
@@ -655,7 +672,7 @@
                 out_f.write(f'#include "{params.fa_file}"\n')
                 out_f.write(f'#include "flash_map_backend.h"\n\n')
                 out_f.write(f'#include "flash_map_backend_platform.h"\n\n')
-                out_f.write(f'struct flash_area {c_array}[] = {{\n')
+                out_f.write(f'const struct flash_area {c_array}[] = {{\n')
                 comma = len(self.areas)
                 area_count = 0
                 for area in self.areas:
@@ -672,7 +689,7 @@
                             '    },' if comma else '    }', '']))
                         area_count += 1
                 out_f.write('};\n\n'
-                            'struct flash_area *boot_area_descs[] = {\n')
+                            'const struct flash_area * const boot_area_descs[] = {\n')
                 for area_index in range(area_count):
                     out_f.write(f'    &{c_array}[{area_index}U],\n')
                 out_f.write('    NULL\n};\n')
@@ -721,8 +738,8 @@
                 fa_f.write(f'#include "flash_map_backend.h"\n\n')
                 fa_f.write('#include "bootutil/bootutil.h"\n')
 
-                fa_f.write(f'extern struct flash_area {c_array}[];\n')
-                fa_f.write(f'extern struct flash_area *boot_area_descs[];\n')
+                fa_f.write(f'extern const struct flash_area {c_array}[];\n')
+                fa_f.write(f'extern const struct flash_area * const boot_area_descs[];\n')
 
                 #we always have BOOTLOADER and IMG_1_
                 fa_f.write("#define FLASH_AREA_BOOTLOADER          ( 0u)\n\n")
@@ -991,10 +1008,19 @@
                         ram = None
 
                 try:
-                    primary_addr = get_val(flash, 'address')
-                    primary_size = get_val(flash, 'size')
-                    secondary_addr = get_val(flash, 'upgrade_address')
-                    secondary_size = get_val(flash, 'upgrade_size')
+                    try:
+                        primary_addr = get_val(flash, 'primary_slot')
+                        secondary_addr = get_val(flash, 'secondary_slot')
+                        primary_size = get_val(flash, 'primary_slot_size')
+                        secondary_size = get_val(flash, 'secondary_slot_size')
+
+                        area_list.use_direct_xip = True
+
+                    except KeyError:
+                        primary_addr = get_val(flash, 'address')
+                        secondary_addr = get_val(flash, 'upgrade_address')
+                        primary_size = get_val(flash, 'size')
+                        secondary_size = get_val(flash, 'upgrade_size')
 
                     if ram is not None:
                         app_ram_addr = get_val(ram, 'address')
@@ -1235,8 +1261,7 @@
     app_desc = None
     if service_app is not None:
         if plat['flashSize'] > 0:
-            print('service_app is unsupported on this platform',
-                  file=sys.stderr)
+            print('service_app is unsupported on this platform', file=sys.stderr)
             sys.exit(Error.CONFIG_MISMATCH)
         try:
             app_binary = AddrSize(service_app, 'address', 'size')
@@ -1250,8 +1275,7 @@
             area_list.add_area('service_app', None, app_binary.addr,
                                app_binary.size + input_params.size + app_desc.size)
         except KeyError as key:
-            print('Malformed JSON:', key, 'is missing',
-                  file=sys.stderr)
+            print('Malformed JSON:', key, 'is missing', file=sys.stderr)
             sys.exit(Error.JSON)
 
     # Fill flash areas
@@ -1263,8 +1287,7 @@
 
     if app_start % plat['VTAlign'] != 0:
         print('Starting address', apps_flash_map[1].get("primary").get("address"),
-              '+', hex(cy_img_hdr_size),
-              'must be aligned to', hex(plat['VTAlign']),
+              '+', hex(cy_img_hdr_size), 'must be aligned to', hex(plat['VTAlign']),
               file=sys.stderr)
         sys.exit(Error.CONFIG_MISMATCH)
 
@@ -1308,39 +1331,45 @@
 
     area_list.create_flash_area_id(app_count, params)
 
-    # Report necessary values back to make
-    print('# AUTO-GENERATED FILE, DO NOT EDIT. ALL CHANGES WILL BE LOST!')
+    # Write necessary values to makefile
+    try:
+        mk_file = open(params.mk_file, "w")
+    except (FileNotFoundError, OSError):
+        print('\nERROR: Cannot create ', params.mk_file, file=sys.stderr)
+        sys.exit(Error.IO)
+
+    print('# AUTO-GENERATED FILE, DO NOT EDIT. ALL CHANGES WILL BE LOST!', file=mk_file)
     if params.set_core:
-        print('CORE :=', plat['allCores'][plat['bootCore'].lower()])
+        print('CORE :=', plat['allCores'][plat['bootCore'].lower()], file=mk_file)
 
     if ram_app_staging is not None:
-        print('USE_STAGE_RAM_APPS := 1')
-        print('RAM_APP_STAGING_EXT_MEM_ADDR := ', hex(ram_app_staging_ext_mem_addr))
-        print('RAM_APP_STAGING_SRAM_MEM_ADDR :=', hex(ram_app_staging_sram_stage_addr))
-        print('RAM_APP_STAGING_SIZE := ', hex(ram_app_staging_size))
+        print('USE_STAGE_RAM_APPS := 1', file=mk_file)
+        print('RAM_APP_STAGING_EXT_MEM_ADDR := ', hex(ram_app_staging_ext_mem_addr), file=mk_file)
+        print('RAM_APP_STAGING_SRAM_MEM_ADDR :=', hex(ram_app_staging_sram_stage_addr), file=mk_file)
+        print('RAM_APP_STAGING_SIZE := ', hex(ram_app_staging_size), file=mk_file)
         if ram_app_staging_reset_trigger is True:
-            print('RAM_APP_RESET_TRIGGER := 1')
+            print('RAM_APP_RESET_TRIGGER := 1', file=mk_file)
 
     if bootloader_startup is True:
-        print('BOOTLOADER_STARTUP := 1')
+        print('BOOTLOADER_STARTUP := 1', file=mk_file)
 
     if ram_app_area is not None:
-        print('USE_MCUBOOT_RAM_LOAD := 1')
-        print('IMAGE_EXECUTABLE_RAM_START :=', hex(ram_app_area.addr))
-        print('IMAGE_EXECUTABLE_RAM_SIZE :=', hex(ram_app_area.size))
+        print('USE_MCUBOOT_RAM_LOAD := 1', file=mk_file)
+        print('IMAGE_EXECUTABLE_RAM_START :=', hex(ram_app_area.addr), file=mk_file)
+        print('IMAGE_EXECUTABLE_RAM_SIZE :=', hex(ram_app_area.size), file=mk_file)
 
     if boot_shared_data_area is not None:
-        print('USE_MEASURED_BOOT := 1')
-        print('USE_DATA_SHARING := 1')
-        print('BOOT_SHARED_DATA_ADDRESS :=', hex(boot_shared_data_area.addr)+'U')
-        print('BOOT_SHARED_DATA_SIZE :=', hex(boot_shared_data_area.size)+'U')
-        print('BOOT_SHARED_DATA_RECORD_SIZE :=', hex(boot_shared_data_area.size)+'U')
+        print('USE_MEASURED_BOOT := 1', file=mk_file)
+        print('USE_DATA_SHARING := 1', file=mk_file)
+        print('BOOT_SHARED_DATA_ADDRESS :=', hex(boot_shared_data_area.addr)+'U', file=mk_file)
+        print('BOOT_SHARED_DATA_SIZE :=', hex(boot_shared_data_area.size)+'U', file=mk_file)
+        print('BOOT_SHARED_DATA_RECORD_SIZE :=', hex(boot_shared_data_area.size)+'U', file=mk_file)
 
-    print('BOOTLOADER_ORIGIN :=', hex(boot_flash_area.addr))
-    print('BOOTLOADER_SIZE :=', hex(boot_flash_area.size))
-    print('BOOTLOADER_RAM_ORIGIN :=', hex(boot_ram_area.addr))
-    print('BOOTLOADER_RAM_SIZE :=', hex(boot_ram_area.size))
-    print('APP_CORE :=', app_core)
+    print('BOOTLOADER_ORIGIN :=', hex(boot_flash_area.addr), file=mk_file)
+    print('BOOTLOADER_SIZE :=', hex(boot_flash_area.size), file=mk_file)
+    print('BOOTLOADER_RAM_ORIGIN :=', hex(boot_ram_area.addr), file=mk_file)
+    print('BOOTLOADER_RAM_SIZE :=', hex(boot_ram_area.size), file=mk_file)
+    print('APP_CORE :=', app_core, file=mk_file)
 
     # for blinky
     if params.img_id is not None:
@@ -1353,14 +1382,14 @@
             image_ram_size = apps_ram_map[int(params.img_id)].get("size")
             image_ram_boot = apps_ram_map[int(params.img_id)].get("ram_boot")
             if image_ram_address and image_ram_size:
-                print('IMG_RAM_ORIGIN := ' + hex(image_ram_address))
-                print('IMG_RAM_SIZE := ' + hex(image_ram_size))
+                print('IMG_RAM_ORIGIN := ' + hex(image_ram_address), file=mk_file)
+                print('IMG_RAM_SIZE := ' + hex(image_ram_size), file=mk_file)
                 if image_ram_boot is True:
-                    print('USE_MCUBOOT_RAM_LOAD := 1')
+                    print('USE_MCUBOOT_RAM_LOAD := 1', file=mk_file)
 
-        print('PRIMARY_IMG_START := ' + primary_img_start)
-        print('SECONDARY_IMG_START := ' + secondary_img_start)
-        print('SLOT_SIZE := ' + slot_size)
+        print('PRIMARY_IMG_START := ' + primary_img_start, file=mk_file)
+        print('SECONDARY_IMG_START := ' + secondary_img_start, file=mk_file)
+        print('SLOT_SIZE := ' + slot_size, file=mk_file)
     # for bootloader
     else:
         if apps_ram_map:
@@ -1370,34 +1399,96 @@
                     ram_load_counter += 1
 
             if ram_load_counter != 0:
-                print('USE_MCUBOOT_RAM_LOAD := 1')
+                print('USE_MCUBOOT_RAM_LOAD := 1', file=mk_file)
                 if ram_load_counter == 1:
-                    print(f'IMAGE_EXECUTABLE_RAM_START := {hex(apps_ram_map[1].get("address"))}')
-                    print(f'IMAGE_EXECUTABLE_RAM_SIZE := {hex(apps_ram_map[1].get("size"))}')
+                    print(f'IMAGE_EXECUTABLE_RAM_START := {hex(apps_ram_map[1].get("address"))}', file=mk_file)
+                    print(f'IMAGE_EXECUTABLE_RAM_SIZE := {hex(apps_ram_map[1].get("size"))}', file=mk_file)
                 else:
-                    print('USE_MCUBOOT_MULTI_MEMORY_LOAD := 1')
+                    print('USE_MCUBOOT_MULTI_MEMORY_LOAD := 1', file=mk_file)
 
-        print('MAX_IMG_SECTORS :=', slot_sectors_max)
+        print('MAX_IMG_SECTORS :=', slot_sectors_max, file=mk_file)
 
-    print('MCUBOOT_IMAGE_NUMBER :=', app_count)
+    print('MCUBOOT_IMAGE_NUMBER :=', app_count, file=mk_file)
     if area_list.external_flash:
-        print('USE_EXTERNAL_FLASH := 1')
+        print('USE_EXTERNAL_FLASH := 1', file=mk_file)
     if area_list.external_flash_xip:
-        print('USE_XIP := 1')
+        print('USE_XIP := 1', file=mk_file)
 
-    if area_list.use_overwrite:
-        print('USE_OVERWRITE := 1')
+    if area_list.use_direct_xip:
+        print('USE_DIRECT_XIP := 1', file=mk_file)
+    elif area_list.use_overwrite:
+        print('USE_OVERWRITE := 1', file=mk_file)
+
     if shared_slot:
-        print('USE_SHARED_SLOT := 1')
+        print('USE_SHARED_SLOT := 1', file=mk_file)
     if service_app is not None:
         print('PLATFORM_SERVICE_APP_OFFSET :=',
-              hex(app_binary.addr - plat['smifAddr']))
+              hex(app_binary.addr - plat['smifAddr']), file=mk_file)
         print('PLATFORM_SERVICE_APP_INPUT_PARAMS_OFFSET :=',
-              hex(input_params.addr - plat['smifAddr']))
+              hex(input_params.addr - plat['smifAddr']), file=mk_file)
         print('PLATFORM_SERVICE_APP_DESC_OFFSET :=',
-              hex(app_desc.addr - plat['smifAddr']))
-        print('USE_HW_ROLLBACK_PROT := 1')
+              hex(app_desc.addr - plat['smifAddr']), file=mk_file)
+        print('USE_HW_ROLLBACK_PROT := 1', file=mk_file)
+    mk_file.close()
 
+    if params.nonce_file and not os.path.isfile(params.nonce_file):
+        try:
+            with open(params.policy, encoding='UTF-8') as in_f:
+                try:
+                    policy = json.load(in_f)
+                except ValueError:
+                    print('\nERROR: Cannot parse', params.policy, '\n', file=sys.stderr)
+                    sys.exit(Error.IO)
+        except (FileNotFoundError, OSError):
+            print('\nERROR: Cannot open', params.policy, file=sys.stderr)
+            sys.exit(Error.IO)
+
+        policy_key_path = policy.get('pre_build', {}).get('keys', {}).get('encrypt_key', {}).get('value', {})
+        if policy_key_path:
+            full_key_path = os.path.join(os.path.dirname(params.policy), policy_key_path)
+            try:
+                with open(full_key_path, "rb") as aes_key_file:
+                    aes_key = aes_key_file.read()
+            except (FileNotFoundError, OSError):
+                print('Missing encryption key', full_key_path, '\nNonce file generation skipped')
+                sys.exit(0)
+
+            if len(aes_key) != AES_BLOCK_SIZE:
+                print('\nERROR: Wrong AES key size in ', full_key_path, file=sys.stderr)
+                sys.exit(Error.CONFIG_MISMATCH)
+
+            for i in range(NONCE_GEN_RETRIES):
+                random_bytes = os.urandom(NONCE_RAND_SIZE)
+                fa_ids = [entry['fa_off'] + entry['fa_size'] for entry in area_list.areas
+                          if entry['fa_id'].startswith('FLASH_AREA_IMG_')]
+                for fa_end_addr in fa_ids:
+                    img_ok_addr = SHAB_ADDR + fa_end_addr - IMG_OK_OFFSET
+                    img_ok_block_addr = img_ok_addr & ~(AES_BLOCK_SIZE - 1)
+                    nonce = img_ok_block_addr.to_bytes(AES_BLOCK_SIZE - NONCE_RAND_SIZE,
+                                                         byteorder='little') + random_bytes
+                    cipher = Cipher(algorithms.AES(aes_key), modes.CTR(nonce))
+                    encryptor_0 = cipher.encryptor()
+                    encryptor_1 = cipher.encryptor()
+                    encrypted_block_0 = encryptor_0.update(b'\x00' * AES_BLOCK_SIZE)
+                    encrypted_block_1 = encryptor_1.update(b'\xFF' * AES_BLOCK_SIZE)
+
+                    if encrypted_block_0[img_ok_addr - img_ok_block_addr] == IMG_OK_VALUE or \
+                       encrypted_block_1[img_ok_addr - img_ok_block_addr] == IMG_OK_VALUE:
+                        break
+                else:
+                    break
+            else:
+                print("\nERROR: Can't generate valid NONCE sequence", file=sys.stderr)
+                sys.exit(Error.VALUE)
+
+            try:
+                if '/' in params.nonce_file or '\\' in params.nonce_file:
+                    os.makedirs(os.path.dirname(params.nonce_file), exist_ok=True)
+                with open(params.nonce_file, "wb") as nonce_f:
+                    nonce_f.write(random_bytes)
+            except (FileNotFoundError, OSError):
+                print('\nERROR: Cannot create ', params.nonce_file, file=sys.stderr)
+                sys.exit(Error.IO)
 
 if __name__ == '__main__':
     main()
diff --git a/boot/cypress/scripts/memorymap_rework.py b/boot/cypress/scripts/memorymap_rework.py
index 01b541f..5167475 100644
--- a/boot/cypress/scripts/memorymap_rework.py
+++ b/boot/cypress/scripts/memorymap_rework.py
@@ -1,5 +1,5 @@
 """
-Copyright 2024 Cypress Semiconductor Corporation (an Infineon company)
+Copyright 2025 Cypress Semiconductor Corporation (an Infineon company)
 or an affiliate of Cypress Semiconductor Corporation. All rights reserved.
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -57,6 +57,8 @@
     ,   'secondary_image_start'     :   'SECONDARY_IMG_START'
     ,   'secondary_image_area'      :   'SECONDARY_IMG_AREA'
     ,   'image_size'                :   'SLOT_SIZE'
+    ,   'erase_size'                :   'MIN_ERASE_SIZE'
+    ,   'erase_value'               :   'ERASE_VALUE'
 }
 
 def header_guard_generate(file):
@@ -316,8 +318,7 @@
 
         if region_name_alt:
             if "boot" in key:
-                if region_name_alt not in self.region_types_alt:
-                    self.region_types_alt.append(region_name_alt)
+                self.region_types_alt.append(region_name_alt)
 
         offset = area.addr - region.addr
         size = area.sz
@@ -409,14 +410,13 @@
             f_out.write('struct flash_device flash_devices[] =\n')
             f_out.write('{\n')
             for region in self.regions:
-                if region.mem_type[0] in self.region_types:
-                    f_out.write('\t{\n')
-                    f_out.write(f'\t\t.address      = {hex(region.addr)}U,\n')
-                    f_out.write(f'\t\t.size         = {hex(region.sz)}U,\n')
-                    f_out.write(f'\t\t.erase_size   = {hex(region.erase_sz)}U,\n')
-                    f_out.write(f'\t\t.erase_val    = {hex(region.erase_val)}U,\n')
-                    f_out.write(f'\t\t.device_id    = {str(region.mem_type[0])},\n')
-                    f_out.write('\t},\n')
+                f_out.write(f'\t[{region.mem_type[0]}] = ' + '{\n')
+                f_out.write(f'\t\t.address      = {hex(region.addr)}U,\n')
+                f_out.write(f'\t\t.size         = {hex(region.sz)}U,\n')
+                f_out.write(f'\t\t.erase_size   = {hex(region.erase_sz)}U,\n')
+                f_out.write(f'\t\t.erase_val    = {hex(region.erase_val)}U,\n')
+                f_out.write(f'\t\t.device_id    = {str(region.mem_type[0])},\n')
+                f_out.write('\t},\n')
             f_out.write('};\n\n')
 
             f_out.write(f'struct flash_area flash_areas[] =\n')
@@ -450,7 +450,7 @@
             f_out.write('\n};\n\n')
 
             f_out.write('image_boot_config_t image_boot_config[BOOT_IMAGE_NUMBER] = {\n')
-            
+
             for app in self.apps:
                 f_out.writelines('\n'.join([
                     '\t{\n'
@@ -484,8 +484,7 @@
             # because it fixes the bug when enum {INTERNAL_RRAM, EXTERNAL_FLASH,}
             # is generated in incorrect sequence.
             for region in self.regions:
-                if region.mem_type[0] in self.region_types:
-                    f_out.write(f'\t{str(region.mem_type[0])},\n')
+                f_out.write(f'\t{str(region.mem_type[0])},\n')
             f_out.write('};\n\n')
 
             f_out.write('enum \n{\n')
@@ -539,6 +538,11 @@
             print(f'{settings_dict["shared_data_size"]} :=', hex(shared_data.sz))
             print(f'{settings_dict["shared_data_record_size"]} :=', hex(shared_data.sz))
 
+        print('# Bootloader erase area')
+        for region in self.regions:
+            print(f'{region.mem_type[0]}_{settings_dict["erase_size"]} :=', hex(region.erase_sz))
+            print(f'{region.mem_type[0]}_{settings_dict["erase_value"]} :=', hex(region.erase_val))
+
         print('# Bootloader app area')
         for region in self.regions:
             if boot.bootloader_area.fits_with(region):
@@ -552,7 +556,7 @@
             print('# Bootloader ram area')
             print(f'{settings_dict["bootloader_ram_address"]} :=', hex(boot.ram.addr))
             print(f'{settings_dict["bootloader_ram_size"]} :=', hex(boot.ram.sz))
-        
+
         if boot.ram_boot:
             print(f'{settings_dict["bootloader_ram_load"]} := 1')
             print(f'{settings_dict["bootloader_ram_address"]} :=',  hex(boot.ram_boot.addr))
@@ -628,6 +632,12 @@
             print(settings_dict['scratch'], f':= {0 if boot.scratch_area is None else 1}')
             print(settings_dict['status'], f':= {0 if boot.status_area is None else 1}')
 
+        print('# Application erase area')
+        for region in self.regions:
+            print(f'{region.mem_type[0]}_{settings_dict["erase_size"]} :=', hex(region.erase_sz))
+            print(f'{region.mem_type[0]}_{settings_dict["erase_value"]} :=', hex(region.erase_val))
+
+        print('# Application area')
         print(settings_dict['application_count'], f'= {len(self.apps)}')
         print(settings_dict['boot_image'], ':=', self.app_id)
         print(settings_dict['primary_image_start'], ':=', hex(app.boot_area.addr))
diff --git a/boot/cypress/scripts/verbose_make.py b/boot/cypress/scripts/verbose_make.py
index c9cc037..c9d2d34 100644
--- a/boot/cypress/scripts/verbose_make.py
+++ b/boot/cypress/scripts/verbose_make.py
@@ -1,5 +1,5 @@
 """VERBOSE Makefile Generator
-Copyright (c) 2022 Infineon Technologies AG
+Copyright (c) 2025 Infineon Technologies AG
 """
 
 import os