flash/nor: Add support for TI CC3220SF internal flash
[openocd.git] / contrib / loaders / flash / cc3220sf / cc3220sf.s
1 /***************************************************************************
2 * Copyright (C) 2017 by Texas Instruments, Inc. *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
16 ***************************************************************************/
17
18 /* Params:
19 * r0 = buffer start address (in)
20 * r1 = flash destination address (in)
21 * r2 = number of words to write (in/out)
22 */
23
24 .text
25 .cpu cortex-m4
26 .code 16
27 .thumb
28 .syntax unified
29
30 .align 2
31
32 /* r3 = scratchpad
33 * r4 = buffer word counter
34 * r10 = flash programming key
35 * r11 = base FWB address
36 * r12 = base flash regs address
37 */
38
39 start:
40 ldr r10, =0xa4420001 /* flash programming key */
41 ldr r11, =0x400fd100 /* base of FWB */
42 ldr r12, =0x400fd000 /* base of flash regs */
43 and r3, r1, #0x7f /* is the dest address 32 word aligned? */
44 cmp r3, #0
45 bne program_word /* if not aligned do one word at a time */
46
47 /* program using the write buffers */
48 program_buffer:
49 mov r4, #0 /* start the buffer word counter at 0 */
50 str r1, [r12] /* store the dest addr in FMA */
51 fill_buffer:
52 ldr r3, [r0] /* get the word to write to FWB */
53 str r3, [r11] /* store the word in the FWB */
54 add r11, r11, #4 /* increment the FWB pointer */
55 add r0, r0, #4 /* increment the source pointer */
56 sub r2, r2, #1 /* decrement the total word counter */
57 add r4, r4, #1 /* increment the buffer word counter */
58 add r1, r1, #4 /* increment the dest pointer */
59 cmp r2, #0 /* is the total word counter now 0? */
60 beq buffer_ready /* go to end if total word counter is 0 */
61 cmp r4, #32 /* is the buffer word counter now 32? */
62 bne fill_buffer /* go to continue to fill buffer */
63 buffer_ready:
64 str r10, [r12, #0x20] /* store the key and write bit to FMC2 */
65 wait_buffer_done:
66 ldr r3, [r12, #0x20] /* read FMC2 */
67 tst r3, #1 /* see if the write bit is cleared */
68 bne wait_buffer_done /* go to read FMC2 if bit not cleared */
69 cmp r2, #0 /* is the total word counter now 0? */
70 bne start /* go if there is more to program */
71 b exit
72
73 /* program just one word */
74 program_word:
75 str r1, [r12] /* store the dest addr in FMA */
76 ldr r3, [r0] /* get the word to write to FMD */
77 str r3, [r12, #0x4] /* store the word in FMD */
78 str r10, [r12, #0x8] /* store the key and write bit to FMC */
79 wait_word_done:
80 ldr r3, [r12, #0x8] /* read FMC */
81 tst r3, #1 /* see if the write bit is cleared */
82 bne wait_word_done /* go to read FMC if bit not cleared */
83 sub r2, r2, #1 /* decrement the total word counter */
84 add r0, r0, #4 /* increment the source pointer */
85 add r1, r1, #4 /* increment the dest pointer */
86 cmp r2, #0 /* is the total word counter now 0 */
87 bne start /* go if there is more to program */
88
89 /* end */
90 exit:
91 bkpt #0
92 bkpt #1
93 b exit

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)