From: Spencer Oliver Date: Mon, 30 Apr 2012 13:29:18 +0000 (+0100) Subject: flash: use correct stm32f0 flash size register X-Git-Tag: v0.6.0-rc1~106 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=47cf0aabc8a3a7579bc72c8d3c122ab9c0e6a5c4 flash: use correct stm32f0 flash size register The stm32f0 parts use a different address then the rest of the family. Add a function that returns the correct FLASH_SIZE reg depending on variant. Change-Id: Idb41580f7162f395b347cec034d6b745847326b7 Signed-off-by: Spencer Oliver Reviewed-on: http://openocd.zylin.com/601 Tested-by: jenkins Reviewed-by: Freddie Chopin --- diff --git a/src/flash/nor/stm32f1x.c b/src/flash/nor/stm32f1x.c index 9a3d459b59..91f7f1ffeb 100644 --- a/src/flash/nor/stm32f1x.c +++ b/src/flash/nor/stm32f1x.c @@ -843,9 +843,35 @@ static int stm32x_get_device_id(struct flash_bank *bank, uint32_t *device_id) return retval; } -static int stm32x_probe(struct flash_bank *bank) +static int stm32x_get_flash_size(struct flash_bank *bank, uint16_t *flash_size_in_kb) { struct target *target = bank->target; + uint32_t cpuid, flash_size_reg; + + int retval = target_read_u32(target, 0xE000ED00, &cpuid); + if (retval != ERROR_OK) + return retval; + + if (((cpuid >> 4) & 0xFFF) == 0xC20) { + /* 0xC20 is M0 devices */ + flash_size_reg = 0x1FFFF7CC; + } else if (((cpuid >> 4) & 0xFFF) == 0xC23) { + /* 0xC23 is M3 devices */ + flash_size_reg = 0x1FFFF7E0; + } else { + LOG_ERROR("Cannot identify target as a stm32x"); + return ERROR_FAIL; + } + + retval = target_read_u16(target, flash_size_reg, flash_size_in_kb); + if (retval != ERROR_OK) + return retval; + + return retval; +} + +static int stm32x_probe(struct flash_bank *bank) +{ struct stm32x_flash_bank *stm32x_info = bank->driver_priv; int i; uint16_t flash_size_in_kb; @@ -853,7 +879,6 @@ static int stm32x_probe(struct flash_bank *bank) int page_size; uint32_t base_address = 0x08000000; - stm32x_info->probed = 0; stm32x_info->register_base = FLASH_REG_BASE_B0; @@ -865,7 +890,7 @@ static int stm32x_probe(struct flash_bank *bank) LOG_INFO("device id = 0x%08" PRIx32 "", device_id); /* get flash size from target. */ - retval = target_read_u16(target, 0x1FFFF7E0, &flash_size_in_kb); + retval = stm32x_get_flash_size(bank, &flash_size_in_kb); if (retval != ERROR_OK) { LOG_WARNING("failed reading flash size, default to max target family"); /* failed reading flash size, default to max target family */