This is an automated email from Gerrit.

Tomas Vanek ([email protected]) just uploaded a new patch set to Gerrit, which you 
can find at http://openocd.zylin.com/4299

-- gerrit

commit 13289780018b50abe250de0210aee2f8ad146288
Author: Tomas Vanek <[email protected]>
Date:   Thu Nov 23 14:47:37 2017 +0100

    flash/nor/stm32f2x: fix erase on STM32F413/423
    
    Theese devices do not have a gap in sector numbering.
    The driver translates sectors numbers 12 13... to 16 17... as used on dual
    bank flash devices. Therefore erase of sector 12 and above fails with error
        'stm32x device protected'
    on F413/423.
    
    Drop sector number translation for devices without has_large_mem flag.
    
    Change-Id: I65531c0dfe02e2fd0f3d68f0615e0926e9901391
    Signed-off-by: Tomas Vanek <[email protected]>

diff --git a/src/flash/nor/stm32f2x.c b/src/flash/nor/stm32f2x.c
index 8127f13..ea03d6b 100644
--- a/src/flash/nor/stm32f2x.c
+++ b/src/flash/nor/stm32f2x.c
@@ -145,7 +145,7 @@
 #define FLASH_PSIZE_64 (3 << 8)
 /* The sector number encoding is not straight binary for dual bank flash.
  * Warning: evaluates the argument multiple times */
-#define FLASH_SNB(a)   ((((a) >= 12) ? 0x10 | ((a) - 12) : (a)) << 3)
+#define FLASH_SNB(a)   ((a) << 3)
 #define FLASH_LOCK     (1 << 31)
 
 /* FLASH_SR register bits */
@@ -489,6 +489,7 @@ static int stm32x_protect_check(struct flash_bank *bank)
 
 static int stm32x_erase(struct flash_bank *bank, int first, int last)
 {
+       struct stm32x_flash_bank *stm32x_info = bank->driver_priv;
        struct target *target = bank->target;
        int i;
 
@@ -516,8 +517,14 @@ static int stm32x_erase(struct flash_bank *bank, int 
first, int last)
         */
 
        for (i = first; i <= last; i++) {
+               int snb;
+               if (stm32x_info->has_large_mem && i >= 12)
+                       snb = i - 12 + 0x10;
+               else
+                       snb = i;
+
                retval = target_write_u32(target,
-                               stm32x_get_flash_reg(bank, STM32_FLASH_CR), 
FLASH_SER | FLASH_SNB(i) | FLASH_STRT);
+                               stm32x_get_flash_reg(bank, STM32_FLASH_CR), 
FLASH_SER | FLASH_SNB(snb) | FLASH_STRT);
                if (retval != ERROR_OK)
                        return retval;
 

-- 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to