stm32: enable flash bank size override

It has been seen on some stm32 targets that the flash size register that
is probed by the driver may contain an invalid size.

This change enables the user to override the probed value.

Change-Id: I09359e59a96f9133d3d939670957d32a830a944e
Signed-off-by: Spencer Oliver <spen@spen-soft.co.uk>
Reviewed-on: http://openocd.zylin.com/1132
Tested-by: jenkins
Reviewed-by: Johan Almquist <johan.almquist@assaabloy.com>
__archive__
Spencer Oliver 2013-02-05 16:41:30 +00:00
parent 87668aebf1
commit bd5df8520b
4 changed files with 52 additions and 0 deletions

View File

@ -5243,6 +5243,14 @@ the chip identification register, and autoconfigures itself.
flash bank $_FLASHNAME stm32f1x 0 0 0 0 $_TARGETNAME flash bank $_FLASHNAME stm32f1x 0 0 0 0 $_TARGETNAME
@end example @end example
Note that some devices have been found that have a flash size register that contains
an invalid value, to workaround this issue you can override the probed value used by
the flash driver.
@example
flash bank $_FLASHNAME stm32f1x 0 0x20000 0 0 $_TARGETNAME
@end example
If you have a target with dual flash banks then define the second bank If you have a target with dual flash banks then define the second bank
as per the following example. as per the following example.
@example @example
@ -5283,6 +5291,14 @@ include internal flash and use ARM Cortex-M3/M4 cores.
The driver automatically recognizes a number of these chips using The driver automatically recognizes a number of these chips using
the chip identification register, and autoconfigures itself. the chip identification register, and autoconfigures itself.
Note that some devices have been found that have a flash size register that contains
an invalid value, to workaround this issue you can override the probed value used by
the flash driver.
@example
flash bank $_FLASHNAME stm32f2x 0 0x20000 0 0 $_TARGETNAME
@end example
Some stm32f2x-specific commands are defined: Some stm32f2x-specific commands are defined:
@deffn Command {stm32f2x lock} num @deffn Command {stm32f2x lock} num
@ -5296,6 +5312,21 @@ The @var{num} parameter is a value shown by @command{flash banks}.
@end deffn @end deffn
@end deffn @end deffn
@deffn {Flash Driver} stm32lx
All members of the STM32L microcontroller families from ST Microelectronics
include internal flash and use ARM Cortex-M3 cores.
The driver automatically recognizes a number of these chips using
the chip identification register, and autoconfigures itself.
Note that some devices have been found that have a flash size register that contains
an invalid value, to workaround this issue you can override the probed value used by
the flash driver.
@example
flash bank $_FLASHNAME stm32lx 0 0x20000 0 0 $_TARGETNAME
@end example
@end deffn
@deffn {Flash Driver} str7x @deffn {Flash Driver} str7x
All members of the STR7 microcontroller family from ST Microelectronics All members of the STR7 microcontroller family from ST Microelectronics
include internal flash and use ARM7TDMI cores. include internal flash and use ARM7TDMI cores.

View File

@ -956,6 +956,13 @@ static int stm32x_probe(struct flash_bank *bank)
} }
} }
/* if the user sets the size manually then ignore the probed value
* this allows us to work around devices that have a invalid flash size register value */
if (bank->size) {
LOG_INFO("ignoring flash probed value, using configured bank size");
flash_size_in_kb = bank->size / 1024;
}
LOG_INFO("flash size = %dkbytes", flash_size_in_kb); LOG_INFO("flash size = %dkbytes", flash_size_in_kb);
/* did we assign flash size? */ /* did we assign flash size? */

View File

@ -791,6 +791,13 @@ static int stm32x_probe(struct flash_bank *bank)
flash_size_in_kb = max_flash_size_in_kb; flash_size_in_kb = max_flash_size_in_kb;
} }
/* if the user sets the size manually then ignore the probed value
* this allows us to work around devices that have a invalid flash size register value */
if (bank->size) {
LOG_INFO("ignoring flash probed value, using configured bank size");
flash_size_in_kb = bank->size / 1024;
}
LOG_INFO("flash size = %dkbytes", flash_size_in_kb); LOG_INFO("flash size = %dkbytes", flash_size_in_kb);
/* did we assign flash size? */ /* did we assign flash size? */

View File

@ -552,6 +552,13 @@ static int stm32lx_probe(struct flash_bank *bank)
flash_size_in_kb = max_flash_size_in_kb; flash_size_in_kb = max_flash_size_in_kb;
} }
/* if the user sets the size manually then ignore the probed value
* this allows us to work around devices that have a invalid flash size register value */
if (bank->size) {
LOG_INFO("ignoring flash probed value, using configured bank size");
flash_size_in_kb = bank->size / 1024;
}
/* STM32L - we have 32 sectors, 16 pages per sector -> 512 pages /* STM32L - we have 32 sectors, 16 pages per sector -> 512 pages
* 16 pages for a protection area */ * 16 pages for a protection area */