diff options
-rw-r--r-- | ports/stm32/mboot/main.c | 76 |
1 files changed, 60 insertions, 16 deletions
diff --git a/ports/stm32/mboot/main.c b/ports/stm32/mboot/main.c index 9bb2dcfcaf..01f8892a51 100644 --- a/ports/stm32/mboot/main.c +++ b/ports/stm32/mboot/main.c @@ -429,38 +429,82 @@ void mp_hal_pin_config_speed(uint32_t port_pin, uint32_t speed) { || defined(STM32F723xx) \ || defined(STM32F732xx) \ || defined(STM32F733xx) -#define FLASH_LAYOUT_STR "@Internal Flash /0x08000000/04*016Kg,01*064Kg,07*128Kg" MBOOT_SPIFLASH_LAYOUT MBOOT_SPIFLASH2_LAYOUT +#define INTERNAL_FLASH_LAYOUT "@Internal Flash /0x08000000/04*016Kg,01*064Kg,07*128Kg" #elif defined(STM32F765xx) || defined(STM32F767xx) || defined(STM32F769xx) -#define FLASH_LAYOUT_STR "@Internal Flash /0x08000000/04*032Kg,01*128Kg,07*256Kg" MBOOT_SPIFLASH_LAYOUT MBOOT_SPIFLASH2_LAYOUT +#define INTERNAL_FLASH_LAYOUT "@Internal Flash /0x08000000/04*032Kg,01*128Kg,07*256Kg" #elif defined(STM32G0) -#define FLASH_LAYOUT_STR "@Internal Flash /0x08000000/256*02Kg" MBOOT_SPIFLASH_LAYOUT MBOOT_SPIFLASH2_LAYOUT +#define INTERNAL_FLASH_LAYOUT "@Internal Flash /0x08000000/256*02Kg" #elif defined(STM32H5) -#define FLASH_LAYOUT_TEMPLATE "@Internal Flash /0x08000000/???*08Kg" MBOOT_SPIFLASH_LAYOUT MBOOT_SPIFLASH2_LAYOUT +#define INTERNAL_FLASH_LAYOUT "@Internal Flash /0x08000000/???*08Kg" +#define INTERNAL_FLASH_LAYOUT_HAS_TEMPLATE (1) #elif defined(STM32H743xx) -#define FLASH_LAYOUT_STR "@Internal Flash /0x08000000/16*128Kg" MBOOT_SPIFLASH_LAYOUT MBOOT_SPIFLASH2_LAYOUT +#define INTERNAL_FLASH_LAYOUT "@Internal Flash /0x08000000/16*128Kg" #elif defined(STM32H750xx) -#define FLASH_LAYOUT_STR "@Internal Flash /0x08000000/01*128Kg" MBOOT_SPIFLASH_LAYOUT MBOOT_SPIFLASH2_LAYOUT +#define INTERNAL_FLASH_LAYOUT "@Internal Flash /0x08000000/01*128Kg" #elif defined(STM32WB) -#define FLASH_LAYOUT_STR "@Internal Flash /0x08000000/256*04Kg" MBOOT_SPIFLASH_LAYOUT MBOOT_SPIFLASH2_LAYOUT +#define INTERNAL_FLASH_LAYOUT "@Internal Flash /0x08000000/256*04Kg" #endif -#if !defined(FLASH_LAYOUT_STR) +#if INTERNAL_FLASH_LAYOUT_HAS_TEMPLATE \ + || defined(MBOOT_SPIFLASH_LAYOUT_DYNAMIC_MAX_LEN) \ + || defined(MBOOT_SPIFLASH2_LAYOUT_DYNAMIC_MAX_LEN) -#define FLASH_LAYOUT_STR_ALLOC (sizeof(FLASH_LAYOUT_TEMPLATE)) +#ifndef MBOOT_SPIFLASH_LAYOUT_DYNAMIC_MAX_LEN +#define MBOOT_SPIFLASH_LAYOUT_DYNAMIC_MAX_LEN (sizeof(MBOOT_SPIFLASH_LAYOUT) - 1) +#endif + +#ifndef MBOOT_SPIFLASH2_LAYOUT_DYNAMIC_MAX_LEN +#define MBOOT_SPIFLASH2_LAYOUT_DYNAMIC_MAX_LEN (sizeof(MBOOT_SPIFLASH2_LAYOUT) - 1) +#endif + +#define FLASH_LAYOUT_STR_ALLOC \ + ( \ + (sizeof(INTERNAL_FLASH_LAYOUT) - 1) \ + + MBOOT_SPIFLASH_LAYOUT_DYNAMIC_MAX_LEN \ + + MBOOT_SPIFLASH2_LAYOUT_DYNAMIC_MAX_LEN \ + + 1 \ + ) // Build the flash layout string from a template with total flash size inserted. -static size_t build_flash_layout_str(char *buf) { - size_t len = FLASH_LAYOUT_STR_ALLOC - 1; - memcpy(buf, FLASH_LAYOUT_TEMPLATE, len + 1); +static size_t build_flash_layout_str(uint8_t *buf) { + const char *internal_layout = INTERNAL_FLASH_LAYOUT; + size_t internal_layout_len = strlen(internal_layout); + + const char *spiflash_layout = MBOOT_SPIFLASH_LAYOUT; + size_t spiflash_layout_len = strlen(spiflash_layout); + + const char *spiflash2_layout = MBOOT_SPIFLASH2_LAYOUT; + size_t spiflash2_layout_len = strlen(spiflash2_layout); + + uint8_t *buf_orig = buf; + + memcpy(buf, internal_layout, internal_layout_len); + buf += internal_layout_len; + + #if INTERNAL_FLASH_LAYOUT_HAS_TEMPLATE unsigned int num_sectors = FLASH_SIZE / FLASH_SECTOR_SIZE; - buf += 31; // location of "???" in FLASH_LAYOUT_TEMPLATE + uint8_t *buf_size = buf_orig + 31; // location of "???" in FLASH_LAYOUT_TEMPLATE for (unsigned int i = 0; i < 3; ++i) { - *buf-- = '0' + num_sectors % 10; + *buf_size-- = '0' + num_sectors % 10; num_sectors /= 10; } - return len; + #endif + + memcpy(buf, spiflash_layout, spiflash_layout_len); + buf += spiflash_layout_len; + + memcpy(buf, spiflash2_layout, spiflash2_layout_len); + buf += spiflash2_layout_len; + + *buf++ = '\0'; + + return buf - buf_orig; } +#else + +#define FLASH_LAYOUT_STR INTERNAL_FLASH_LAYOUT MBOOT_SPIFLASH_LAYOUT MBOOT_SPIFLASH2_LAYOUT + #endif static bool flash_is_modifiable_addr_range(uint32_t addr, uint32_t len) { @@ -1188,7 +1232,7 @@ static uint8_t *pyb_usbdd_StrDescriptor(USBD_HandleTypeDef *pdev, uint8_t idx, u USBD_GetString((uint8_t *)FLASH_LAYOUT_STR, str_desc, length); #else { - char buf[FLASH_LAYOUT_STR_ALLOC]; + uint8_t buf[FLASH_LAYOUT_STR_ALLOC]; build_flash_layout_str(buf); USBD_GetString((uint8_t *)buf, str_desc, length); } |