diff options
author | Michel Jaouen <michel.jaouen@st.com> | 2020-12-03 10:37:22 +0100 |
---|---|---|
committer | Michel Jaouen <michel.jaouen@st.com> | 2020-12-18 08:00:13 +0100 |
commit | 26f6c028a5b336bd5b3a65b6c2fd728212f32b76 (patch) | |
tree | 0add430ea7363b71d93594b6912b81a316cd03bc | |
parent | 0a9e53749e5759af242f3d62eb6d6e65b9cfc81e (diff) | |
download | trusted-firmware-m-26f6c028a5b336bd5b3a65b6c2fd728212f32b76.tar.gz |
Boot: Add multiple flash driver support
(T862) External flash support on stm uses 2 drivers :
- internal flash slot 0/1, scratch : driver internal flash
- external flash slot 2/3 : octospi driver external flash
Change-Id: I58d86a48081ad0bca3dda961318a15fe17248a93
Signed-off-by: Michel Jaouen <michel.jaouen@st.com>
-rw-r--r-- | bl2/ext/mcuboot/flash_map_extended.c | 12 | ||||
-rw-r--r-- | bl2/ext/mcuboot/include/flash_map/flash_map.h | 12 | ||||
-rw-r--r-- | bl2/ext/mcuboot/include/target.h | 25 | ||||
-rw-r--r-- | bl2/src/flash_map.c | 63 |
4 files changed, 92 insertions, 20 deletions
diff --git a/bl2/ext/mcuboot/flash_map_extended.c b/bl2/ext/mcuboot/flash_map_extended.c index cf7d3f52a3..e854b552cd 100644 --- a/bl2/ext/mcuboot/flash_map_extended.c +++ b/bl2/ext/mcuboot/flash_map_extended.c @@ -14,16 +14,14 @@ #include <errno.h> #include "target.h" +#include "cmsis.h" #include "Driver_Flash.h" #include "sysflash/sysflash.h" #include "flash_map/flash_map.h" #include "flash_map_backend/flash_map_backend.h" #include "bootutil/bootutil_log.h" -/* Flash device name must be specified by target */ -extern ARM_DRIVER_FLASH FLASH_DEV_NAME; - -int flash_device_base(uint8_t fd_id, uintptr_t *ret) +__WEAK int flash_device_base(uint8_t fd_id, uintptr_t *ret) { if (fd_id != FLASH_DEVICE_ID) { BOOT_LOG_ERR("invalid flash ID %d; expected %d", @@ -75,9 +73,7 @@ int flash_area_id_to_image_slot(int area_id) uint8_t flash_area_erased_val(const struct flash_area *fap) { - (void)fap; - - return FLASH_DEV_NAME.GetInfo()->erased_value; + return DRV_FLASH_AREA(fap)->GetInfo()->erased_value; } int flash_area_read_is_empty(const struct flash_area *fa, uint32_t off, @@ -90,7 +86,7 @@ int flash_area_read_is_empty(const struct flash_area *fa, uint32_t off, BOOT_LOG_DBG("read_is_empty area=%d, off=%#x, len=%#x", fa->fa_id, off, len); - rc = FLASH_DEV_NAME.ReadData(fa->fa_off + off, dst, len); + rc = DRV_FLASH_AREA(fa)->ReadData(fa->fa_off + off, dst, len); if (rc) { return -1; } diff --git a/bl2/ext/mcuboot/include/flash_map/flash_map.h b/bl2/ext/mcuboot/include/flash_map/flash_map.h index d858ef458d..b66dfc02d2 100644 --- a/bl2/ext/mcuboot/include/flash_map/flash_map.h +++ b/bl2/ext/mcuboot/include/flash_map/flash_map.h @@ -50,6 +50,7 @@ extern "C" { */ #include <inttypes.h> #include "region_defs.h" +#include "Driver_Flash.h" /* * For now, we only support one flash device. @@ -91,6 +92,11 @@ struct flash_area { uint16_t pad16; /** + * Pointer to driver + */ + ARM_DRIVER_FLASH *fa_driver; + + /** * This area's offset, relative to the beginning of its flash * device's storage. */ @@ -121,6 +127,12 @@ struct flash_sector { uint32_t fs_size; }; +/** + * @brief Macro retrieving driver from struct flash area + * + */ +#define DRV_FLASH_AREA(area) ((area)->fa_driver) + /* * Start using flash area. */ diff --git a/bl2/ext/mcuboot/include/target.h b/bl2/ext/mcuboot/include/target.h index d4350b0325..9ead129861 100644 --- a/bl2/ext/mcuboot/include/target.h +++ b/bl2/ext/mcuboot/include/target.h @@ -47,6 +47,11 @@ defined by the target" #error "FLASH_AREA_0_SIZE must be defined by the target" #endif +#if defined(FLASH_DEV_NAME_0) != defined(FLASH_DEVICE_ID_0) +#error "FLASH DEV_NAME_0 and DEVICE_ID_0 must be simultaneously defined or not \ +by target" +#endif + #ifndef FLASH_AREA_2_OFFSET #error "FLASH_AREA_2_OFFSET must be defined by the target" #endif @@ -55,6 +60,11 @@ defined by the target" #error "FLASH_AREA_2_SIZE must be defined by the target" #endif +#if defined(FLASH_DEV_NAME_2) != defined(FLASH_DEVICE_ID_2) +#error "FLASH DEV_NAME_2 and DEVICE_ID_2 must be simultaneously defined or not \ +by target" +#endif + #if (MCUBOOT_IMAGE_NUMBER == 2) #ifndef FLASH_AREA_1_OFFSET #error "FLASH_AREA_1_OFFSET must be defined by the target" @@ -64,6 +74,11 @@ defined by the target" #error "FLASH_AREA_1_SIZE must be defined by the target" #endif +#if defined(FLASH_DEV_NAME_1) != defined(FLASH_DEVICE_ID_1) +#error "FLASH DEV_NAME_1 and DEVICE_ID_1 must be simultaneously defined or not \ +by target" +#endif + #ifndef FLASH_AREA_3_OFFSET #error "FLASH_AREA_3_OFFSET must be defined by the target" #endif @@ -71,6 +86,11 @@ defined by the target" #ifndef FLASH_AREA_3_SIZE #error "FLASH_AREA_3_SIZE must be defined by the target" #endif + +#if defined(FLASH_DEV_NAME_3) != defined(FLASH_DEVICE_ID_3) +#error "FLASH DEV_NAME_3 and DEVICE_ID_3 must be simultaneously defined or not \ +by target" +#endif #endif /* (MCUBOOT_IMAGE_NUMBER == 2) */ #ifndef FLASH_AREA_SCRATCH_OFFSET @@ -81,6 +101,11 @@ defined by the target" #error "FLASH_AREA_SCRATCH_SIZE must be defined by the target" #endif +#if defined(FLASH_DEV_NAME_SCRATCH) != defined(FLASH_DEVICE_ID_SCRATCH) +#error "FLASH DEV_NAME_SCRATCH and DEVICE_ID_SCRATCH must be simultaneously defined \ +or not by target" +#endif + #ifndef FLASH_DEV_NAME #error "BL2 supports CMSIS flash interface and device name must be specified" #endif diff --git a/bl2/src/flash_map.c b/bl2/src/flash_map.c index 7676da2f73..4286f86e66 100644 --- a/bl2/src/flash_map.c +++ b/bl2/src/flash_map.c @@ -12,41 +12,80 @@ #include "bootutil/bootutil_log.h" #include "Driver_Flash.h" -/* Flash device name must be specified by target */ -extern ARM_DRIVER_FLASH FLASH_DEV_NAME; +/* When undefined FLASH_DEV_NAME_0 or FLASH_DEVICE_ID_0 , default */ +#if !defined(FLASH_DEV_NAME_0) || !defined(FLASH_DEVICE_ID_0) +#define FLASH_DEV_NAME_0 FLASH_DEV_NAME +#define FLASH_DEVICE_ID_0 FLASH_DEVICE_ID +#endif + +/* When undefined FLASH_DEV_NAME_1 or FLASH_DEVICE_ID_1 , default */ +#if !defined(FLASH_DEV_NAME_1) || !defined(FLASH_DEVICE_ID_1) +#define FLASH_DEV_NAME_1 FLASH_DEV_NAME +#define FLASH_DEVICE_ID_1 FLASH_DEVICE_ID +#endif + +/* When undefined FLASH_DEV_NAME_2 or FLASH_DEVICE_ID_2 , default */ +#if !defined(FLASH_DEV_NAME_2) || !defined(FLASH_DEVICE_ID_2) +#define FLASH_DEV_NAME_2 FLASH_DEV_NAME +#define FLASH_DEVICE_ID_2 FLASH_DEVICE_ID +#endif + +/* When undefined FLASH_DEV_NAME_3 or FLASH_DEVICE_ID_3 , default */ +#if !defined(FLASH_DEV_NAME_3) || !defined(FLASH_DEVICE_ID_3) +#define FLASH_DEV_NAME_3 FLASH_DEV_NAME +#define FLASH_DEVICE_ID_3 FLASH_DEVICE_ID +#endif + +/* When undefined FLASH_DEV_NAME_SCRATCH or FLASH_DEVICE_ID_SCRATCH , default */ +#if !defined(FLASH_DEV_NAME_SCRATCH) || !defined(FLASH_DEVICE_ID_SCRATCH) +#define FLASH_DEV_NAME_SCRATCH FLASH_DEV_NAME +#define FLASH_DEVICE_ID_SCRATCH FLASH_DEVICE_ID +#endif #define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0])) +/* Flash device names must be specified by target */ +extern ARM_DRIVER_FLASH FLASH_DEV_NAME_0; +extern ARM_DRIVER_FLASH FLASH_DEV_NAME_1; +extern ARM_DRIVER_FLASH FLASH_DEV_NAME_2; +extern ARM_DRIVER_FLASH FLASH_DEV_NAME_3; +extern ARM_DRIVER_FLASH FLASH_DEV_NAME_SCRATCH; + static const struct flash_area flash_map[] = { { .fa_id = FLASH_AREA_0_ID, - .fa_device_id = FLASH_DEVICE_ID, + .fa_device_id = FLASH_DEVICE_ID_0, + .fa_driver = &FLASH_DEV_NAME_0, .fa_off = FLASH_AREA_0_OFFSET, .fa_size = FLASH_AREA_0_SIZE, }, { .fa_id = FLASH_AREA_2_ID, - .fa_device_id = FLASH_DEVICE_ID, + .fa_device_id = FLASH_DEVICE_ID_2, + .fa_driver = &FLASH_DEV_NAME_2, .fa_off = FLASH_AREA_2_OFFSET, .fa_size = FLASH_AREA_2_SIZE, }, #if (MCUBOOT_IMAGE_NUMBER == 2) { .fa_id = FLASH_AREA_1_ID, - .fa_device_id = FLASH_DEVICE_ID, + .fa_device_id = FLASH_DEVICE_ID_1, + .fa_driver = &FLASH_DEV_NAME_1, .fa_off = FLASH_AREA_1_OFFSET, .fa_size = FLASH_AREA_1_SIZE, }, { .fa_id = FLASH_AREA_3_ID, - .fa_device_id = FLASH_DEVICE_ID, + .fa_device_id = FLASH_DEVICE_ID_3, + .fa_driver = &FLASH_DEV_NAME_3, .fa_off = FLASH_AREA_3_OFFSET, .fa_size = FLASH_AREA_3_SIZE, }, #endif { .fa_id = FLASH_AREA_SCRATCH_ID, - .fa_device_id = FLASH_DEVICE_ID, + .fa_device_id = FLASH_DEVICE_ID_SCRATCH, + .fa_driver = &FLASH_DEV_NAME_SCRATCH, .fa_off = FLASH_AREA_SCRATCH_OFFSET, .fa_size = FLASH_AREA_SCRATCH_SIZE, }, @@ -86,14 +125,14 @@ int flash_area_read(const struct flash_area *area, uint32_t off, void *dst, uint32_t len) { BOOT_LOG_DBG("read area=%d, off=%#x, len=%#x", area->fa_id, off, len); - return FLASH_DEV_NAME.ReadData(area->fa_off + off, dst, len); + return DRV_FLASH_AREA(area)->ReadData(area->fa_off + off, dst, len); } int flash_area_write(const struct flash_area *area, uint32_t off, const void *src, uint32_t len) { BOOT_LOG_DBG("write area=%d, off=%#x, len=%#x", area->fa_id, off, len); - return FLASH_DEV_NAME.ProgramData(area->fa_off + off, src, len); + return DRV_FLASH_AREA(area)->ProgramData(area->fa_off + off, src, len); } int flash_area_erase(const struct flash_area *area, uint32_t off, uint32_t len) @@ -103,12 +142,12 @@ int flash_area_erase(const struct flash_area *area, uint32_t off, uint32_t len) int32_t rc = 0; BOOT_LOG_DBG("erase area=%d, off=%#x, len=%#x", area->fa_id, off, len); - flash_info = FLASH_DEV_NAME.GetInfo(); + flash_info = DRV_FLASH_AREA(area)->GetInfo(); if (flash_info->sector_info == NULL) { /* Uniform sector layout */ while (deleted_len < len) { - rc = FLASH_DEV_NAME.EraseSector(area->fa_off + off); + rc = DRV_FLASH_AREA(area)->EraseSector(area->fa_off + off); if (rc != 0) { break; } @@ -128,6 +167,6 @@ uint32_t flash_area_align(const struct flash_area *area) { ARM_FLASH_INFO *flash_info; - flash_info = FLASH_DEV_NAME.GetInfo(); + flash_info = DRV_FLASH_AREA(area)->GetInfo(); return flash_info->program_unit; } |