Fix flash writing on stm32l0 36/4036/2
authorArmin van der Togt <armin@otheruse.nl>
Thu, 2 Mar 2017 16:31:14 +0000 (17:31 +0100)
committerFreddie Chopin <freddie.chopin@gmail.com>
Mon, 24 Apr 2017 06:03:59 +0000 (07:03 +0100)
Fix "couldn't use loader, falling back to page memory writes" error on
stm32l0 which was caused by the use of cortex-m3 instructions in the
flash loader code. The loader is rewritten using cortex-m0 compatible
instructions

Signed-off-by: Armin van der Togt <armin@otheruse.nl>
Change-Id: If23027b8e09f74e45129e1f8452a04bb994c424e
Reviewed-on: http://openocd.zylin.com/4036
Tested-by: jenkins
Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com>
contrib/loaders/flash/stm32lx.S
src/flash/nor/stm32lx.c

index 88deed32e9373cd6e33c6a20dd3338e0703fa6f1..8f9fd0b2b21d778ed98e098aa0beb6a6a9f696e8 100644 (file)
@@ -8,6 +8,9 @@
  *   Copyright (C) 2011 Clement Burin des Roziers                          *
  *   clement.burin-des-roziers@hikob.com                                   *
  *                                                                         *
+ *   Copyright (C) 2017 Armin van der Togt                                 *
+ *   armin@otheruse.nl                                                     *
+ *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
  *   the Free Software Foundation; either version 2 of the License, or     *
@@ -28,7 +31,7 @@
 // Build : arm-eabi-gcc -c stm32lx.S
        .text
        .syntax unified
-       .cpu cortex-m3
+       .cpu cortex-m0
        .thumb
        .thumb_func
        .global write
        r2 - count
 */
 
-       // Set 0 to r3
-       movs    r3, #0
+       // r2 = source + count * 4
+       lsls    r2, r2, #2
+       adds    r2, r1, r2
        // Go to compare
-       b.n test_done
-
+       b       test_done
 write_word:
-       // Load one word from address in r0, increment by 4
-       ldr.w   ip, [r1], #4
-       // Store the word to address in r1, increment by 4
-       str.w   ip, [r0], #4
-       // Increment r3
-       adds    r3, #1
-
+       // load word from address in r1 and increase r1 by 4
+       ldmia r1!, {r3}
+       // store word to address in r0 and increase r0 by 4
+       stmia r0!, {r3}
 test_done:
-       // Compare r3 and r2
-       cmp     r3, r2
-       // Loop if not zero
-       bcc.n   write_word
+       // compare r1 and r2
+       cmp     r1, r2
+       // loop if not equal
+       bne     write_word
 
        // Set breakpoint to exit
        bkpt    #0x00
index 0b392334fb2149c16407393c8aae0340d3d867ae..63dc9617f6ce76e91299810673e8d01125a91304 100644 (file)
@@ -450,19 +450,7 @@ static int stm32lx_write_half_pages(struct flash_bank *bank, const uint8_t *buff
        /* see contib/loaders/flash/stm32lx.S for src */
 
        static const uint8_t stm32lx_flash_write_code[] = {
-               /* write_word: */
-               0x00, 0x23,             /* movs r3, #0 */
-               0x04, 0xe0,             /* b test_done */
-
-               /* write_word: */
-               0x51, 0xf8, 0x04, 0xcb, /* ldr ip, [r1], #4 */
-               0x40, 0xf8, 0x04, 0xcb, /* str ip, [r0], #4 */
-               0x01, 0x33,             /* adds r3, #1 */
-
-               /* test_done: */
-               0x93, 0x42,             /* cmp r3, r2 */
-               0xf8, 0xd3,             /* bcc write_word */
-               0x00, 0xbe,             /* bkpt 0 */
+                       0x92, 0x00, 0x8A, 0x18, 0x01, 0xE0, 0x08, 0xC9, 0x08, 0xC0, 0x91, 0x42, 0xFB, 0xD1, 0x00, 0xBE
        };
 
        /* Make sure we're performing a half-page aligned write. */
@@ -588,7 +576,7 @@ static int stm32lx_write_half_pages(struct flash_bank *bank, const uint8_t *buff
                 * is reduced by 50% using this slower method.
                 */
 
-               LOG_WARNING("couldn't use loader, falling back to page memory writes");
+               LOG_WARNING("Couldn't use loader, falling back to page memory writes");
 
                while (count > 0) {
                        uint32_t this_count;

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)