1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 /***************************************************************************
4 * Copyright (C) 2019 by Andreas Bolsch *
5 * andreas.bolsch@mni.thm.de *
6 ***************************************************************************/
21 #include "../../../../src/flash/nor/stmqspi.h"
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 */
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 */
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 */
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 */
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 */
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 */
73 .space 4 /* not used */
75 .space 4 /* QSPI_CCR value for read command */
76 .space 4 /* not used */
77 .space 4 /* not used */