1 /*
2  * Copyright (c) 2016, Freescale Semiconductor, Inc.
3  * Copyright 2016-2023 NXP
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 #ifndef FSL_FLEXSPI_H_
10 #define FSL_FLEXSPI_H_
11 
12 #include <stddef.h>
13 #include "fsl_device_registers.h"
14 #include "fsl_common.h"
15 
16 /*!
17  * @addtogroup flexspi
18  * @{
19  */
20 
21 /*******************************************************************************
22  * Definitions
23  ******************************************************************************/
24 
25 /*! @name Driver version */
26 /*! @{ */
27 /*! @brief FLEXSPI driver version. */
28 #define FSL_FLEXSPI_DRIVER_VERSION (MAKE_VERSION(2, 6, 0))
29 /*! @} */
30 
31 #define FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNTn(0)
32 
33 /*! @brief Formula to form FLEXSPI instructions in LUT table. */
34 #define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)                                                              \
35     (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \
36      FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))
37 
38 /*! @brief Status structure of FLEXSPI.*/
39 enum
40 {
41     kStatus_FLEXSPI_Busy                     = MAKE_STATUS(kStatusGroup_FLEXSPI, 0), /*!< FLEXSPI is busy */
42     kStatus_FLEXSPI_SequenceExecutionTimeout = MAKE_STATUS(kStatusGroup_FLEXSPI, 1), /*!< Sequence execution timeout
43                                                                             error occurred during FLEXSPI transfer. */
44     kStatus_FLEXSPI_IpCommandSequenceError = MAKE_STATUS(kStatusGroup_FLEXSPI, 2),   /*!< IP command Sequence execution
45                                                                      timeout error occurred during FLEXSPI transfer. */
46     kStatus_FLEXSPI_IpCommandGrantTimeout = MAKE_STATUS(kStatusGroup_FLEXSPI, 3),    /*!< IP command grant timeout error
47                                                                                     occurred during FLEXSPI transfer. */
48 };
49 
50 /*! @brief CMD definition of FLEXSPI, use to form LUT instruction, _flexspi_command. */
51 enum
52 {
53     kFLEXSPI_Command_STOP           = 0x00U, /*!< Stop execution, deassert CS. */
54     kFLEXSPI_Command_SDR            = 0x01U, /*!< Transmit Command code to Flash, using SDR mode. */
55     kFLEXSPI_Command_RADDR_SDR      = 0x02U, /*!< Transmit Row Address to Flash, using SDR mode. */
56     kFLEXSPI_Command_CADDR_SDR      = 0x03U, /*!< Transmit Column Address to Flash, using SDR mode. */
57     kFLEXSPI_Command_MODE1_SDR      = 0x04U, /*!< Transmit 1-bit Mode bits to Flash, using SDR mode. */
58     kFLEXSPI_Command_MODE2_SDR      = 0x05U, /*!< Transmit 2-bit Mode bits to Flash, using SDR mode. */
59     kFLEXSPI_Command_MODE4_SDR      = 0x06U, /*!< Transmit 4-bit Mode bits to Flash, using SDR mode. */
60     kFLEXSPI_Command_MODE8_SDR      = 0x07U, /*!< Transmit 8-bit Mode bits to Flash, using SDR mode. */
61     kFLEXSPI_Command_WRITE_SDR      = 0x08U, /*!< Transmit Programming Data to Flash, using SDR mode. */
62     kFLEXSPI_Command_READ_SDR       = 0x09U, /*!< Receive Read Data from Flash, using SDR mode. */
63     kFLEXSPI_Command_LEARN_SDR      = 0x0AU, /*!< Receive Read Data or Preamble bit from Flash, SDR mode. */
64     kFLEXSPI_Command_DATSZ_SDR      = 0x0BU, /*!< Transmit Read/Program Data size (byte) to Flash, SDR mode. */
65     kFLEXSPI_Command_DUMMY_SDR      = 0x0CU, /*!< Leave data lines undriven by FlexSPI controller.*/
66     kFLEXSPI_Command_DUMMY_RWDS_SDR = 0x0DU, /*!< Leave data lines undriven by FlexSPI controller,
67                                                   dummy cycles decided by RWDS. */
68     kFLEXSPI_Command_DDR            = 0x21U, /*!< Transmit Command code to Flash, using DDR mode. */
69     kFLEXSPI_Command_RADDR_DDR      = 0x22U, /*!< Transmit Row Address to Flash, using DDR mode. */
70     kFLEXSPI_Command_CADDR_DDR      = 0x23U, /*!< Transmit Column Address to Flash, using DDR mode. */
71     kFLEXSPI_Command_MODE1_DDR      = 0x24U, /*!< Transmit 1-bit Mode bits to Flash, using DDR mode. */
72     kFLEXSPI_Command_MODE2_DDR      = 0x25U, /*!< Transmit 2-bit Mode bits to Flash, using DDR mode. */
73     kFLEXSPI_Command_MODE4_DDR      = 0x26U, /*!< Transmit 4-bit Mode bits to Flash, using DDR mode. */
74     kFLEXSPI_Command_MODE8_DDR      = 0x27U, /*!< Transmit 8-bit Mode bits to Flash, using DDR mode. */
75     kFLEXSPI_Command_WRITE_DDR      = 0x28U, /*!< Transmit Programming Data to Flash, using DDR mode. */
76     kFLEXSPI_Command_READ_DDR       = 0x29U, /*!< Receive Read Data from Flash, using DDR mode. */
77     kFLEXSPI_Command_LEARN_DDR      = 0x2AU, /*!< Receive Read Data or Preamble bit from Flash, DDR mode. */
78     kFLEXSPI_Command_DATSZ_DDR      = 0x2BU, /*!< Transmit Read/Program Data size (byte) to Flash, DDR mode. */
79     kFLEXSPI_Command_DUMMY_DDR      = 0x2CU, /*!< Leave data lines undriven by FlexSPI controller.*/
80     kFLEXSPI_Command_DUMMY_RWDS_DDR = 0x2DU, /*!< Leave data lines undriven by FlexSPI controller,
81                                                dummy cycles decided by RWDS. */
82     kFLEXSPI_Command_JUMP_ON_CS = 0x1FU,     /*!< Stop execution, deassert CS and save operand[7:0] as the
83                                                instruction start pointer for next sequence */
84 };
85 
86 /*! @brief pad definition of FLEXSPI, use to form LUT instruction. */
87 typedef enum _flexspi_pad
88 {
89     kFLEXSPI_1PAD = 0x00U, /*!< Transmit command/address and transmit/receive data only through DATA0/DATA1. */
90     kFLEXSPI_2PAD = 0x01U, /*!< Transmit command/address and transmit/receive data only through DATA[1:0]. */
91     kFLEXSPI_4PAD = 0x02U, /*!< Transmit command/address and transmit/receive data only through DATA[3:0]. */
92     kFLEXSPI_8PAD = 0x03U, /*!< Transmit command/address and transmit/receive data only through DATA[7:0]. */
93 } flexspi_pad_t;
94 
95 /*! @brief FLEXSPI interrupt status flags.*/
96 typedef enum _flexspi_flags
97 {
98     kFLEXSPI_SequenceExecutionTimeoutFlag = FLEXSPI_INTEN_SEQTIMEOUTEN_MASK, /*!< Sequence execution timeout. */
99 #if defined(FSL_FEATURE_FLEXSPI_HAS_INTEN_AHBBUSERROREN) && FSL_FEATURE_FLEXSPI_HAS_INTEN_AHBBUSERROREN
100     kFLEXSPI_AhbBusErrorFlag = FLEXSPI_INTEN_AHBBUSERROREN_MASK, /*!< AHB Bus error flag. */
101 #else
102     kFLEXSPI_AhbBusTimeoutFlag = FLEXSPI_INTEN_AHBBUSTIMEOUTEN_MASK, /*!< AHB Bus timeout. */
103 #endif
104     kFLEXSPI_SckStoppedBecauseTxEmptyFlag =
105         FLEXSPI_INTEN_SCKSTOPBYWREN_MASK, /*!< SCK is stopped during command
106                                                sequence because Async TX FIFO empty. */
107     kFLEXSPI_SckStoppedBecauseRxFullFlag =
108         FLEXSPI_INTEN_SCKSTOPBYRDEN_MASK, /*!< SCK is stopped during command
109                                                sequence because Async RX FIFO full. */
110 #if !((defined(FSL_FEATURE_FLEXSPI_HAS_NO_DATA_LEARN)) && (FSL_FEATURE_FLEXSPI_HAS_NO_DATA_LEARN))
111     kFLEXSPI_DataLearningFailedFlag = FLEXSPI_INTEN_DATALEARNFAILEN_MASK, /*!< Data learning failed. */
112 #endif
113     kFLEXSPI_IpTxFifoWatermarkEmptyFlag     = FLEXSPI_INTEN_IPTXWEEN_MASK, /*!< IP TX FIFO WaterMark empty. */
114     kFLEXSPI_IpRxFifoWatermarkAvailableFlag = FLEXSPI_INTEN_IPRXWAEN_MASK, /*!< IP RX FIFO WaterMark available. */
115     kFLEXSPI_AhbCommandSequenceErrorFlag =
116         FLEXSPI_INTEN_AHBCMDERREN_MASK,                                  /*!< AHB triggered Command Sequences Error. */
117     kFLEXSPI_IpCommandSequenceErrorFlag = FLEXSPI_INTEN_IPCMDERREN_MASK, /*!< IP triggered Command Sequences Error. */
118     kFLEXSPI_AhbCommandGrantTimeoutFlag =
119         FLEXSPI_INTEN_AHBCMDGEEN_MASK, /*!< AHB triggered Command Sequences Grant Timeout. */
120     kFLEXSPI_IpCommandGrantTimeoutFlag =
121         FLEXSPI_INTEN_IPCMDGEEN_MASK, /*!< IP triggered Command Sequences Grant Timeout. */
122     kFLEXSPI_IpCommandExecutionDoneFlag =
123         FLEXSPI_INTEN_IPCMDDONEEN_MASK,  /*!< IP triggered Command Sequences Execution finished. */
124     kFLEXSPI_AllInterruptFlags = 0xFFFU, /*!< All flags. */
125 } flexspi_flags_t;
126 
127 /*! @brief FLEXSPI sample clock source selection for Flash Reading.*/
128 typedef enum _flexspi_read_sample_clock
129 {
130     kFLEXSPI_ReadSampleClkLoopbackInternally = 0x0U,      /*!< Dummy Read strobe generated by FlexSPI Controller
131                                                                and loopback internally. */
132     kFLEXSPI_ReadSampleClkLoopbackFromDqsPad = 0x1U,      /*!< Dummy Read strobe generated by FlexSPI Controller
133                                                                and loopback from DQS pad. */
134     kFLEXSPI_ReadSampleClkLoopbackFromSckPad      = 0x2U, /*!< SCK output clock and loopback from SCK pad. */
135     kFLEXSPI_ReadSampleClkExternalInputFromDqsPad = 0x3U, /*!< Flash provided Read strobe and input from DQS pad. */
136 } flexspi_read_sample_clock_t;
137 
138 /*! @brief FLEXSPI interval unit for flash device select.*/
139 typedef enum _flexspi_cs_interval_cycle_unit
140 {
141     kFLEXSPI_CsIntervalUnit1SckCycle   = 0x0U, /*!< Chip selection interval: CSINTERVAL * 1 serial clock cycle. */
142     kFLEXSPI_CsIntervalUnit256SckCycle = 0x1U, /*!< Chip selection interval: CSINTERVAL * 256 serial clock cycle. */
143 } flexspi_cs_interval_cycle_unit_t;
144 
145 /*! @brief FLEXSPI AHB wait interval unit for writing.*/
146 typedef enum _flexspi_ahb_write_wait_unit
147 {
148     kFLEXSPI_AhbWriteWaitUnit2AhbCycle     = 0x0U, /*!< AWRWAIT unit is 2 ahb clock cycle. */
149     kFLEXSPI_AhbWriteWaitUnit8AhbCycle     = 0x1U, /*!< AWRWAIT unit is 8 ahb clock cycle. */
150     kFLEXSPI_AhbWriteWaitUnit32AhbCycle    = 0x2U, /*!< AWRWAIT unit is 32 ahb clock cycle. */
151     kFLEXSPI_AhbWriteWaitUnit128AhbCycle   = 0x3U, /*!< AWRWAIT unit is 128 ahb clock cycle. */
152     kFLEXSPI_AhbWriteWaitUnit512AhbCycle   = 0x4U, /*!< AWRWAIT unit is 512 ahb clock cycle. */
153     kFLEXSPI_AhbWriteWaitUnit2048AhbCycle  = 0x5U, /*!< AWRWAIT unit is 2048 ahb clock cycle. */
154     kFLEXSPI_AhbWriteWaitUnit8192AhbCycle  = 0x6U, /*!< AWRWAIT unit is 8192 ahb clock cycle. */
155     kFLEXSPI_AhbWriteWaitUnit32768AhbCycle = 0x7U, /*!< AWRWAIT unit is 32768 ahb clock cycle. */
156 } flexspi_ahb_write_wait_unit_t;
157 
158 /*! @brief Error Code when IP command Error detected.*/
159 typedef enum _flexspi_ip_error_code
160 {
161     kFLEXSPI_IpCmdErrorNoError               = 0x0U,    /*!< No error. */
162     kFLEXSPI_IpCmdErrorJumpOnCsInIpCmd       = 0x2U,    /*!< IP command with JMP_ON_CS instruction used. */
163     kFLEXSPI_IpCmdErrorUnknownOpCode         = 0x3U,    /*!< Unknown instruction opcode in the sequence. */
164     kFLEXSPI_IpCmdErrorSdrDummyInDdrSequence = 0x4U,    /*!< Instruction DUMMY_SDR/DUMMY_RWDS_SDR
165                                                              used in DDR sequence. */
166     kFLEXSPI_IpCmdErrorDdrDummyInSdrSequence = 0x5U,    /*!< Instruction DUMMY_DDR/DUMMY_RWDS_DDR
167                                                              used in SDR sequence. */
168     kFLEXSPI_IpCmdErrorInvalidAddress = 0x6U,           /*!< Flash access start address exceed the whole
169                                                             flash address range (A1/A2/B1/B2). */
170     kFLEXSPI_IpCmdErrorSequenceExecutionTimeout = 0xEU, /*!< Sequence execution timeout. */
171     kFLEXSPI_IpCmdErrorFlashBoundaryAcrosss     = 0xFU, /*!< Flash boundary crossed. */
172 } flexspi_ip_error_code_t;
173 
174 /*! @brief Error Code when AHB command Error detected.*/
175 typedef enum _flexspi_ahb_error_code
176 {
177     kFLEXSPI_AhbCmdErrorNoError            = 0x0U,    /*!< No error. */
178     kFLEXSPI_AhbCmdErrorJumpOnCsInWriteCmd = 0x2U,    /*!< AHB Write command with JMP_ON_CS instruction
179                                                            used in the sequence. */
180     kFLEXSPI_AhbCmdErrorUnknownOpCode         = 0x3U, /*!< Unknown instruction opcode in the sequence. */
181     kFLEXSPI_AhbCmdErrorSdrDummyInDdrSequence = 0x4U, /*!< Instruction DUMMY_SDR/DUMMY_RWDS_SDR used
182                                                            in DDR sequence. */
183     kFLEXSPI_AhbCmdErrorDdrDummyInSdrSequence = 0x5U, /*!< Instruction DUMMY_DDR/DUMMY_RWDS_DDR
184                                                            used in SDR sequence. */
185     kFLEXSPI_AhbCmdSequenceExecutionTimeout = 0x6U,   /*!< Sequence execution timeout. */
186 } flexspi_ahb_error_code_t;
187 
188 /*! @brief FLEXSPI operation port select.*/
189 typedef enum _flexspi_port
190 {
191     kFLEXSPI_PortA1 = 0x0U, /*!< Access flash on A1 port. */
192     kFLEXSPI_PortA2,        /*!< Access flash on A2 port. */
193 #if !((defined(FSL_FEATURE_FLEXSPI_NO_SUPPORT_PORTB)) && (FSL_FEATURE_FLEXSPI_NO_SUPPORT_PORTB))
194     kFLEXSPI_PortB1, /*!< Access flash on B1 port. */
195     kFLEXSPI_PortB2, /*!< Access flash on B2 port. */
196 #endif
197     kFLEXSPI_PortCount
198 } flexspi_port_t;
199 
200 /*! @brief Trigger source of current command sequence granted by arbitrator.*/
201 typedef enum _flexspi_arb_command_source
202 {
203     kFLEXSPI_AhbReadCommand   = 0x0U,
204     kFLEXSPI_AhbWriteCommand  = 0x1U,
205     kFLEXSPI_IpCommand        = 0x2U,
206     kFLEXSPI_SuspendedCommand = 0x3U,
207 } flexspi_arb_command_source_t;
208 
209 /*! @brief Command type. */
210 typedef enum _flexspi_command_type
211 {
212     kFLEXSPI_Command, /*!< FlexSPI operation: Only command, both TX and Rx buffer are ignored. */
213     kFLEXSPI_Config,  /*!< FlexSPI operation: Configure device mode, the TX fifo size is fixed in LUT. */
214     kFLEXSPI_Read,    /* /!< FlexSPI operation: Read, only Rx Buffer is effective. */
215     kFLEXSPI_Write,   /* /!< FlexSPI operation: Read, only Tx Buffer is effective. */
216 } flexspi_command_type_t;
217 
218 typedef struct _flexspi_ahbBuffer_config
219 {
220     uint8_t priority;    /*!< This priority for AHB Master Read which this AHB RX Buffer is assigned. */
221     uint8_t masterIndex; /*!< AHB Master ID the AHB RX Buffer is assigned. */
222     uint16_t bufferSize; /*!< AHB buffer size in byte. */
223     bool enablePrefetch; /*!< AHB Read Prefetch Enable for current AHB RX Buffer corresponding Master, allows
224                           prefetch disable/enable separately for each master. */
225 } flexspi_ahbBuffer_config_t;
226 
227 /*! @brief FLEXSPI configuration structure. */
228 typedef struct _flexspi_config
229 {
230     flexspi_read_sample_clock_t rxSampleClock; /*!< Sample Clock source selection for Flash Reading. */
231     bool enableSckFreeRunning;                 /*!< Enable/disable SCK output free-running. */
232 #if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN)
233     bool enableCombination; /*!< Enable/disable combining PORT A and B Data Pins
234                             (SIOA[3:0] and SIOB[3:0]) to support Flash Octal mode. */
235 #endif
236     bool enableDoze;            /*!< Enable/disable doze mode support. */
237     bool enableHalfSpeedAccess; /*!< Enable/disable divide by 2 of the clock for half
238                                  speed commands. */
239 #if defined(FSL_FEATURE_FLEXSPI_SUPPORT_SEPERATE_RXCLKSRC_PORTB) && FSL_FEATURE_FLEXSPI_SUPPORT_SEPERATE_RXCLKSRC_PORTB
240     flexspi_read_sample_clock_t rxSampleClockPortB; /*!< Sample Clock source_b selection for Flash Reading. */
241 #endif
242 #if defined(FSL_FEATURE_FLEXSPI_SUPPORT_RXCLKSRC_DIFF) && FSL_FEATURE_FLEXSPI_SUPPORT_RXCLKSRC_DIFF
243     bool rxSampleClockDiff; /*!< Sample Clock source or source_b selection for Flash Reading. */
244 #endif
245 #if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR2_SCKBDIFFOPT) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR2_SCKBDIFFOPT)
246     bool enableSckBDiffOpt; /*!< Enable/disable SCKB pad use as SCKA differential clock
247                              output, when enable, Port B flash access is not available. */
248 #endif
249     bool enableSameConfigForAll; /*!< Enable/disable same configuration for all connected devices
250                                   when enabled, same configuration in FLASHA1CRx is applied to all. */
251     uint16_t seqTimeoutCycle;    /*!< Timeout wait cycle for command sequence execution,
252                                  timeout after ahbGrantTimeoutCyle*1024 serial root clock cycles. */
253     uint8_t ipGrantTimeoutCycle; /*!< Timeout wait cycle for IP command grant, timeout after
254                                   ipGrantTimeoutCycle*1024 AHB clock cycles. */
255     uint8_t txWatermark;         /*!< FLEXSPI IP transmit watermark value. */
256     uint8_t rxWatermark;         /*!< FLEXSPI receive watermark value. */
257     struct
258     {
259 #if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ATDFEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ATDFEN)
260         bool enableAHBWriteIpTxFifo; /*!< Enable AHB bus write access to IP TX FIFO. */
261 #endif
262 #if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ARDFEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ARDFEN)
263         bool enableAHBWriteIpRxFifo; /*!< Enable AHB bus write access to IP RX FIFO. */
264 #endif
265         uint8_t ahbGrantTimeoutCycle; /*!< Timeout wait cycle for AHB command grant,
266                                        timeout after ahbGrantTimeoutCyle*1024 AHB clock cycles. */
267         uint16_t ahbBusTimeoutCycle;  /*!< Timeout wait cycle for AHB read/write access,
268                                       timeout after ahbBusTimeoutCycle*1024 AHB clock cycles. */
269         uint8_t resumeWaitCycle;      /*!< Wait cycle for idle state before suspended command sequence
270                                        resume, timeout after ahbBusTimeoutCycle AHB clock cycles. */
271         flexspi_ahbBuffer_config_t buffer[FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT]; /*!< AHB buffer size. */
272         bool enableClearAHBBufferOpt; /*!< Enable/disable automatically clean AHB RX Buffer and TX Buffer
273                                        when FLEXSPI returns STOP mode ACK. */
274         bool enableReadAddressOpt;    /*!< Enable/disable remove AHB read burst start address alignment limitation.
275                                        when enable, there is no AHB read burst start address alignment limitation. */
276         bool enableAHBPrefetch;       /*!< Enable/disable AHB read prefetch feature, when enabled, FLEXSPI
277                                        will fetch more data than current AHB burst. */
278         bool enableAHBBufferable;     /*!< Enable/disable AHB bufferable write access support, when enabled,
279                                        FLEXSPI return before waiting for command execution finished. */
280         bool enableAHBCachable;       /*!< Enable AHB bus cachable read access support. */
281     } ahbConfig;
282 } flexspi_config_t;
283 
284 /*! @brief External device configuration items. */
285 typedef struct _flexspi_device_config
286 {
287     uint32_t flexspiRootClk; /*!< FLEXSPI serial root clock. */
288     bool isSck2Enabled;      /*!< FLEXSPI use SCK2. */
289     uint32_t flashSize;      /*!< Flash size in KByte. */
290 #if defined(FSL_FEATURE_FLEXSPI_SUPPORT_ADDRESS_SHIFT) && (FSL_FEATURE_FLEXSPI_SUPPORT_ADDRESS_SHIFT)
291     bool addressShift;                               /*!< Address shift. */
292 #endif                                               /* FSL_FEATURE_FLEXSPI_SUPPORT_ADDRESS_SHIFT */
293     flexspi_cs_interval_cycle_unit_t CSIntervalUnit; /*!< CS interval unit, 1 or 256 cycle. */
294     uint16_t CSInterval;                             /*!< CS line assert interval, multiply CS interval unit to
295                                                       get the CS line assert interval cycles. */
296     uint8_t CSHoldTime;                              /*!< CS line hold time. */
297     uint8_t CSSetupTime;                             /*!< CS line setup time. */
298     uint8_t dataValidTime;                           /*!< Data valid time for external device. */
299     uint8_t columnspace;                             /*!< Column space size. */
300     bool enableWordAddress;                          /*!< If enable word address.*/
301     uint8_t AWRSeqIndex;                             /*!< Sequence ID for AHB write command. */
302     uint8_t AWRSeqNumber;                            /*!< Sequence number for AHB write command. */
303     uint8_t ARDSeqIndex;                             /*!< Sequence ID for AHB read command. */
304     uint8_t ARDSeqNumber;                            /*!< Sequence number for AHB read command. */
305     flexspi_ahb_write_wait_unit_t AHBWriteWaitUnit;  /*!< AHB write wait unit. */
306     uint16_t AHBWriteWaitInterval;                   /*!< AHB write wait interval, multiply AHB write interval
307                                                       unit to get the AHB write wait cycles. */
308     bool enableWriteMask;                            /*!< Enable/Disable FLEXSPI drive DQS pin as write mask
309                                                       when writing to external device. */
310 #if defined(FSL_FEATURE_FLEXSPI_HAS_ERRATA_051426) && (FSL_FEATURE_FLEXSPI_HAS_ERRATA_051426)
311     bool isFroClockSource; /*!< Is FRO clock source or not. */
312 #endif
313 } flexspi_device_config_t;
314 
315 /*! @brief Transfer structure for FLEXSPI. */
316 typedef struct _flexspi_transfer
317 {
318     uint32_t deviceAddress;         /*!< Operation device address. */
319     flexspi_port_t port;            /*!< Operation port. */
320     flexspi_command_type_t cmdType; /*!< Execution command type. */
321     uint8_t seqIndex;               /*!< Sequence ID for command. */
322     uint8_t SeqNumber;              /*!< Sequence number for command. */
323     uint32_t *data;                 /*!< Data buffer. */
324     size_t dataSize;                /*!< Data size in bytes. */
325 } flexspi_transfer_t;
326 
327 /* Forward declaration of the handle typedef. */
328 typedef struct _flexspi_handle flexspi_handle_t;
329 
330 /*! @brief FLEXSPI transfer callback function. */
331 typedef void (*flexspi_transfer_callback_t)(FLEXSPI_Type *base,
332                                             flexspi_handle_t *handle,
333                                             status_t status,
334                                             void *userData);
335 
336 /*! @brief Transfer handle structure for FLEXSPI. */
337 struct _flexspi_handle
338 {
339     uint32_t state;                                 /*!< Internal state for FLEXSPI transfer */
340     uint8_t *data;                                  /*!< Data buffer. */
341     size_t dataSize;                                /*!< Remaining Data size in bytes. */
342     size_t transferTotalSize;                       /*!< Total Data size in bytes. */
343     flexspi_transfer_callback_t completionCallback; /*!< Callback for users while transfer finish or error occurred */
344     void *userData;                                 /*!< FLEXSPI callback function parameter.*/
345 };
346 
347 /*******************************************************************************
348  * API
349  ******************************************************************************/
350 
351 #if defined(__cplusplus)
352 extern "C" {
353 #endif /*_cplusplus. */
354 
355 /*!
356  * @name Initialization and deinitialization
357  * @{
358  */
359 
360 /*!
361  * @brief Get the instance number for FLEXSPI.
362  *
363  * @param base FLEXSPI base pointer.
364  */
365 uint32_t FLEXSPI_GetInstance(FLEXSPI_Type *base);
366 
367 /*!
368  * @brief Check and clear IP command execution errors.
369  *
370  * @param base FLEXSPI base pointer.
371  * @param status interrupt status.
372  */
373 status_t FLEXSPI_CheckAndClearError(FLEXSPI_Type *base, uint32_t status);
374 
375 /*!
376  * @brief Initializes the FLEXSPI module and internal state.
377  *
378  * This function enables the clock for FLEXSPI and also configures the FLEXSPI with the
379  * input configure parameters. Users should call this function before any FLEXSPI operations.
380  *
381  * @param base FLEXSPI peripheral base address.
382  * @param config FLEXSPI configure structure.
383  */
384 void FLEXSPI_Init(FLEXSPI_Type *base, const flexspi_config_t *config);
385 
386 /*!
387  * @brief Gets default settings for FLEXSPI.
388  *
389  * @param config FLEXSPI configuration structure.
390  */
391 void FLEXSPI_GetDefaultConfig(flexspi_config_t *config);
392 
393 /*!
394  * @brief Deinitializes the FLEXSPI module.
395  *
396  * Clears the FLEXSPI state and  FLEXSPI module registers.
397  * @param base FLEXSPI peripheral base address.
398  */
399 void FLEXSPI_Deinit(FLEXSPI_Type *base);
400 
401 /*!
402  * @brief Update FLEXSPI DLL value depending on currently flexspi root clock.
403  *
404  * @param base FLEXSPI peripheral base address.
405  * @param config Flash configuration parameters.
406  * @param port FLEXSPI Operation port.
407  */
408 void FLEXSPI_UpdateDllValue(FLEXSPI_Type *base, flexspi_device_config_t *config, flexspi_port_t port);
409 
410 /*!
411  * @brief Configures the connected device parameter.
412  *
413  * This function configures the connected device relevant parameters, such as the size, command, and so on.
414  * The flash configuration value cannot have a default value. The user needs to configure it according to the
415  * connected device.
416  *
417  * @param base FLEXSPI peripheral base address.
418  * @param config Flash configuration parameters.
419  * @param port FLEXSPI Operation port.
420  */
421 void FLEXSPI_SetFlashConfig(FLEXSPI_Type *base, flexspi_device_config_t *config, flexspi_port_t port);
422 
423 /*!
424  * @brief Software reset for the FLEXSPI logic.
425  *
426  * This function sets the software reset flags for both AHB and buffer domain and
427  * resets both AHB buffer and also IP FIFOs.
428  *
429  * @param base FLEXSPI peripheral base address.
430  */
FLEXSPI_SoftwareReset(FLEXSPI_Type * base)431 static inline void FLEXSPI_SoftwareReset(FLEXSPI_Type *base)
432 {
433     base->MCR0 |= FLEXSPI_MCR0_SWRESET_MASK;
434     while (0U != (base->MCR0 & FLEXSPI_MCR0_SWRESET_MASK))
435     {
436     }
437 }
438 
439 /*!
440  * @brief Enables or disables the FLEXSPI module.
441  *
442  * @param base FLEXSPI peripheral base address.
443  * @param enable True means enable FLEXSPI, false means disable.
444  */
FLEXSPI_Enable(FLEXSPI_Type * base,bool enable)445 static inline void FLEXSPI_Enable(FLEXSPI_Type *base, bool enable)
446 {
447     if (enable)
448     {
449         base->MCR0 &= ~FLEXSPI_MCR0_MDIS_MASK;
450     }
451     else
452     {
453         base->MCR0 |= FLEXSPI_MCR0_MDIS_MASK;
454     }
455 }
456 
457 /*! @} */
458 
459 /*!
460  * @name Interrupts
461  * @{
462  */
463 /*!
464  * @brief Enables the FLEXSPI interrupts.
465  *
466  * @param base FLEXSPI peripheral base address.
467  * @param mask FLEXSPI interrupt source.
468  */
FLEXSPI_EnableInterrupts(FLEXSPI_Type * base,uint32_t mask)469 static inline void FLEXSPI_EnableInterrupts(FLEXSPI_Type *base, uint32_t mask)
470 {
471     base->INTEN |= mask;
472 }
473 
474 /*!
475  * @brief Disable the FLEXSPI interrupts.
476  *
477  * @param base FLEXSPI peripheral base address.
478  * @param mask FLEXSPI interrupt source.
479  */
FLEXSPI_DisableInterrupts(FLEXSPI_Type * base,uint32_t mask)480 static inline void FLEXSPI_DisableInterrupts(FLEXSPI_Type *base, uint32_t mask)
481 {
482     base->INTEN &= ~mask;
483 }
484 
485 /*! @} */
486 
487 /*! @name DMA control */
488 /*! @{ */
489 
490 /*!
491  * @brief Enables or disables FLEXSPI IP Tx FIFO DMA requests.
492  *
493  * @param base FLEXSPI peripheral base address.
494  * @param enable Enable flag for transmit DMA request. Pass true for enable, false for disable.
495  */
FLEXSPI_EnableTxDMA(FLEXSPI_Type * base,bool enable)496 static inline void FLEXSPI_EnableTxDMA(FLEXSPI_Type *base, bool enable)
497 {
498     if (enable)
499     {
500         base->IPTXFCR |= FLEXSPI_IPTXFCR_TXDMAEN_MASK;
501     }
502     else
503     {
504         base->IPTXFCR &= ~FLEXSPI_IPTXFCR_TXDMAEN_MASK;
505     }
506 }
507 
508 /*!
509  * @brief Enables or disables FLEXSPI IP Rx FIFO DMA requests.
510  *
511  * @param base FLEXSPI peripheral base address.
512  * @param enable Enable flag for receive DMA request. Pass true for enable, false for disable.
513  */
FLEXSPI_EnableRxDMA(FLEXSPI_Type * base,bool enable)514 static inline void FLEXSPI_EnableRxDMA(FLEXSPI_Type *base, bool enable)
515 {
516     if (enable)
517     {
518         base->IPRXFCR |= FLEXSPI_IPRXFCR_RXDMAEN_MASK;
519     }
520     else
521     {
522         base->IPRXFCR &= ~FLEXSPI_IPRXFCR_RXDMAEN_MASK;
523     }
524 }
525 
526 /*!
527  * @brief Gets FLEXSPI IP tx fifo address for DMA transfer.
528  *
529  * @param base FLEXSPI peripheral base address.
530  * @retval The tx fifo address.
531  */
FLEXSPI_GetTxFifoAddress(FLEXSPI_Type * base)532 static inline uint32_t FLEXSPI_GetTxFifoAddress(FLEXSPI_Type *base)
533 {
534     return (uint32_t)&base->TFDR[0];
535 }
536 
537 /*!
538  * @brief Gets FLEXSPI IP rx fifo address for DMA transfer.
539  *
540  * @param base FLEXSPI peripheral base address.
541  * @retval The rx fifo address.
542  */
FLEXSPI_GetRxFifoAddress(FLEXSPI_Type * base)543 static inline uint32_t FLEXSPI_GetRxFifoAddress(FLEXSPI_Type *base)
544 {
545     return (uint32_t)&base->RFDR[0];
546 }
547 
548 /*! @} */
549 
550 /*! @name FIFO control */
551 /*! @{ */
552 
553 /*! @brief Clears the FLEXSPI IP FIFO logic.
554  *
555  * @param base FLEXSPI peripheral base address.
556  * @param txFifo Pass true to reset TX FIFO.
557  * @param rxFifo Pass true to reset RX FIFO.
558  */
FLEXSPI_ResetFifos(FLEXSPI_Type * base,bool txFifo,bool rxFifo)559 static inline void FLEXSPI_ResetFifos(FLEXSPI_Type *base, bool txFifo, bool rxFifo)
560 {
561     if (txFifo)
562     {
563         base->IPTXFCR |= FLEXSPI_IPTXFCR_CLRIPTXF_MASK;
564     }
565     if (rxFifo)
566     {
567         base->IPRXFCR |= FLEXSPI_IPRXFCR_CLRIPRXF_MASK;
568     }
569 }
570 
571 /*!
572  * @brief Gets the valid data entries in the FLEXSPI FIFOs.
573  *
574  * @param base FLEXSPI peripheral base address.
575  * @param[out] txCount Pointer through which the current number of bytes in the transmit FIFO is returned.
576  *      Pass NULL if this value is not required.
577  * @param[out] rxCount Pointer through which the current number of bytes in the receive FIFO is returned.
578  *      Pass NULL if this value is not required.
579  */
FLEXSPI_GetFifoCounts(FLEXSPI_Type * base,size_t * txCount,size_t * rxCount)580 static inline void FLEXSPI_GetFifoCounts(FLEXSPI_Type *base, size_t *txCount, size_t *rxCount)
581 {
582     if (NULL != txCount)
583     {
584         *txCount = (((base->IPTXFSTS) & FLEXSPI_IPTXFSTS_FILL_MASK) >> FLEXSPI_IPTXFSTS_FILL_SHIFT) * 8U;
585     }
586     if (NULL != rxCount)
587     {
588         *rxCount = (((base->IPRXFSTS) & FLEXSPI_IPRXFSTS_FILL_MASK) >> FLEXSPI_IPRXFSTS_FILL_SHIFT) * 8U;
589     }
590 }
591 
592 /*! @} */
593 
594 /*!
595  * @name Status
596  * @{
597  */
598 /*!
599  * @brief Get the FLEXSPI interrupt status flags.
600  *
601  * @param base FLEXSPI peripheral base address.
602  * @retval interrupt status flag, use status flag to AND #flexspi_flags_t could get the related status.
603  */
FLEXSPI_GetInterruptStatusFlags(FLEXSPI_Type * base)604 static inline uint32_t FLEXSPI_GetInterruptStatusFlags(FLEXSPI_Type *base)
605 {
606     return base->INTR;
607 }
608 
609 /*!
610  * @brief Get the FLEXSPI interrupt status flags.
611  *
612  * @param base FLEXSPI peripheral base address.
613  * @param mask FLEXSPI interrupt source.
614  */
FLEXSPI_ClearInterruptStatusFlags(FLEXSPI_Type * base,uint32_t mask)615 static inline void FLEXSPI_ClearInterruptStatusFlags(FLEXSPI_Type *base, uint32_t mask)
616 {
617     base->INTR = mask;
618 }
619 
620 #if !((defined(FSL_FEATURE_FLEXSPI_HAS_NO_DATA_LEARN)) && (FSL_FEATURE_FLEXSPI_HAS_NO_DATA_LEARN))
621 /*! @brief Gets the sampling clock phase selection after Data Learning.
622  *
623  * @param base FLEXSPI peripheral base address.
624  * @param portAPhase Pointer to a uint8_t type variable to receive the selected clock phase on PORTA.
625  * @param portBPhase Pointer to a uint8_t type variable to receive the selected clock phase on PORTB.
626  */
FLEXSPI_GetDataLearningPhase(FLEXSPI_Type * base,uint8_t * portAPhase,uint8_t * portBPhase)627 static inline void FLEXSPI_GetDataLearningPhase(FLEXSPI_Type *base, uint8_t *portAPhase, uint8_t *portBPhase)
628 {
629     if (portAPhase != NULL)
630     {
631         *portAPhase = (uint8_t)((base->STS0 & FLEXSPI_STS0_DATALEARNPHASEA_MASK) >> FLEXSPI_STS0_DATALEARNPHASEA_SHIFT);
632     }
633 
634 #if !((defined(FSL_FEATURE_FLEXSPI_HAS_NO_STS0_DATALEARNPHASEB)) && (FSL_FEATURE_FLEXSPI_HAS_NO_STS0_DATALEARNPHASEB))
635     if (portBPhase != NULL)
636     {
637         *portBPhase = (uint8_t)((base->STS0 & FLEXSPI_STS0_DATALEARNPHASEB_MASK) >> FLEXSPI_STS0_DATALEARNPHASEB_SHIFT);
638     }
639 #endif
640 }
641 #endif
642 
643 /*! @brief Gets the trigger source of current command sequence granted by arbitrator.
644  *
645  * @param base FLEXSPI peripheral base address.
646  * @retval trigger source of current command sequence.
647  */
FLEXSPI_GetArbitratorCommandSource(FLEXSPI_Type * base)648 static inline flexspi_arb_command_source_t FLEXSPI_GetArbitratorCommandSource(FLEXSPI_Type *base)
649 {
650     return (flexspi_arb_command_source_t)(
651         (uint32_t)((base->STS0 & FLEXSPI_STS0_ARBCMDSRC_MASK) >> FLEXSPI_STS0_ARBCMDSRC_SHIFT));
652 }
653 
654 /*! @brief Gets the error code when IP command error detected.
655  *
656  * @param base FLEXSPI peripheral base address.
657  * @param index Pointer to a uint8_t type variable to receive the sequence index when error detected.
658  * @retval error code when IP command error detected.
659  */
FLEXSPI_GetIPCommandErrorCode(FLEXSPI_Type * base,uint8_t * index)660 static inline flexspi_ip_error_code_t FLEXSPI_GetIPCommandErrorCode(FLEXSPI_Type *base, uint8_t *index)
661 {
662     *index = (uint8_t)((base->STS1 & FLEXSPI_STS1_IPCMDERRID_MASK) >> FLEXSPI_STS1_IPCMDERRID_SHIFT);
663     return (flexspi_ip_error_code_t)(
664         (uint32_t)((base->STS1 & FLEXSPI_STS1_IPCMDERRCODE_MASK) >> FLEXSPI_STS1_IPCMDERRCODE_SHIFT));
665 }
666 
667 /*! @brief Gets the error code when AHB command error detected.
668  *
669  * @param base FLEXSPI peripheral base address.
670  * @param index Pointer to a uint8_t type variable to receive the sequence index when error detected.
671  * @retval error code when AHB command error detected.
672  */
FLEXSPI_GetAHBCommandErrorCode(FLEXSPI_Type * base,uint8_t * index)673 static inline flexspi_ahb_error_code_t FLEXSPI_GetAHBCommandErrorCode(FLEXSPI_Type *base, uint8_t *index)
674 {
675     *index = (uint8_t)(base->STS1 & FLEXSPI_STS1_AHBCMDERRID_MASK) >> FLEXSPI_STS1_AHBCMDERRID_SHIFT;
676     return (flexspi_ahb_error_code_t)(
677         (uint32_t)((base->STS1 & FLEXSPI_STS1_AHBCMDERRCODE_MASK) >> FLEXSPI_STS1_AHBCMDERRCODE_SHIFT));
678 }
679 
680 /*! @brief Returns whether the bus is idle.
681  *
682  * @param base FLEXSPI peripheral base address.
683  * @retval true Bus is idle.
684  * @retval false Bus is busy.
685  */
FLEXSPI_GetBusIdleStatus(FLEXSPI_Type * base)686 static inline bool FLEXSPI_GetBusIdleStatus(FLEXSPI_Type *base)
687 {
688     return (0U != (base->STS0 & FLEXSPI_STS0_ARBIDLE_MASK)) && (0U != (base->STS0 & FLEXSPI_STS0_SEQIDLE_MASK));
689 }
690 /*! @} */
691 
692 /*!
693  * @name Bus Operations
694  * @{
695  */
696 
697 /*! @brief Update read sample clock source
698  *
699  * @param base FLEXSPI peripheral base address.
700  * @param clockSource clockSource of type #flexspi_read_sample_clock_t
701  */
702 void FLEXSPI_UpdateRxSampleClock(FLEXSPI_Type *base, flexspi_read_sample_clock_t clockSource);
703 
704 #if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_IP_PARALLEL_MODE) && FSL_FEATURE_FLEXSPI_HAS_NO_IP_PARALLEL_MODE)
705 /*! @brief Enables/disables the FLEXSPI IP command parallel mode.
706  *
707  * @param base FLEXSPI peripheral base address.
708  * @param enable True means enable parallel mode, false means disable parallel mode.
709  */
FLEXSPI_EnableIPParallelMode(FLEXSPI_Type * base,bool enable)710 static inline void FLEXSPI_EnableIPParallelMode(FLEXSPI_Type *base, bool enable)
711 {
712     if (enable)
713     {
714         base->IPCR1 |= FLEXSPI_IPCR1_IPAREN_MASK;
715     }
716     else
717     {
718         base->IPCR1 &= ~FLEXSPI_IPCR1_IPAREN_MASK;
719     }
720 }
721 #endif
722 
723 #if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_AHB_PARALLEL_MODE) && FSL_FEATURE_FLEXSPI_HAS_NO_AHB_PARALLEL_MODE)
724 /*! @brief Enables/disables the FLEXSPI AHB command parallel mode.
725  *
726  * @param base FLEXSPI peripheral base address.
727  * @param enable True means enable parallel mode, false means disable parallel mode.
728  */
FLEXSPI_EnableAHBParallelMode(FLEXSPI_Type * base,bool enable)729 static inline void FLEXSPI_EnableAHBParallelMode(FLEXSPI_Type *base, bool enable)
730 {
731     if (enable)
732     {
733         base->AHBCR |= FLEXSPI_AHBCR_APAREN_MASK;
734     }
735     else
736     {
737         base->AHBCR &= ~FLEXSPI_AHBCR_APAREN_MASK;
738     }
739 }
740 #endif
741 
742 #if (defined(FSL_FEATURE_FLEXSPI_HAS_AHBCR_AFLASHBASE_BIT) && FSL_FEATURE_FLEXSPI_HAS_AHBCR_AFLASHBASE_BIT)
743 /*!
744  * @brief Set AHB Memory-Mapped Flash base address.
745  *
746  * @note The length of base address may be different for differnt instance, please refer to the reference manual.
747  * @note This function should be called when FLEXSPI is in stop mode.
748  *
749  * @param base FLEXSPI peripheral base address.
750  * @param address AHB Memory-Mapped Flash base address.
751  */
FLEXSPI_SetAHBFlashBaseAddress(FLEXSPI_Type * base,uint8_t address)752 static inline void FLEXSPI_SetAHBFlashBaseAddress(FLEXSPI_Type *base, uint8_t address)
753 {
754     base->AHBCR = (base->AHBCR & (~FLEXSPI_AHBCR_AFLASHBASE_MASK)) | FLEXSPI_AHBCR_AFLASHBASE(address);
755 }
756 #endif /* (defined(FSL_FEATURE_FLEXSPI_HAS_AHBCR_AFLASHBASE_BIT) && FSL_FEATURE_FLEXSPI_HAS_AHBCR_AFLASHBASE_BIT) */
757 
758 /*! @brief Updates the LUT table.
759  *
760  * @param base FLEXSPI peripheral base address.
761  * @param index From which index start to update. It could be any index of the LUT table, which
762  * also allows user to update command content inside a command. Each command consists of up to
763  * 8 instructions and occupy 4*32-bit memory.
764  * @param cmd Command sequence array.
765  * @param count Number of sequences.
766  */
767 void FLEXSPI_UpdateLUT(FLEXSPI_Type *base, uint32_t index, const uint32_t *cmd, uint32_t count);
768 
769 /*!
770  * @brief Writes data into FIFO.
771  *
772  * @param base FLEXSPI peripheral base address
773  * @param data The data bytes to send
774  * @param fifoIndex Destination fifo index.
775  */
FLEXSPI_WriteData(FLEXSPI_Type * base,uint32_t data,uint8_t fifoIndex)776 static inline void FLEXSPI_WriteData(FLEXSPI_Type *base, uint32_t data, uint8_t fifoIndex)
777 {
778     base->TFDR[fifoIndex] = data;
779 }
780 
781 /*!
782  * @brief Receives data from data FIFO.
783  *
784  * @param base FLEXSPI peripheral base address
785  * @param fifoIndex Source fifo index.
786  * @return The data in the FIFO.
787  */
FLEXSPI_ReadData(FLEXSPI_Type * base,uint8_t fifoIndex)788 static inline uint32_t FLEXSPI_ReadData(FLEXSPI_Type *base, uint8_t fifoIndex)
789 {
790     return base->RFDR[fifoIndex];
791 }
792 
793 /*!
794  * @brief Sends a buffer of data bytes using blocking method.
795  * @note This function blocks via polling until all bytes have been sent.
796  * @param base FLEXSPI peripheral base address
797  * @param buffer The data bytes to send
798  * @param size The number of data bytes to send
799  * @retval kStatus_Success write success without error
800  * @retval kStatus_FLEXSPI_SequenceExecutionTimeout sequence execution timeout
801  * @retval kStatus_FLEXSPI_IpCommandSequenceError IP command sequence error detected
802  * @retval kStatus_FLEXSPI_IpCommandGrantTimeout IP command grant timeout detected
803  */
804 status_t FLEXSPI_WriteBlocking(FLEXSPI_Type *base, uint8_t *buffer, size_t size);
805 
806 /*!
807  * @brief Receives a buffer of data bytes using a blocking method.
808  * @note This function blocks via polling until all bytes have been sent.
809  * @param base FLEXSPI peripheral base address
810  * @param buffer The data bytes to send
811  * @param size The number of data bytes to receive
812  * @retval kStatus_Success read success without error
813  * @retval kStatus_FLEXSPI_SequenceExecutionTimeout sequence execution timeout
814  * @retval kStatus_FLEXSPI_IpCommandSequenceError IP command sequencen error detected
815  * @retval kStatus_FLEXSPI_IpCommandGrantTimeout IP command grant timeout detected
816  */
817 status_t FLEXSPI_ReadBlocking(FLEXSPI_Type *base, uint8_t *buffer, size_t size);
818 
819 /*!
820  * @brief Execute command to transfer a buffer data bytes using a blocking method.
821  * @param base FLEXSPI peripheral base address
822  * @param xfer pointer to the transfer structure.
823  * @retval kStatus_Success command transfer success without error
824  * @retval kStatus_FLEXSPI_SequenceExecutionTimeout sequence execution timeout
825  * @retval kStatus_FLEXSPI_IpCommandSequenceError IP command sequence error detected
826  * @retval kStatus_FLEXSPI_IpCommandGrantTimeout IP command grant timeout detected
827  */
828 status_t FLEXSPI_TransferBlocking(FLEXSPI_Type *base, flexspi_transfer_t *xfer);
829 /*! @} */
830 
831 /*!
832  * @name Transactional
833  * @{
834  */
835 
836 /*!
837  * @brief Initializes the FLEXSPI handle which is used in transactional functions.
838  *
839  * @param base FLEXSPI peripheral base address.
840  * @param handle pointer to flexspi_handle_t structure to store the transfer state.
841  * @param callback pointer to user callback function.
842  * @param userData user parameter passed to the callback function.
843  */
844 void FLEXSPI_TransferCreateHandle(FLEXSPI_Type *base,
845                                   flexspi_handle_t *handle,
846                                   flexspi_transfer_callback_t callback,
847                                   void *userData);
848 
849 /*!
850  * @brief Performs a interrupt non-blocking transfer on the FLEXSPI bus.
851  *
852  * @note Calling the API returns immediately after transfer initiates. The user needs
853  * to call FLEXSPI_GetTransferCount to poll the transfer status to check whether
854  * the transfer is finished. If the return status is not kStatus_FLEXSPI_Busy, the transfer
855  * is finished. For FLEXSPI_Read, the dataSize should be multiple of rx watermark level, or
856  * FLEXSPI could not read data properly.
857  *
858  * @param base FLEXSPI peripheral base address.
859  * @param handle pointer to flexspi_handle_t structure which stores the transfer state.
860  * @param xfer pointer to flexspi_transfer_t structure.
861  * @retval kStatus_Success Successfully start the data transmission.
862  * @retval kStatus_FLEXSPI_Busy Previous transmission still not finished.
863  */
864 status_t FLEXSPI_TransferNonBlocking(FLEXSPI_Type *base, flexspi_handle_t *handle, flexspi_transfer_t *xfer);
865 
866 /*!
867  * @brief Gets the master transfer status during a interrupt non-blocking transfer.
868  *
869  * @param base FLEXSPI peripheral base address.
870  * @param handle pointer to flexspi_handle_t structure which stores the transfer state.
871  * @param count Number of bytes transferred so far by the non-blocking transaction.
872  * @retval kStatus_InvalidArgument count is Invalid.
873  * @retval kStatus_Success Successfully return the count.
874  */
875 status_t FLEXSPI_TransferGetCount(FLEXSPI_Type *base, flexspi_handle_t *handle, size_t *count);
876 
877 /*!
878  * @brief Aborts an interrupt non-blocking transfer early.
879  *
880  * @note This API can be called at any time when an interrupt non-blocking transfer initiates
881  * to abort the transfer early.
882  *
883  * @param base FLEXSPI peripheral base address.
884  * @param handle pointer to flexspi_handle_t structure which stores the transfer state
885  */
886 void FLEXSPI_TransferAbort(FLEXSPI_Type *base, flexspi_handle_t *handle);
887 
888 /*!
889  * @brief Master interrupt handler.
890  *
891  * @param base FLEXSPI peripheral base address.
892  * @param handle pointer to flexspi_handle_t structure.
893  */
894 void FLEXSPI_TransferHandleIRQ(FLEXSPI_Type *base, flexspi_handle_t *handle);
895 /*! @} */
896 
897 #if defined(__cplusplus)
898 }
899 #endif /*_cplusplus. */
900 /*! @} */
901 
902 #endif /* FSL_FLEXSPI_H_ */
903