contrib: add GPL license tag on files that miss it
[fw/openocd] / contrib / loaders / flash / fm4 / write.S
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2
3 /*
4  * Spansion FM4 flash write algorithm
5  *
6  * Copyright (c) 2015 Andreas Färber
7  *
8  * Based on S6E2CC_MN709-00007 for S6E2CC/C5/C4/C3/C2/C1 series
9  */
10
11 #include "fm4.h"
12
13 #define RESULT_OKAY     0
14 #define RESULT_NONE     1
15 #define RESULT_TIMEOUT  2
16
17         .macro busy_wait, res, addr, data, tmp1, tmp2, tmp3
18
19         ldrb    \tmp1, [\addr] /* ignore */
20         and     \tmp2, \data, #FLASH_DPOL
21 1001:
22         ldrb    \tmp1, [\addr]
23         and     \tmp3, \tmp1, #FLASH_DPOL
24         cmp     \tmp3, \tmp2
25         beq     1010f
26
27         and     \tmp3, \tmp1, #FLASH_TLOV
28         cmp     \tmp3, #0
29         beq     1001b
30
31         ldrb    \tmp1, [\addr]
32         and     \tmp3, \tmp1, #FLASH_DPOL
33         cmp     \tmp3, \tmp2
34         beq     1010f
35
36         mov     \res, #RESULT_TIMEOUT
37         bkpt    #0
38 1010:
39         .endm
40
41
42         .macro write_one, res, cmdseqaddr1, cmdseqaddr2, pa, pd, tmp1, tmp2, tmp3
43
44         mov     \tmp1, #0xAA
45         strh    \tmp1, [\cmdseqaddr1]
46         mov     \tmp1, #0x55
47         strh    \tmp1, [\cmdseqaddr2]
48         mov     \tmp1, #0xA0
49         strh    \tmp1, [\cmdseqaddr1]
50         strh    \pd, [\pa]
51
52         busy_wait \res, \pa, \pd, \tmp1, \tmp2, \tmp3
53
54         .endm
55
56
57         .macro write, cmdseqaddr1, cmdseqaddr2, dest, src, cnt, res, tmp1, tmp2, tmp3, tmp4
58
59         mov     \res, #RESULT_NONE
60 2001:
61         cbz     \cnt, 2010f
62
63         ldrh    \tmp1, [\src]
64         write_one \res, \cmdseqaddr1, \cmdseqaddr2, \dest, \tmp1, \tmp2, \tmp3, \tmp4
65
66         sub     \cnt, \cnt, #1
67         add     \dest, \dest, #2
68         add     \src, \src, #2
69         b       2001b
70 2010:
71         mov     \res, #RESULT_OKAY
72         .endm
73
74
75         /* r0 = 0xAA8
76          * r1 = 0x554
77          * r2 = dest
78          * r3 = src
79          * r4 = cnt
80          * r5 = result
81          */
82 write:
83         write r0, r1, r2, r3, r4, r5, r6, r7, r8, r9
84
85         bkpt    #0
86
87 data: