contrib: replace the GPLv2-or-later license tag
[fw/openocd] / contrib / loaders / flash / stellaris.s
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2
3 /***************************************************************************
4  *   Copyright (C) 2006 by Magnus Lundin                                   *
5  *   lundin@mlu.mine.nu                                                    *
6  *                                                                         *
7  *   Copyright (C) 2008 by Spencer Oliver                                  *
8  *   spen@spen-soft.co.uk                                                  *
9  ***************************************************************************/
10
11         .text
12         .syntax unified
13         .cpu cortex-m3
14         .thumb
15         .thumb_func
16
17 /*
18  * Params :
19  * r0 = workarea start
20  * r1 = workarea end
21  * r2 = target address
22  * r3 = count (32bit words)
23  *
24  * Clobbered:
25  * r4 = pFLASH_CTRL_BASE
26  * r5 = FLASHWRITECMD
27  * r7 - rp
28  * r8 - wp, tmp
29  */
30
31 write:
32         ldr     r4, pFLASH_CTRL_BASE
33         ldr     r5, FLASHWRITECMD
34
35 wait_fifo:
36         ldr     r8, [r0, #0]    /* read wp */
37         cmp     r8, #0                  /* abort if wp == 0 */
38         beq     exit
39         ldr     r7, [r0, #4]    /* read rp */
40         cmp     r7, r8                  /* wait until rp != wp */
41         beq     wait_fifo
42
43 mainloop:
44         str             r2, [r4, #0]    /* FMA - write address */
45         add             r2, r2, #4              /* increment target address */
46         ldr             r8, [r7], #4
47         str             r8, [r4, #4]    /* FMD - write data */
48         str             r5, [r4, #8]    /* FMC - enable write */
49 busy:
50         ldr             r8, [r4, #8]
51         tst             r8, #1
52         bne             busy
53
54         cmp     r7, r1                  /* wrap rp at end of buffer */
55         it      cs
56         addcs   r7, r0, #8              /* skip loader args */
57         str     r7, [r0, #4]    /* store rp */
58         subs    r3, r3, #1              /* decrement word count */
59         cbz     r3, exit                /* loop if not done */
60         b               wait_fifo
61 exit:
62         bkpt    #0
63
64 pFLASH_CTRL_BASE: .word 0x400FD000
65 FLASHWRITECMD: .word 0xA4420001