]> git.sur5r.net Git - openocd/blob - contrib/loaders/flash/fm4/erase.S
flash: New Spansion FM4 flash driver
[openocd] / contrib / loaders / flash / fm4 / erase.S
1 /*
2  * Spansion FM4 flash sector erase algorithm
3  *
4  * Copyright (c) 2015 Andreas Färber
5  *
6  * Based on S6E2CC_MN709-00007 for S6E2CC/C5/C4/C3/C2/C1 series
7  */
8
9 #include "fm4.h"
10
11 #define RESULT_OKAY     0
12 #define RESULT_NONE     1
13 #define RESULT_TIMEOUT  2
14
15         .macro busy_wait, res, addr, tmp1, tmp2, tmp3
16
17         ldrb    \tmp1, [\addr] /* ignore */
18 1001:
19         ldrb    \tmp1, [\addr]
20         ldrb    \tmp2, [\addr]
21
22         and     \tmp3, \tmp1, #FLASH_TOGG
23         and     \tmp2, \tmp2, #FLASH_TOGG
24         cmp     \tmp3, \tmp2
25         beq     1010f
26
27         and     \tmp2, \tmp1, #FLASH_TLOV
28         cmp     \tmp2, #0
29         beq     1001b
30
31         ldrb    \tmp1, [\addr]
32         ldrb    \tmp2, [\addr]
33
34         and     \tmp3, \tmp1, #FLASH_TOGG
35         and     \tmp2, \tmp2, #FLASH_TOGG
36         cmp     \tmp3, \tmp2
37         beq     1010f
38
39         mov     \res, #RESULT_TIMEOUT
40         bkpt    #0
41 1010:
42         mov     \res, #RESULT_OKAY
43
44         .endm
45
46
47         .macro erase, cmdseqaddr1, cmdseqaddr2, sa, res, tmp1, tmp2, tmp3
48
49         mov     \res, #RESULT_NONE
50
51         mov     \tmp1, #0xAA
52         strh    \tmp1, [\cmdseqaddr1]
53         mov     \tmp2, #0x55
54         strh    \tmp2, [\cmdseqaddr2]
55         mov     \tmp3, #0x80
56         strh    \tmp3, [\cmdseqaddr1]
57         strh    \tmp1, [\cmdseqaddr1]
58         strh    \tmp2, [\cmdseqaddr2]
59         mov     \tmp3, #0x30
60         strh    \tmp3, [\sa]
61
62         busy_wait \res, \sa, \tmp1, \tmp2, \tmp3
63
64         .endm
65
66
67         /* r0 = 0xAA8
68          * r1 = 0x554
69          * r2 = SA
70          * r3 = result
71          */
72 erase:
73         erase r0, r1, r2, r3, r4, r5, r6
74
75         bkpt    #0
76
77 data: