flash: use correct stm32f0 flash size register
authorSpencer Oliver <spen@spen-soft.co.uk>
Mon, 30 Apr 2012 13:29:18 +0000 (14:29 +0100)
committerSpencer Oliver <spen@spen-soft.co.uk>
Tue, 8 May 2012 14:06:43 +0000 (14:06 +0000)
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 <spen@spen-soft.co.uk>
Reviewed-on: http://openocd.zylin.com/601
Tested-by: jenkins
Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com>
src/flash/nor/stm32f1x.c

index 9a3d459b592dabf5c011c5477170d1e8f8356888..91f7f1ffeb586c76ad0d5390a0a17ee39999758f 100644 (file)
@@ -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 */