Boot: Extend flash layout for multiple images
This patch extends the flash layout of supported platforms, and also
introduces the BOOT_IMAGE_NUMBER macro and the current_image variable
in MCUBoot to support multiple updatable images.
The FLASH_AREA_IMAGE_PRIMARY/SECONDARY object-like macros are replaced
with function-like ones and therefore some functions have been updated,
because the labels of a switch statement and the initialization
values of objects with static storage duration have to be constant
expressions.
Change-Id: Ic4425c9034f877fe2b83d80a3df211232f14a09f
Signed-off-by: David Vincze <david.vincze@arm.com>
diff --git a/bl2/ext/mcuboot/bootutil/src/bootutil_priv.h b/bl2/ext/mcuboot/bootutil/src/bootutil_priv.h
index 5a38dac..9ea1a24 100644
--- a/bl2/ext/mcuboot/bootutil/src/bootutil_priv.h
+++ b/bl2/ext/mcuboot/bootutil/src/bootutil_priv.h
@@ -119,6 +119,12 @@
uint8_t image_num; /* Boot status belongs to this image */
};
+#ifdef MCUBOOT_IMAGE_NUMBER
+#define BOOT_IMAGE_NUMBER MCUBOOT_IMAGE_NUMBER
+#else
+#define BOOT_IMAGE_NUMBER 1
+#endif
+
/*
* Extract the swap type and image number from image trailers's swap_info
* field.
@@ -285,23 +291,19 @@
int num_sectors = BOOT_MAX_IMG_SECTORS;
int rc;
- switch (flash_area) {
- case FLASH_AREA_IMAGE_PRIMARY:
+ if (flash_area == FLASH_AREA_IMAGE_PRIMARY) {
rc = flash_area_to_sectors(flash_area, &num_sectors,
state->imgs[BOOT_PRIMARY_SLOT].sectors);
state->imgs[BOOT_PRIMARY_SLOT].num_sectors = (size_t)num_sectors;
- break;
- case FLASH_AREA_IMAGE_SECONDARY:
+ } else if (flash_area == FLASH_AREA_IMAGE_SECONDARY) {
rc = flash_area_to_sectors(flash_area, &num_sectors,
state->imgs[BOOT_SECONDARY_SLOT].sectors);
state->imgs[BOOT_SECONDARY_SLOT].num_sectors = (size_t)num_sectors;
- break;
- case FLASH_AREA_IMAGE_SCRATCH:
+ } else if (flash_area == FLASH_AREA_IMAGE_SCRATCH) {
rc = flash_area_to_sectors(flash_area, &num_sectors,
state->scratch.sectors);
state->scratch.num_sectors = (size_t)num_sectors;
- break;
- default:
+ } else {
return BOOT_EFLASH;
}
@@ -333,24 +335,19 @@
size_t *out_num_sectors;
int rc;
- switch (flash_area) {
- case FLASH_AREA_IMAGE_PRIMARY:
- num_sectors = BOOT_MAX_IMG_SECTORS;
+ num_sectors = BOOT_MAX_IMG_SECTORS;
+
+ if (flash_area == FLASH_AREA_IMAGE_PRIMARY) {
out_sectors = state->imgs[BOOT_PRIMARY_SLOT].sectors;
out_num_sectors = &state->imgs[BOOT_PRIMARY_SLOT].num_sectors;
- break;
- case FLASH_AREA_IMAGE_SECONDARY:
- num_sectors = BOOT_MAX_IMG_SECTORS;
+ } else if (flash_area == FLASH_AREA_IMAGE_SECONDARY) {
out_sectors = state->imgs[BOOT_SECONDARY_SLOT].sectors;
out_num_sectors = &state->imgs[BOOT_SECONDARY_SLOT].num_sectors;
- break;
- case FLASH_AREA_IMAGE_SCRATCH:
- num_sectors = BOOT_MAX_IMG_SECTORS;
+ } else if (flash_area == FLASH_AREA_IMAGE_SCRATCH) {
out_sectors = state->scratch.sectors;
out_num_sectors = &state->scratch.num_sectors;
- break;
- default:
- return -1;
+ } else {
+ return BOOT_EFLASH;
}
rc = flash_area_get_sectors(flash_area, &num_sectors, out_sectors);