640f6ca960a822a634f0667013cc6cd8e457dc08
[fw/openocd] / contrib / loaders / flash / xmc1xxx / write.S
1 /*
2  * Infineon XMC1000 flash write
3  *
4  * Copyright (c) 2016 Andreas Färber
5  *
6  * Based on XMC1100 AA-Step Reference Manual
7  *
8  * License: GPL-2.0+
9  */
10
11 #include "xmc1xxx.S"
12
13         .macro write_block, nvmbase, dest, src, tmp, tmp2
14
15         ldr     \tmp, [\src,  #0x0]
16         str     \tmp, [\dest, #0x0]
17         ldr     \tmp, [\src,  #0x4]
18         str     \tmp, [\dest, #0x4]
19         ldr     \tmp, [\src,  #0x8]
20         str     \tmp, [\dest, #0x8]
21         ldr     \tmp, [\src,  #0xc]
22         str     \tmp, [\dest, #0xc]
23
24         busy_wait \nvmbase, \tmp, \tmp2
25
26         .endm
27
28
29         .macro write, nvmbase, dest, src, count, tmp, tmp2
30
31         movs    \tmp, #NVMPROG_ACTION_WRITE_CONTINUOUS
32         strh    \tmp, [\nvmbase, #NVMPROG]
33 1001:
34         write_block \nvmbase, \dest, \src, \tmp, \tmp2
35
36         adds    \dest, \dest, #NVM_BLOCK_SIZE
37         adds    \src, \src, #NVM_BLOCK_SIZE
38         subs    \count, \count, #1
39         cmp     \count, #0
40         bgt     1001b
41
42         movs    \tmp, #NVMPROG_ACTION_IDLE
43         strh    \tmp, [\nvmbase, #NVMPROG]
44
45         .endm
46
47
48         /*
49          * r0 = 0x40050000
50          * r1 = e.g. 0x10001000
51          * r2 = e.g. 0x20000000
52          * r3 = e.g. 1
53          * NVMPROG.ACTION = 0x00
54          */
55 write:
56         write r0, r1, r2, r3, r4, r5
57
58         bkpt    #0