1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 /***************************************************************************
4 * Copyright (C) 2015 by Ivan Meleca *
7 * Copyright (C) 2016 by Tomas Vanek *
9 ***************************************************************************/
12 * r0 = flash destination address in/out
14 * r2 = workarea start address
15 * r3 = workarea end address
31 /* old longword algo: 6.680 KiB/s @ adapter_khz 2000
32 * this async algo: 19.808 KiB/s @ adapter_khz 2000
41 ldr r6, [r2, #0] /* read wp */
42 cmp r6, #0 /* abort if wp == 0 */
45 ldr r5, [r2, #4] /* read rp */
46 cmp r5, r6 /* wait until rp != wp */
49 str r0, [r4, #FTFx_FCCOB3] /* set flash address */
51 strb r7, [r4, #FTFx_FCCOB0] /* flash command */
53 ldr r7, [r5] /* set longword data = *rp */
54 str r7, [r4, #FTFx_FCCOB7]
57 strb r7, [r4, #FTFx_FSTAT]
59 add r5, #4 /* rp += 4 */
60 cmp r5, r3 /* Wrap? */
66 str r5, [r2, #4] /* Store rp */
69 ldr r6, [r2, #0] /* read wp */
70 cmp r6, #0 /* abort if wp == 0 */
73 ldrb r6, [r4, #FTFx_FSTAT]
81 add r0, #4 /* flash address += 4, do not increment before err check */
83 sub r1, #1 /* word_count-- */
90 str r5, [r2, #4] /* set rp = 0 on error */