stm32l4x.c: Correct waiting for data. 40/3140/2
authorUwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
Mon, 30 Nov 2015 11:21:12 +0000 (12:21 +0100)
committerFreddie Chopin <freddie.chopin@gmail.com>
Wed, 4 May 2016 21:55:22 +0000 (22:55 +0100)
Old code waited only for 7 bytes and didn't handle buffer wrap-around, but
was functional despite.

Change-Id: Iceaf7be1e51368b2ec0a8722cc9ac16d12f9aa63
Signed-off-by: Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
Reviewed-on: http://openocd.zylin.com/3140
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
contrib/loaders/flash/stm32l4x.S
src/flash/nor/stm32l4x.c

index 045f9d0..799dec5 100644 (file)
@@ -65,7 +65,10 @@ wait_fifo:
        beq     exit
        ldr     r5, [r0, #4]    /* read rp */
        subs    r6, r8, r5      /* number of bytes available for read in r6*/
-       cmp     r6, #7          /* wait until 8 bytes are available */
+       itt     mi              /* if wrapped around*/
+       addmi   r6, r1          /* add size of buffer */
+       submi   r6, r0
+       cmp     r6, #8          /* wait until 8 bytes are available */
        bcc     wait_fifo
 
        ldr     r6, STM32_PROG
index 42e90bc..32d5a0e 100644 (file)
@@ -463,13 +463,14 @@ static int stm32l4_write_block(struct flash_bank *bank, const uint8_t *buffer,
         */
 
        static const uint8_t stm32l4_flash_write_code[] = {
-               0xd0, 0xf8, 0x00, 0x80, 0xb8, 0xf1, 0x00, 0x0f, 0x1e, 0xd0, 0x45, 0x68,
-               0xb8, 0xeb, 0x05, 0x06, 0x07, 0x2e, 0xf5, 0xd3, 0xdf, 0xf8, 0x34, 0x60,
-               0x66, 0x61, 0xf5, 0xe8, 0x02, 0x67, 0xe2, 0xe8, 0x02, 0x67, 0xbf, 0xf3,
-               0x4f, 0x8f, 0x26, 0x69, 0x16, 0xf4, 0x80, 0x3f, 0xfb, 0xd1, 0x16, 0xf0,
-               0xfa, 0x0f, 0x07, 0xd1, 0x8d, 0x42, 0x28, 0xbf, 0x00, 0xf1, 0x08, 0x05,
-               0x45, 0x60, 0x01, 0x3b, 0x13, 0xb1, 0xdd, 0xe7, 0x00, 0x21, 0x41, 0x60,
-               0x30, 0x46, 0x00, 0xbe, 0x01, 0x00, 0x00, 0x00
+               0xd0, 0xf8, 0x00, 0x80, 0xb8, 0xf1, 0x00, 0x0f, 0x21, 0xd0, 0x45, 0x68,
+               0xb8, 0xeb, 0x05, 0x06, 0x44, 0xbf, 0x76, 0x18, 0x36, 0x1a, 0x08, 0x2e,
+               0xf2, 0xd3, 0xdf, 0xf8, 0x36, 0x60, 0x66, 0x61, 0xf5, 0xe8, 0x02, 0x67,
+               0xe2, 0xe8, 0x02, 0x67, 0xbf, 0xf3, 0x4f, 0x8f, 0x26, 0x69, 0x16, 0xf4,
+               0x80, 0x3f, 0xfb, 0xd1, 0x16, 0xf0, 0xfa, 0x0f, 0x07, 0xd1, 0x8d, 0x42,
+               0x28, 0xbf, 0x00, 0xf1, 0x08, 0x05, 0x45, 0x60, 0x01, 0x3b, 0x13, 0xb1,
+               0xda, 0xe7, 0x00, 0x21, 0x41, 0x60, 0x30, 0x46, 0x00, 0xbe, 0x01, 0x00,
+               0x00, 0x00
        };
 
        if (target_alloc_working_area(target, sizeof(stm32l4_flash_write_code),