contrib: replace the GPLv2-or-later license tag
[fw/openocd] / contrib / loaders / flash / stmqspi / stmqspi_erase_check.S
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2
3 /***************************************************************************
4  *   Copyright (C) 2019 by Andreas Bolsch                                  *
5  *   andreas.bolsch@mni.thm.de                                             *
6  ***************************************************************************/
7
8         .text
9         .syntax unified
10         .cpu cortex-m0
11         .thumb
12         .thumb_func
13
14 /* Params:
15  * r0 - sector count
16  * r1 - QSPI io_base
17
18  * Clobbered:
19  * r2 - r7 tmp */
20
21 #include "../../../../src/flash/nor/stmqspi.h"
22
23         .macro  qspi_abort
24         movs    r4, #(1<<SPI_ABORT)                     /* abort bit mask */
25         ldr             r7, [r1, #QSPI_CR]                      /* get QSPI_CR register */
26         orrs    r7, r7, r4                                      /* set abort bit */
27         str             r7, [r1, #QSPI_CR]                      /* store new CR register */
28         .endm
29
30         .macro  wait_busy
31 0:
32         ldr             r7, [r1, #QSPI_SR]                      /* load status */
33         lsrs    r7, r7, #(SPI_BUSY+1)           /* shift BUSY into C */
34         bcs             0b                                                      /* loop until BUSY cleared */
35         movs    r7, #(1<<SPI_TCF)                       /* TCF bitmask */
36         str             r7, [r1, #QSPI_FCR]                     /* clear TCF flag */
37         .endm
38
39 start:
40         adr             r2, buffer                                      /* pointer to start of buffer */
41         movs    r3, #QSPI_DR                            /* load QSPI_DR address offset */
42         add             r3, r3, r1                                      /* address of QSPI_DR */
43 sector_start:
44         qspi_abort                                                      /* start in clean state */
45         ldmia   r2!, {r4, r5, r6}                       /* load address offset, length, initial value */
46         subs    r2, r2, #8                                      /* point to length */
47         subs    r5, r5, #1                                      /* decrement sector length for DLR */
48         wait_busy
49         str             r5, [r1, #QSPI_DLR]                     /* size-1 in DLR register */
50         ldr             r7, ccr_page_read                       /* CCR for page read */
51         str             r7, [r1, #QSPI_CCR]                     /* initiate transfer */
52         str             r4, [r1, #QSPI_AR]                      /* store SPI start address */
53         ldr             r7, [r1, #QSPI_SR]                      /* wait for command startup */
54 read_loop:
55         ldrb    r4, [r3]                                        /* read next byte from DR */
56         movs    r7, #0xFF                                       /* fill bits 8-15 */
57         lsls    r7, r7, #8                                      /* with ones */
58         orrs    r4, r4, r7                                      /* copy ones to left of read byte */
59         ands    r6, r6, r4                                      /* and read byte to result */
60         lsls    r4, r4, #8                                      /* shift result into higher byte */
61         orrs    r6, r6, r4                                      /* or read byte to result */
62         subs    r5, r5, #1                                      /* decrement byte (count-1) */
63         bpl             read_loop                                       /* again if sector not completed */
64         adds    r5, r5, #1                                      /* increment count due to the -1 */
65         stmia   r2!, {r5, r6}                           /* save final count and result for sector */
66         subs    r0, r0, #1                                      /* decrement sector count */
67         bne             sector_start                            /* next sector? */
68         qspi_abort                                                      /* to idle state */
69         .align  2                                                       /* align to word, bkpt is 4 words */
70         bkpt    #0                                                      /* before code end for exit_point */
71         .align  2                                                       /* align to word */
72
73         .space  4                                                       /* not used */
74 ccr_page_read:
75         .space  4                                                       /* QSPI_CCR value for read command */
76         .space  4                                                       /* not used */
77         .space  4                                                       /* not used */
78
79         .equ buffer, .
80