cdb3ef681108be52dd96bcb34cd2fd1c1dae2acf
[fw/openocd] / contrib / loaders / flash / sim3x.s
1 /***************************************************************************
2  *   Copyright (C) 2014 by Ladislav Bábel                                  *
3  *   ladababel@seznam.cz                                                   *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) any later version.                                   *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  ***************************************************************************/
15
16 #define INITIAL_UNLOCK    0x5A
17 #define MULTIPLE_UNLOCK   0xF2
18
19 #define FLASHCTRL_KEY     0x4002E0C0
20 #define FLASHCTRL_CONFIG  0x4002E000
21 #define FLASHCTRL_WRADDR  0x4002E0A0
22 #define FLASHCTRL_WRDATA  0x4002E0B0
23 #define BUSYF             0x00100000
24
25
26                 /* Write the initial unlock value to KEY (0xA5) */
27                 movs    r6, #INITIAL_UNLOCK
28                 str     r6, [r0, #FLASHCTRL_KEY]
29
30                 /* Write the multiple unlock value to KEY (0xF2) */
31                 movs    r6, #MULTIPLE_UNLOCK
32                 str     r6, [r0, #FLASHCTRL_KEY]
33
34 wait_fifo:
35                 ldr     r6, [r2, #0]
36                 cmp         r6, #0
37                 beq     exit
38                 ldr     r5, [r2, #4]
39                 cmp     r5, r6
40                 beq     wait_fifo
41
42                 /* wait for BUSYF flag */
43 wait_busy1:
44                 ldr     r6, [r0, #FLASHCTRL_CONFIG]
45                 tst     r6, #BUSYF
46                 bne     wait_busy1
47
48                 /* Write the destination address to WRADDR */
49                 str     r4, [r0, #FLASHCTRL_WRADDR]
50
51                 /* Write the data half-word to WRDATA in right-justified format */
52                 ldrh    r6, [r5]
53                 str     r6, [r0, #FLASHCTRL_WRDATA]
54
55                 adds    r5, #2
56                 adds    r4, #2
57
58                 /* wrap rp at end of buffer */
59                 cmp     r5, r3
60                 bcc     no_wrap
61                 mov     r5, r2
62                 adds    r5, #8
63
64 no_wrap:
65                 str     r5, [r2, #4]
66                 subs    r1, r1, #1
67                 cmp     r1, #0
68                 beq     exit
69                 b       wait_fifo
70
71 exit:
72                 movs    r6, #MULTIPLE_LOCK
73                 str     r6, [r0, #FLASHCTRL_KEY]
74
75                 /* wait for BUSYF flag */
76 wait_busy2:
77                 ldr     r6, [r0, #FLASHCTRL_CONFIG]
78                 tst     r6, #BUSYF
79                 bne     wait_busy2
80
81                 bkpt    #0