kopia lustrzana https://github.com/micropython/micropython
stm32/mboot: Generate FLASH_LAYOUT_STR at runtime on H5 MCUs.
The size of the flash varies among MCU variants. Instead of requiring a build-time variable to configure this, compute it at runtime using the special device information word accessible through the FLASH_SIZE macro. This feature is currently only implemented for H5 MCUs, but can be extended to others. Signed-off-by: Damien George <damien@micropython.org>pull/13662/head
rodzic
3db29103a4
commit
802a88c3b1
|
@ -435,7 +435,7 @@ void mp_hal_pin_config_speed(uint32_t port_pin, uint32_t speed) {
|
||||||
#elif defined(STM32G0)
|
#elif defined(STM32G0)
|
||||||
#define FLASH_LAYOUT_STR "@Internal Flash /0x08000000/256*02Kg" MBOOT_SPIFLASH_LAYOUT MBOOT_SPIFLASH2_LAYOUT
|
#define FLASH_LAYOUT_STR "@Internal Flash /0x08000000/256*02Kg" MBOOT_SPIFLASH_LAYOUT MBOOT_SPIFLASH2_LAYOUT
|
||||||
#elif defined(STM32H5)
|
#elif defined(STM32H5)
|
||||||
#define FLASH_LAYOUT_STR "@Internal Flash /0x08000000/256*08Kg" MBOOT_SPIFLASH_LAYOUT MBOOT_SPIFLASH2_LAYOUT
|
#define FLASH_LAYOUT_TEMPLATE "@Internal Flash /0x08000000/???*08Kg" MBOOT_SPIFLASH_LAYOUT MBOOT_SPIFLASH2_LAYOUT
|
||||||
#elif defined(STM32H743xx)
|
#elif defined(STM32H743xx)
|
||||||
#define FLASH_LAYOUT_STR "@Internal Flash /0x08000000/16*128Kg" MBOOT_SPIFLASH_LAYOUT MBOOT_SPIFLASH2_LAYOUT
|
#define FLASH_LAYOUT_STR "@Internal Flash /0x08000000/16*128Kg" MBOOT_SPIFLASH_LAYOUT MBOOT_SPIFLASH2_LAYOUT
|
||||||
#elif defined(STM32H750xx)
|
#elif defined(STM32H750xx)
|
||||||
|
@ -444,6 +444,25 @@ void mp_hal_pin_config_speed(uint32_t port_pin, uint32_t speed) {
|
||||||
#define FLASH_LAYOUT_STR "@Internal Flash /0x08000000/256*04Kg" MBOOT_SPIFLASH_LAYOUT MBOOT_SPIFLASH2_LAYOUT
|
#define FLASH_LAYOUT_STR "@Internal Flash /0x08000000/256*04Kg" MBOOT_SPIFLASH_LAYOUT MBOOT_SPIFLASH2_LAYOUT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(FLASH_LAYOUT_STR)
|
||||||
|
|
||||||
|
#define FLASH_LAYOUT_STR_ALLOC (sizeof(FLASH_LAYOUT_TEMPLATE))
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
unsigned int num_sectors = FLASH_SIZE / FLASH_SECTOR_SIZE;
|
||||||
|
buf += 31; // location of "???" in FLASH_LAYOUT_TEMPLATE
|
||||||
|
for (unsigned int i = 0; i < 3; ++i) {
|
||||||
|
*buf-- = '0' + num_sectors % 10;
|
||||||
|
num_sectors /= 10;
|
||||||
|
}
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool flash_is_modifiable_addr_range(uint32_t addr, uint32_t len) {
|
static bool flash_is_modifiable_addr_range(uint32_t addr, uint32_t len) {
|
||||||
return addr + len < (uint32_t)&_mboot_protected_flash_start
|
return addr + len < (uint32_t)&_mboot_protected_flash_start
|
||||||
|| addr >= (uint32_t)&_mboot_protected_flash_end_exclusive;
|
|| addr >= (uint32_t)&_mboot_protected_flash_end_exclusive;
|
||||||
|
@ -756,8 +775,12 @@ void i2c_slave_process_rx_end(i2c_slave_t *i2c) {
|
||||||
} else if (buf[0] == I2C_CMD_RESET && len == 0) {
|
} else if (buf[0] == I2C_CMD_RESET && len == 0) {
|
||||||
dfu_context.leave_dfu = true;
|
dfu_context.leave_dfu = true;
|
||||||
} else if (buf[0] == I2C_CMD_GETLAYOUT && len == 0) {
|
} else if (buf[0] == I2C_CMD_GETLAYOUT && len == 0) {
|
||||||
|
#if defined(FLASH_LAYOUT_STR)
|
||||||
len = strlen(FLASH_LAYOUT_STR);
|
len = strlen(FLASH_LAYOUT_STR);
|
||||||
memcpy(buf, FLASH_LAYOUT_STR, len);
|
memcpy(buf, FLASH_LAYOUT_STR, len);
|
||||||
|
#else
|
||||||
|
len = build_flash_layout_str(buf);
|
||||||
|
#endif
|
||||||
} else if (buf[0] == I2C_CMD_MASSERASE && len == 0) {
|
} else if (buf[0] == I2C_CMD_MASSERASE && len == 0) {
|
||||||
len = do_mass_erase();
|
len = do_mass_erase();
|
||||||
} else if (buf[0] == I2C_CMD_PAGEERASE && len == 4) {
|
} else if (buf[0] == I2C_CMD_PAGEERASE && len == 4) {
|
||||||
|
@ -1161,7 +1184,15 @@ static uint8_t *pyb_usbdd_StrDescriptor(USBD_HandleTypeDef *pdev, uint8_t idx, u
|
||||||
}
|
}
|
||||||
|
|
||||||
case USBD_IDX_CONFIG_STR:
|
case USBD_IDX_CONFIG_STR:
|
||||||
|
#if defined(FLASH_LAYOUT_STR)
|
||||||
USBD_GetString((uint8_t *)FLASH_LAYOUT_STR, str_desc, length);
|
USBD_GetString((uint8_t *)FLASH_LAYOUT_STR, str_desc, length);
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
char buf[FLASH_LAYOUT_STR_ALLOC];
|
||||||
|
build_flash_layout_str(buf);
|
||||||
|
USBD_GetString((uint8_t *)buf, str_desc, length);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return str_desc;
|
return str_desc;
|
||||||
|
|
||||||
case MBOOT_ERROR_STR_OVERWRITE_BOOTLOADER_IDX:
|
case MBOOT_ERROR_STR_OVERWRITE_BOOTLOADER_IDX:
|
||||||
|
|
Ładowanie…
Reference in New Issue