From c28b05efd324a6de1ff56238c2701e2ed97f643f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20S=C3=A1nchez=20Pascual?= Date: Sat, 8 Oct 2022 17:19:28 +0200 Subject: [PATCH] arch: stm32h7: Add support for dual bank flash memory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Andrés Sánchez Pascual --- arch/arm/src/stm32h7/stm32_flash.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/arch/arm/src/stm32h7/stm32_flash.c b/arch/arm/src/stm32h7/stm32_flash.c index b91d91a0716..c38d253c1a8 100644 --- a/arch/arm/src/stm32h7/stm32_flash.c +++ b/arch/arm/src/stm32h7/stm32_flash.c @@ -137,6 +137,7 @@ # define STM32_FLASH_NBLOCKS 16 # define STM32_FLASH_SIZE _K(16 * 128) +# define STM32_DUAL_BANK 1 #endif @@ -182,7 +183,7 @@ static struct stm32h7_flash_priv_s stm32h7_flash_bank1_priv = .stblock = 0, .stpage = 0, }; -#if STM32_FLASH_NBLOCKS > 1 +#if STM32_DUAL_BANK static struct stm32h7_flash_priv_s stm32h7_flash_bank2_priv = { .sem = SEM_INITIALIZER(1), @@ -330,15 +331,24 @@ static inline uint32_t stm32h7_flash_size( static inline struct stm32h7_flash_priv_s * stm32h7_flash_bank(size_t address) { - struct stm32h7_flash_priv_s *priv = &stm32h7_flash_bank1_priv; - if (address < priv->base || address >= - priv->base + stm32h7_flash_size(priv)) + struct stm32h7_flash_priv_s *priv = NULL; + + uint32_t bank_size; +#ifdef STM32_DUAL_BANK + bank_size = stm32h7_flash_size(priv) / 2; +#else + bank_size = stm32h7_flash_size(priv); +#endif + + if (address >= stm32h7_flash_bank1_priv.base && + address < stm32h7_flash_bank1_priv.base + bank_size) { - return NULL; + priv = &stm32h7_flash_bank1_priv; } -#if STM32_FLASH_NBLOCKS > 1 - if (address >= stm32h7_flash_bank2_priv.base) +#ifdef STM32_DUAL_BANK + else if (address >= stm32h7_flash_bank2_priv.base && + address < stm32h7_flash_bank2_priv.base + bank_size) { priv = &stm32h7_flash_bank2_priv; } @@ -363,7 +373,7 @@ static int stm32h7_israngeerased(size_t startaddress, size_t size) size_t bwritten = 0; if (!stm32h7_flash_bank(startaddress) || - !stm32h7_flash_bank(startaddress + size)) + !stm32h7_flash_bank(startaddress + size - 1)) { return -EIO; } @@ -380,7 +390,7 @@ static int stm32h7_israngeerased(size_t startaddress, size_t size) count += 4; } - baddr = (uint8_t *)addr; + baddr = (uint8_t *)startaddress; while (count < size) { if (getreg8(baddr) != FLASH_ERASEDVALUE) @@ -388,6 +398,7 @@ static int stm32h7_israngeerased(size_t startaddress, size_t size) bwritten++; } + baddr++; count++; }