1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 /***************************************************************************
4 * Copyright (C) 2010 by Spencer Oliver *
5 * spen@spen-soft.co.uk *
7 * Copyright (C) 2011 Øyvind Harboe *
8 * oyvind.harboe@zylin.com *
9 ***************************************************************************/
18 * r0 = workarea start, status (out)
21 * r3 = count (16bit words)
30 #define STM32_FLASH_CR_OFFSET 0x10 /* offset of CR register in FLASH struct */
31 #define STM32_FLASH_SR_OFFSET 0x0c /* offset of SR register in FLASH struct */
33 #define STM32_PROG16 0x101 /* PG | PSIZE_16*/
39 ldr r8, [r0, #0] /* read wp */
40 cmp r8, #0 /* abort if wp == 0 */
42 ldr r7, [r0, #4] /* read rp */
43 cmp r7, r8 /* wait until rp != wp */
47 str r6, [r4, #STM32_FLASH_CR_OFFSET]
48 ldrh r6, [r7], #0x02 /* read one half-word from src, increment ptr */
49 strh r6, [r2], #0x02 /* write one half-word from src, increment ptr */
52 ldr r6, [r4, #STM32_FLASH_SR_OFFSET]
53 tst r6, #0x10000 /* BSY (bit16) == 1 => operation in progress */
54 bne busy /* wait more... */
55 tst r6, #0xf0 /* PGSERR | PGPERR | PGAERR | WRPERR */
56 bne error /* fail... */
58 cmp r7, r1 /* wrap rp at end of buffer */
60 addcs r7, r0, #8 /* skip loader args */
61 str r7, [r0, #4] /* store rp */
62 subs r3, r3, #1 /* decrement halfword count */
63 cbz r3, exit /* loop if not done */
67 str r1, [r0, #4] /* set rp = 0 on error */
69 mov r0, r6 /* return status in r0 */