contrib: replace the GPLv2-or-later license tag
[fw/openocd] / contrib / loaders / flash / sim3x.s
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2
3 /***************************************************************************
4  *   Copyright (C) 2014 by Ladislav Bábel                                  *
5  *   ladababel@seznam.cz                                                   *
6  ***************************************************************************/
7
8 #define INITIAL_UNLOCK    0x5A
9 #define MULTIPLE_UNLOCK   0xF2
10
11 #define FLASHCTRL_KEY     0x4002E0C0
12 #define FLASHCTRL_CONFIG  0x4002E000
13 #define FLASHCTRL_WRADDR  0x4002E0A0
14 #define FLASHCTRL_WRDATA  0x4002E0B0
15 #define BUSYF             0x00100000
16
17
18                 /* Write the initial unlock value to KEY (0xA5) */
19                 movs    r6, #INITIAL_UNLOCK
20                 str     r6, [r0, #FLASHCTRL_KEY]
21
22                 /* Write the multiple unlock value to KEY (0xF2) */
23                 movs    r6, #MULTIPLE_UNLOCK
24                 str     r6, [r0, #FLASHCTRL_KEY]
25
26 wait_fifo:
27                 ldr     r6, [r2, #0]
28                 cmp         r6, #0
29                 beq     exit
30                 ldr     r5, [r2, #4]
31                 cmp     r5, r6
32                 beq     wait_fifo
33
34                 /* wait for BUSYF flag */
35 wait_busy1:
36                 ldr     r6, [r0, #FLASHCTRL_CONFIG]
37                 tst     r6, #BUSYF
38                 bne     wait_busy1
39
40                 /* Write the destination address to WRADDR */
41                 str     r4, [r0, #FLASHCTRL_WRADDR]
42
43                 /* Write the data half-word to WRDATA in right-justified format */
44                 ldrh    r6, [r5]
45                 str     r6, [r0, #FLASHCTRL_WRDATA]
46
47                 adds    r5, #2
48                 adds    r4, #2
49
50                 /* wrap rp at end of buffer */
51                 cmp     r5, r3
52                 bcc     no_wrap
53                 mov     r5, r2
54                 adds    r5, #8
55
56 no_wrap:
57                 str     r5, [r2, #4]
58                 subs    r1, r1, #1
59                 cmp     r1, #0
60                 beq     exit
61                 b       wait_fifo
62
63 exit:
64                 movs    r6, #MULTIPLE_LOCK
65                 str     r6, [r0, #FLASHCTRL_KEY]
66
67                 /* wait for BUSYF flag */
68 wait_busy2:
69                 ldr     r6, [r0, #FLASHCTRL_CONFIG]
70                 tst     r6, #BUSYF
71                 bne     wait_busy2
72
73                 bkpt    #0