contrib: replace the GPLv2-or-later license tag
[fw/openocd] / contrib / loaders / flash / max32xxx / max32xxx.s
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2
3 /***************************************************************************
4  *   Copyright (C) 2016 by Maxim Integrated                                *
5  *   Kevin Gillespie <kevin.gillespie@maximintegrated.com                  *
6  ***************************************************************************/
7
8 .text
9 .syntax unified
10 .cpu cortex-m3
11 .thumb
12 .thumb_func
13
14 /*
15  * Params :
16  * r0 = workarea start
17  * r1 = workarea end
18  * r2 = target address
19  * r3 = count (32bit words)
20  * r4 = pFLASH_CTRL_BASE
21  *
22  * Clobbered:
23  * r5 = FLASHWRITECMD
24  * r7 - rp
25  * r8 - wp, tmp
26  */
27
28 write:
29
30 wait_fifo:
31 ldr     r8, [r0, #0]    /* read wp */
32 cmp     r8, #0                  /* abort if wp == 0 */
33 beq     exit
34 ldr     r7, [r0, #4]    /* read rp */
35 cmp     r7, r8                  /* wait until rp != wp */
36 beq     wait_fifo
37
38 mainloop:
39 str             r2, [r4, #0x00] /* FLSH_ADDR - write address */
40 add             r2, r2, #4              /* increment target address */
41 ldr             r8, [r7], #4
42 str             r8, [r4, #0x30] /* FLSH_DATA0 - write data */
43 ldr             r5, [r4, #0x08] /* FLSH_CN */
44 orr             r5, r5, #1
45 str             r5, [r4, #0x08] /* FLSH_CN - enable write */
46 busy:
47 ldr             r8, [r4, #0x08] /* FLSH_CN */
48 tst             r8, #1
49 bne             busy
50
51 cmp     r7, r1                  /* wrap rp at end of buffer */
52 it      cs
53 addcs   r7, r0, #8              /* skip loader args */
54 str     r7, [r0, #4]    /* store rp */
55 subs    r3, r3, #1              /* decrement word count */
56 cbz     r3, exit                /* loop if not done */
57 b               wait_fifo
58 exit:
59 bkpt