[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openocd-development
Subject:    [OpenOCD-devel] [PATCH]: 430cc06 flash: use correct stm32f0 flash size register
From:       gerrit () openocd ! zylin ! com
Date:       2012-04-30 13:36:52
Message-ID: 20120430133652.9F65E24372 () openocd ! zylin ! com
[Download RAW message or body]

This is an automated email from Gerrit.

Spencer Oliver (spen@spen-soft.co.uk) just uploaded a new patch set to Gerrit, which \
you can find at http://openocd.zylin.com/601

-- gerrit

commit 430cc0685d5112abb36b358edf96c97b12cb5694
Author: Spencer Oliver <spen@spen-soft.co.uk>
Date:   Mon Apr 30 14:29:18 2012 +0100

    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 <spen@spen-soft.co.uk>

diff --git a/src/flash/nor/stm32f1x.c b/src/flash/nor/stm32f1x.c
index 9a3d459..91f7f1f 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 */

-- 

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
OpenOCD-devel mailing list
OpenOCD-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openocd-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic