1 /***************************************************************************
2 * Copyright (C) 2015 by Ivan Meleca *
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. *
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 ***************************************************************************/
17 * r0 = flash destination address, status
19 * r2 = workarea start address
20 * r3 = workarea end address
36 ldr
r6, [r2, #0] /* read wp */
37 cmp r6, #0 /* abort if wp == 0 */
39 ldr
r5, [r2, #4] /* read rp */
40 cmp r5, r6 /* wait until rp != wp */
43 ldr
r6, fstat
/* Clear error flags */
47 ldr
r6, fccobix
/* FCCOBIX = 0 */
51 ldr
r6, fccobhi
/* Program FLASH command */
52 mov
r7, #6 /* FCCOBHI = 6 */
55 lsr
r7, r0, #16 /* FCCOBLO = flash destination address >> 16 */
59 ldr
r6, fccobix
/* Index for lower byte address bits[15:0] */
61 strb
r7, [r6] /* FCCOBIX = 1*/
63 uxtb
r7, r0 /* Memory address bits[15:0] */
65 strb
r7, [r6] /* FCCOBLO = flash destination address */
69 strb
r7, [r6] /* FCCOBHI = flash destination address >> 8 */
71 ldr
r6, fccobix
/* FCCOBIX = 2 */
75 ldrb
r7, [r5, #1] /* FCCOBHI = rp >> 8 */
79 ldrb
r7, [r5] /* FCCOBLO = rp */
83 ldr
r6, fccobix
/* FCCOBIX = 3 */
87 ldrb
r7, [r5, #3] /* FCCOBHI = rp >> 24 */
91 ldrb
r7, [r5, #2] /* FCCOBLO = rp >> 16 */
95 sub r1, r1, #1 /* Two words (4 bytes) queued, decrement counter */
96 add r0, r0, #4 /* flash address += 4 */
97 add r5, r5, #4 /* rp += 4 */
99 cmp r5, r3 /* Wrap? */
105 cmp r1, #0 /* Done? */
108 ldr
r6, [r2, #0] /* read wp */
110 beq execute
/* execute if rp == wp */
112 ldr
r6, fccobix
/* FCCOBIX = 4 */
116 ldrb
r7, [r5, #1] /* FCCOBHI = rp >> 8 */
120 ldrb
r7, [r5] /* FCCOBLO = rp */
124 ldr
r6, fccobix
/* FCCOBIX = 5 */
128 ldrb
r7, [r5, #3] /* FCCOBHI = rp >> 24 */
132 ldrb
r7, [r5, #2] /* FCCOBLO = rp >> 16 */
136 sub r1, r1, #1 /* Two words (4 bytes) queued, decrement counter */
137 add r0, r0, #4 /* flash address += 4 */
138 add r5, r5, #4 /* rp += 4 */
140 cmp r5, r3 /* Wrap? */
146 ldr
r6, fstat
/* Launch the command */
152 ldrb
r6, [r6] /* Wait until finished */
156 mov
r7, #48 /* Check error */
160 mov
r6, #0 /* Clear error */
162 str
r5, [r2, #4] /* Store rp */
164 cmp r1, #0 /* Done? */
170 str
r0, [r2, #4] /* set rp = 0 on error */
173 mov
r0, r6 /* Set result code */