diff --git a/boot/zephyr/include/sysflash/sysflash.h b/boot/zephyr/include/sysflash/sysflash.h index dd759e240..646f1122f 100644 --- a/boot/zephyr/include/sysflash/sysflash.h +++ b/boot/zephyr/include/sysflash/sysflash.h @@ -1,4 +1,8 @@ -/* Manual version of auto-generated version. */ +/* + * Copyright (c) 2023 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: Apache-2.0 + */ #ifndef __SYSFLASH_H__ #define __SYSFLASH_H__ @@ -6,40 +10,42 @@ #include #include #include +#include #ifndef CONFIG_SINGLE_APPLICATION_SLOT +/* Each pair of slots is separated by , and there is no terminating character */ +#define FLASH_AREA_IMAGE_0_SLOTS slot0_partition, slot1_partition +#define FLASH_AREA_IMAGE_1_SLOTS slot2_partition, slot3_partition +#define FLASH_AREA_IMAGE_2_SLOTS slot4_partition, slot5_partition + #if (MCUBOOT_IMAGE_NUMBER == 1) -/* - * NOTE: the definition below returns the same values for true/false on - * purpose, to avoid having to mark x as non-used by all callers when - * running in single image mode. - */ -#define FLASH_AREA_IMAGE_PRIMARY(x) (((x) == 0) ? \ - FIXED_PARTITION_ID(slot0_partition) : \ - FIXED_PARTITION_ID(slot0_partition)) -#define FLASH_AREA_IMAGE_SECONDARY(x) (((x) == 0) ? \ - FIXED_PARTITION_ID(slot1_partition) : \ - FIXED_PARTITION_ID(slot1_partition)) +#define ALL_AVAILABLE_SLOTS FLASH_AREA_IMAGE_0_SLOTS #elif (MCUBOOT_IMAGE_NUMBER == 2) -/* MCUBoot currently supports only up to 2 updateable firmware images. - * If the number of the current image is greater than MCUBOOT_IMAGE_NUMBER - 1 - * then a dummy value will be assigned to the flash area macros. - */ -#define FLASH_AREA_IMAGE_PRIMARY(x) (((x) == 0) ? \ - FIXED_PARTITION_ID(slot0_partition) : \ - ((x) == 1) ? \ - FIXED_PARTITION_ID(slot2_partition) : \ - 255) -#define FLASH_AREA_IMAGE_SECONDARY(x) (((x) == 0) ? \ - FIXED_PARTITION_ID(slot1_partition) : \ - ((x) == 1) ? \ - FIXED_PARTITION_ID(slot3_partition) : \ - 255) -#else -#error "Image slot and flash area mapping is not defined" +#define ALL_AVAILABLE_SLOTS FLASH_AREA_IMAGE_0_SLOTS, \ + FLASH_AREA_IMAGE_1_SLOTS +#elif (MCUBOOT_IMAGE_NUMBER == 3) +#define ALL_AVAILABLE_SLOTS FLASH_AREA_IMAGE_0_SLOTS, \ + FLASH_AREA_IMAGE_1_SLOTS, \ + FLASH_AREA_IMAGE_2_SLOTS #endif +static inline uint32_t __flash_area_ids_for_slot(int img, int slot) +{ + static const int all_slots[] = { + FOR_EACH_NONEMPTY_TERM(FIXED_PARTITION_ID, (,), ALL_AVAILABLE_SLOTS) + }; + return all_slots[img * 2 + slot]; +}; + +#undef FLASH_AREA_IMAGE_0_SLOTS +#undef FLASH_AREA_IMAGE_1_SLOTS +#undef FLASH_AREA_IMAGE_2_SLOTS +#undef ALL_AVAILABLE_SLOTS + +#define FLASH_AREA_IMAGE_PRIMARY(x) __flash_area_ids_for_slot(x, 0) +#define FLASH_AREA_IMAGE_SECONDARY(x) __flash_area_ids_for_slot(x, 1) + #if !defined(CONFIG_BOOT_SWAP_USING_MOVE) #define FLASH_AREA_IMAGE_SCRATCH FIXED_PARTITION_ID(scratch_partition) #endif