swd: Add support for connect_assert_srst for SWD.
[openocd.git] / contrib / loaders / flash / sim3x.s
blobcdb3ef681108be52dd96bcb34cd2fd1c1dae2acf
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 ***************************************************************************/
16 #define INITIAL_UNLOCK 0x5A
17 #define MULTIPLE_UNLOCK 0xF2
19 #define FLASHCTRL_KEY 0x4002E0C0
20 #define FLASHCTRL_CONFIG 0x4002E000
21 #define FLASHCTRL_WRADDR 0x4002E0A0
22 #define FLASHCTRL_WRDATA 0x4002E0B0
23 #define BUSYF 0x00100000
26 /* Write the initial unlock value to KEY (0xA5) */
27 movs r6, #INITIAL_UNLOCK
28 str r6, [r0, #FLASHCTRL_KEY]
30 /* Write the multiple unlock value to KEY (0xF2) */
31 movs r6, #MULTIPLE_UNLOCK
32 str r6, [r0, #FLASHCTRL_KEY]
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
42 /* wait for BUSYF flag */
43 wait_busy1:
44 ldr r6, [r0, #FLASHCTRL_CONFIG]
45 tst r6, #BUSYF
46 bne wait_busy1
48 /* Write the destination address to WRADDR */
49 str r4, [r0, #FLASHCTRL_WRADDR]
51 /* Write the data half-word to WRDATA in right-justified format */
52 ldrh r6, [r5]
53 str r6, [r0, #FLASHCTRL_WRDATA]
55 adds r5, #2
56 adds r4, #2
58 /* wrap rp at end of buffer */
59 cmp r5, r3
60 bcc no_wrap
61 mov r5, r2
62 adds r5, #8
64 no_wrap:
65 str r5, [r2, #4]
66 subs r1, r1, #1
67 cmp r1, #0
68 beq exit
69 b wait_fifo
71 exit:
72 movs r6, #MULTIPLE_LOCK
73 str r6, [r0, #FLASHCTRL_KEY]
75 /* wait for BUSYF flag */
76 wait_busy2:
77 ldr r6, [r0, #FLASHCTRL_CONFIG]
78 tst r6, #BUSYF
79 bne wait_busy2
81 bkpt #0