From: Alex J Lennon Date: Thu, 2 Aug 2018 16:59:24 +0000 (+0100) Subject: stm32l4x: Fix stm32l4x dual bank support X-Git-Tag: v0.11.0-rc1~947 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=20113201df25475889a3cd9ee22c0397e4fae530;hp=1b864d6e49d634a382ba1ed13f650898872627cf stm32l4x: Fix stm32l4x dual bank support The dual bank option was being incorrectly read and the bank b base incorrectly set. This is tested with 512kB dual bank configuration but needs checking with other configurations (e.g. 256kb). This fix should remove the need to use a mass_erase command prior to programming with OpenOCD Change-Id: I6e920f11b794c4c1fd34c0e44fb8fa01e7fe8f85 Signed-off-by: Alex J Lennon Signed-off-by: Tomas Vanek Reviewed-on: http://openocd.zylin.com/4641 Tested-by: jenkins Reviewed-by: Andreas Fritiofson Reviewed-by: Thomas Søhus --- diff --git a/src/flash/nor/stm32l4x.c b/src/flash/nor/stm32l4x.c index ad179216d8..ae0ae26ac1 100644 --- a/src/flash/nor/stm32l4x.c +++ b/src/flash/nor/stm32l4x.c @@ -93,7 +93,7 @@ /* STM32_FLASH_OBR bit definitions (reading) */ -#define OPT_DUALBANK 21 /* dual flash bank only */ +#define OPT_DUALBANK (1 << 21) /* dual flash bank only */ /* register unlock keys */ @@ -631,12 +631,6 @@ static int stm32l4_probe(struct flash_bank *bank) if (retval != ERROR_OK) return retval; - /* only devices with < 1024 kiB may be set to single bank dual banks */ - if ((flash_size_in_kb == 1024) || !(options & OPT_DUALBANK)) - stm32l4_info->bank2_start = 256; - else - stm32l4_info->bank2_start = flash_size_in_kb << 9; - /* did we assign flash size? */ assert((flash_size_in_kb != 0xffff) && flash_size_in_kb); @@ -646,6 +640,12 @@ static int stm32l4_probe(struct flash_bank *bank) /* check that calculation result makes sense */ assert(num_pages > 0); + /* only devices with < 1024 kiB may be set to single bank dual banks */ + if ((flash_size_in_kb == 1024) || !(options & OPT_DUALBANK)) + stm32l4_info->bank2_start = 256; + else + stm32l4_info->bank2_start = num_pages / 2; + if (bank->sectors) { free(bank->sectors); bank->sectors = NULL;