1 /*
2  * Copyright 2023 NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #ifndef __FSL_FLEXSPI_FOLLOWER_H_
9 #define __FSL_FLEXSPI_FOLLOWER_H_
10 
11 #include <stddef.h>
12 #include "fsl_device_registers.h"
13 #include "fsl_common.h"
14 
15 /*!
16  * @addtogroup flexspi_flr
17  * @{
18  */
19 
20 /*******************************************************************************
21  * Definitions
22  ******************************************************************************/
23 
24 /*! @name Driver version */
25 /*@{*/
26 /*! @brief FLEXSPI FOLLOWER driver version. */
27 #define FSL_FLEXSPI_SLV_DRIVER_VERSION (MAKE_VERSION(1, 0, 0))
28 /*@}*/
29 
30 #define FSL_FEATURE_FLEXSPI_SLV_AXI_RX_BUFFER_SIZE (2*1024)
31 #define FSL_FEATURE_FLEXSPI_SLV_AXI_TX_BUFFER_SIZE (1024)
32 
33 #define FLEXSPI_SLV_MAILBOX_CMD(x)     ((x) & 0xFFFFFFFE)
34 #define FLEXSPI_SLV_MAILBOX_CMD_INT(x) ((x) | 0x1)
35 
36 #define FLEXSPI_SLV_CMD_DDR(x)         (((x) << 8) | (x))
37 
38 /*! @brief IO mode enumeration of FLEXSPI FOLLOWER.*/
39 enum
40 {
41     kFLEXSPI_SLV_IOMODE_SDRx4 = 0,
42     kFLEXSPI_SLV_IOMODE_SDRx8 = 1,
43     kFLEXSPI_SLV_IOMODE_DDRx4 = 2,
44     kFLEXSPI_SLV_IOMODE_DDRx8 = 3
45 };
46 
47 /*! @brief Clock frequency enumeration of FLEXSPI FOLLOWER.*/
48 enum
49 {
50     RootClock_50M   = 50,
51     RootClock_66M   = 66,
52     RootClock_80M   = 80,
53     RootClock_100M  = 100,
54     RootClock_133M  = 133,
55     RootClock_166M  = 166,
56     RootClock_200M  = 200,
57     RootClock_400M  = 400,
58 };
59 
60 /*! @brief The read fetch size enumeration of FLEXSPI FOLLOWER.*/
61 enum
62 {
63     Read_Fetch_256Bytes   = 0,
64     Read_Fetch_512Bytes   = 1,
65     Read_Fetch_1KBytes    = 2,
66     Read_Fetch_2KBytes    = 3
67 };
68 
69 /*! @brief Clock frequency enumeration of FLEXSPI FOLLOWER.*/
70 enum
71 {
72     Write_Watermark_32Bytes   = 0,
73     Write_Watermark_64Bytes   = 1,
74     Write_Watermark_128Bytes  = 2,
75     Write_Watermark_256Bytes  = 3
76 };
77 
78 /*! @brief Interrupt status flags of FLEXSPI FOLLOWER.*/
79 enum
80 {
81     kFLEXSPI_SLV_Mail0InterruptFlag   = 0, /*!< Mailbox0 interrupt */
82     kFLEXSPI_SLV_Mail1InterruptFlag   = 1, /*!< Mailbox1 interrupt */
83     kFLEXSPI_SLV_Mail2InterruptFlag   = 2, /*!< Mailbox2 interrupt */
84     kFLEXSPI_SLV_Mail3InterruptFlag   = 3, /*!< Mailbox3 interrupt */
85     kFLEXSPI_SLV_Mail4InterruptFlag   = 4, /*!< Mailbox4 interrupt */
86     kFLEXSPI_SLV_Mail5InterruptFlag   = 5, /*!< Mailbox5 interrupt */
87     kFLEXSPI_SLV_Mail6InterruptFlag   = 6, /*!< Mailbox6 interrupt */
88     kFLEXSPI_SLV_Mail7InterruptFlag   = 7, /*!< Mailbox7 interrupt */
89     kFLEXSPI_SLV_Mail8InterruptFlag   = 8, /*!< Mailbox8 interrupt */
90     kFLEXSPI_SLV_WriteOverflowFlag    = 9, /*!< An IO RX FIFO overflow occurred during
91                                                 command/address/write data phase */
92     kFLEXSPI_SLV_ReadUnderflowFlag    = 10, /*!< IO TX FIFO underflow has occurred
93                                                  during a read command */
94     kFLEXSPI_SLV_ErrorCommandFlag     = 11, /*!< An unknown command has been received
95                                                  from the SPI bus */
96     kFLEXSPI_SLV_InvalidInterruptFlag = 12,
97 };
98 
99 /*! @brief FLEXSPI FOLLOWER configuration structure. */
100 typedef struct _flexspi_slv_config
101 {
102     int         clock_freq;
103     uint32_t    baseAddr1;    /*!< Read/Write CMD1 Base Address. */
104     uint32_t    baseAddr2;    /*!< Read/Write CMD2 Base Address. */
105     uint32_t    addrRange1;   /*!< Read/Write CMD1 Addr Range. */
106     uint32_t    addrRange2;   /*!< Read/Write CMD2 Addr Range. */
107     uint8_t     io_mode;      /*!< IO mode control - SDRx4, SDRx8, DDRx4, DDRx8*/
108     uint8_t     rxFetch_size; /*!< Specifies the maximum read size triggered by a single read command. */
109     uint8_t     rxWatermark;  /*!< Triggers a new AXI read to fetch more data through the IP AXI header. */
110     uint8_t     txWatermark;  /*!< Specifies the watermark value. During the write command, if pending
111                                 write data equals or exceeds the watermark level, it triggers a new AXI write. */
112 } flexspi_slv_config_t;
113 
114 /* Forward declaration of the handle typedef. */
115 typedef struct _flexspi_slv_handle flexspi_slv_handle_t;
116 
117 /*! @brief FLEXSPI FOLLOWER interrupt callback function. */
118 typedef void (*flexspi_slv_interrupt_callback_t)(FLEXSPI_SLV_Type *base,
119                                             flexspi_slv_handle_t *handle);
120 
121 /*! @brief Interrupt handle structure for FLEXSPI FOLLOWER. */
122 struct _flexspi_slv_handle
123 {
124     uint32_t state;                            /*!< Interrupt state for FLEXSPI FOLLOWER */
125     flexspi_slv_interrupt_callback_t callback; /*!< Callback for users while mailbox received or error occurred */
126     void *userData;                            /*!< FLEXSPI FOLLOWER callback function parameter.*/
127 };
128 
129 /*******************************************************************************
130  * API
131  ******************************************************************************/
132 
133 #if defined(__cplusplus)
134 extern "C" {
135 #endif /*_cplusplus. */
136 
137 /*!
138  * @name Initialization and deinitialization
139  * @{
140  */
141 
142 /*!
143  * @brief Get the instance number for FLEXSPI FOLLOWER.
144  *
145  * @param base FLEXSPI FOLLOWER base pointer.
146  */
147 uint32_t FLEXSPI_SLV_GetInstance(FLEXSPI_SLV_Type *base);
148 
149 /*!
150  * @brief Check and clear interrupt flags.
151  *
152  * @param base FLEXSPI FOLLOWER base pointer.
153  * @return Interrupt flag.
154  */
155 uint32_t FLEXSPI_SLV_CheckAndClearInterrupt(FLEXSPI_SLV_Type *base);
156 
157 /*!
158  * @brief Initializes the FLEXSPI FOLLOWER module and internal state.
159  *
160  * This function enables the clock for FLEXSPI FOLLOWER and also configures the FLEXSPI FOLLOWER
161  * with the input configure parameters. Users should call this function before any FLEXSPI
162  * FOLLOWER operations.
163  *
164  * @param base FLEXSPI FOLLOWER peripheral base address.
165  * @param config FLEXSPI FOLLOWER configure structure.
166  */
167 void FLEXSPI_SLV_Init(FLEXSPI_SLV_Type *base, const flexspi_slv_config_t *config);
168 
169 /*!
170  * @brief Gets default settings for FLEXSPI FOLLOWER.
171  *
172  * @param config FLEXSPI FOLLOWER configuration structure.
173  */
174 void FLEXSPI_SLV_GetDefaultConfig(flexspi_slv_config_t *config);
175 
176 /*!
177  * @brief Deinitializes the FLEXSPI FOLLOWER module.
178  *
179  * Clears the FLEXSPI FOLLOWER state and FLEXSPI FOLLOWER module registers.
180  * @param base FLEXSPI FOLLOWER peripheral base address.
181  */
182 void FLEXSPI_SLV_Deinit(FLEXSPI_SLV_Type *base);
183 
184 /*!
185  * @brief Software reset for the FLEXSPI FOLLOWER logic.
186  *
187  * This function sets the software reset flags for the FLEXSPI FOLLOWER.
188  *
189  * @param base FLEXSPI FOLLOWER peripheral base address.
190  * @param val 0(Finished) or 1(Initiate)
191  */
FLEXSPI_SLV_SoftwareReset_SetVal(FLEXSPI_SLV_Type * base,uint32_t val)192 static inline void FLEXSPI_SLV_SoftwareReset_SetVal(FLEXSPI_SLV_Type *base, uint32_t val)
193 {
194     base->MODULE_CONTROL &= ~FLEXSPI_SLV_MODULE_CONTROL_SWRESET_MASK;
195     base->MODULE_CONTROL |= FLEXSPI_SLV_MODULE_CONTROL_SWRESET(val);
196 }
197 
198 /*!
199  * @brief Set IO mode for the FLEXSPI FOLLOWER module.
200  *
201  * This function sets the IO mode flags for the FLEXSPI FOLLOWER.
202  *
203  * @param base FLEXSPI FOLLOWER peripheral base address.
204  * @param val Set IO Mode for FLEXSPI FOLLOWER
205  */
FLEXSPI_SLV_IOMode_SetVal(FLEXSPI_SLV_Type * base,uint32_t val)206 static inline void FLEXSPI_SLV_IOMode_SetVal(FLEXSPI_SLV_Type *base, uint32_t val)
207 {
208     base->MODULE_CONTROL &= ~FLEXSPI_SLV_MODULE_CONTROL_IOMODE_MASK;
209     base->MODULE_CONTROL |= FLEXSPI_SLV_MODULE_CONTROL_IOMODE(val);
210 }
211 
212 /*!
213  * @brief Update RW CMD base address and range value for the FLEXSPI FOLLOWER module.
214  *
215  * This function updates RW CMD base address and range value for the FLEXSPI FOLLOWER.
216  *
217  * @param base FLEXSPI FOLLOWER peripheral base address.
218  */
FLEXSPI_SLV_Update_RWCMD_Base_Range(FLEXSPI_SLV_Type * base)219 static inline void FLEXSPI_SLV_Update_RWCMD_Base_Range(FLEXSPI_SLV_Type *base)
220 {
221     base->MODULE_CONTROL |= FLEXSPI_SLV_MODULE_CONTROL_CMDRANGEBASEUPDATE_MASK;
222 }
223 
224 /*!
225  * @brief Set RW command base address1 for the FLEXSPI FOLLOWER module.
226  *
227  * This function sets the RW command base address1 for the FLEXSPI FOLLOWER.
228  *
229  * @param base FLEXSPI FOLLOWER peripheral base address.
230  * @param val The high 16-bit base address of the RW command
231  */
FLEXSPI_SLV_RW_CMD_BaseAddr1_SetVal(FLEXSPI_SLV_Type * base,uint32_t val)232 static inline void FLEXSPI_SLV_RW_CMD_BaseAddr1_SetVal(FLEXSPI_SLV_Type *base, uint32_t val)
233 {
234     base->RW_COMMAND_BASE &= ~FLEXSPI_SLV_RW_COMMAND_BASE_ADDRBASE1_MASK;
235     base->RW_COMMAND_BASE |= FLEXSPI_SLV_RW_COMMAND_BASE_ADDRBASE1(val);
236 }
237 
238 /*!
239  * @brief Set RW command base address2 for the FLEXSPI FOLLOWER module.
240  *
241  * This function sets the RW command base address2 for the FLEXSPI FOLLOWER.
242  *
243  * @param base FLEXSPI FOLLOWER peripheral base address.
244  * @param val The high 16-bit base address of the RW command
245  */
FLEXSPI_SLV_RW_CMD_BaseAddr2_SetVal(FLEXSPI_SLV_Type * base,uint32_t val)246 static inline void FLEXSPI_SLV_RW_CMD_BaseAddr2_SetVal(FLEXSPI_SLV_Type *base, uint32_t val)
247 {
248     base->RW_COMMAND_BASE &= ~FLEXSPI_SLV_RW_COMMAND_BASE_ADDRBASE2_MASK;
249     base->RW_COMMAND_BASE |= FLEXSPI_SLV_RW_COMMAND_BASE_ADDRBASE2(val);
250 }
251 
252 /*!
253  * @brief Set address1/2 range for the FLEXSPI FOLLOWER module.
254  *
255  * This function sets the address1/2 range for the FLEXSPI FOLLOWER.
256  *
257  * @param base FLEXSPI FOLLOWER peripheral base address.
258  * @param i The index of RW command, 0 or 1.
259  * @param val The size of the memory range in 1KB units.
260  */
FLEXSPI_SLV_AddrRange_SetVal(FLEXSPI_SLV_Type * base,uint32_t i,uint32_t val)261 static inline void FLEXSPI_SLV_AddrRange_SetVal(FLEXSPI_SLV_Type *base, uint32_t i, uint32_t val)
262 {
263     base->CMD_RANGE[i] = FLEXSPI_SLV_CMD_RANGE_RANGE(val);
264 }
265 
266 /*!
267  * @brief Enable or disable read water mark  for the FLEXSPI FOLLOWER module.
268  *
269  * This function enables or disables read water mark for the FLEXSPI FOLLOWER.
270  *
271  * @param base FLEXSPI FOLLOWER peripheral base address.
272  * @param val 0(Disable) or 1(Enable)
273  */
FLEXSPI_SLV_Read_WMEN_SetVal(FLEXSPI_SLV_Type * base,uint32_t val)274 static inline void FLEXSPI_SLV_Read_WMEN_SetVal(FLEXSPI_SLV_Type *base, uint32_t val)
275 {
276     base->READ_COMMAND_CONTROL &= ~FLEXSPI_SLV_READ_COMMAND_CONTROL_WMEN_MASK;
277     base->READ_COMMAND_CONTROL |= FLEXSPI_SLV_READ_COMMAND_CONTROL_WMEN(val);
278 }
279 
280 /*!
281  * @brief Set read water mark level for the FLEXSPI FOLLOWER module.
282  *
283  * This function sets read water mark level for the FLEXSPI FOLLOWER.
284  *
285  * @param base FLEXSPI FOLLOWER peripheral base address.
286  * @param val Read watermark level in bytes
287  */
FLEXSPI_SLV_Read_RDWM_SetVal(FLEXSPI_SLV_Type * base,uint32_t val)288 static inline void FLEXSPI_SLV_Read_RDWM_SetVal(FLEXSPI_SLV_Type *base, uint32_t val)
289 {
290     base->READ_COMMAND_CONTROL &= ~FLEXSPI_SLV_READ_COMMAND_CONTROL_RDWM_MASK;
291     base->READ_COMMAND_CONTROL |= FLEXSPI_SLV_READ_COMMAND_CONTROL_RDWM(val);
292 }
293 
294 /*!
295  * @brief Sets the maximum read size triggered by a single read command.
296  *
297  * This function sets the maximum read size for the FLEXSPI FOLLOWER.
298  *
299  * @param base FLEXSPI FOLLOWER peripheral base address.
300  * @param val The maximum read size
301  */
FLEXSPI_SLV_Read_FetchSizeSet(FLEXSPI_SLV_Type * base,uint32_t val)302 static inline void FLEXSPI_SLV_Read_FetchSizeSet(FLEXSPI_SLV_Type *base, uint32_t val)
303 {
304     base->READ_COMMAND_CONTROL &= ~FLEXSPI_SLV_READ_COMMAND_CONTROL_RDFETCHSIZE_MASK;
305     base->READ_COMMAND_CONTROL |= FLEXSPI_SLV_READ_COMMAND_CONTROL_RDFETCHSIZE(val);
306 }
307 
308 /*!
309  * @brief Gets the maximum read size triggered by a single read command.
310  *
311  * This function gets the maximum read size for the FLEXSPI FOLLOWER.
312  *
313  * @param base FLEXSPI FOLLOWER peripheral base address.
314  * @return The maximum read size
315  */
FLEXSPI_SLV_Read_FetchSizeGet(FLEXSPI_SLV_Type * base)316 static inline uint32_t FLEXSPI_SLV_Read_FetchSizeGet(FLEXSPI_SLV_Type *base)
317 {
318     uint32_t regBitVal = base->READ_COMMAND_CONTROL & FLEXSPI_SLV_READ_COMMAND_CONTROL_RDFETCHSIZE_MASK;
319 
320     return (regBitVal >> FLEXSPI_SLV_READ_COMMAND_CONTROL_RDFETCHSIZE_SHIFT);
321 }
322 
323 /*!
324  * @brief Set write water mark level for the FLEXSPI FOLLOWER module.
325  *
326  * This function sets write water mark level for the FLEXSPI FOLLOWER.
327  *
328  * @param base FLEXSPI FOLLOWER peripheral base address.
329  * @param val Write watermark level
330  */
FLEXSPI_SLV_Write_WRWM_SetVal(FLEXSPI_SLV_Type * base,uint32_t val)331 static inline void FLEXSPI_SLV_Write_WRWM_SetVal(FLEXSPI_SLV_Type *base, uint32_t val)
332 {
333     base->WRITE_COMMAND_CONTROL &= ~FLEXSPI_SLV_WRITE_COMMAND_CONTROL_WRWM_MASK;
334     base->WRITE_COMMAND_CONTROL |= FLEXSPI_SLV_WRITE_COMMAND_CONTROL_WRWM(val);
335 }
336 
337 /*!
338  * @brief Set CS mask value for the FLEXSPI FOLLOWER module.
339  *
340  * This function sets CS mask value for the FLEXSPI FOLLOWER.
341  *
342  * @param base FLEXSPI FOLLOWER peripheral base address.
343  * @param val 0(Not masked) or 1(Masked)
344  */
FLEXSPI_SLV_CSMASK_SetVal(FLEXSPI_SLV_Type * base,uint32_t val)345 static inline void FLEXSPI_SLV_CSMASK_SetVal(FLEXSPI_SLV_Type *base, uint32_t val)
346 {
347     base->MODULE_CONTROL &= ~FLEXSPI_SLV_MODULE_CONTROL_CSMASK_MASK;
348     base->MODULE_CONTROL |= FLEXSPI_SLV_MODULE_CONTROL_CSMASK(val);
349 }
350 /* @} */
351 
352 /*!
353  * @name Interrupts
354  * @{
355  */
356 /*!
357  * @brief Enables the FLEXSPI FOLLOWER interrupts.
358  *
359  * @param base FLEXSPI FOLLOWER peripheral base address.
360  * @param mask FLEXSPI FOLLOWER interrupt source.
361  */
FLEXSPI_SLV_EnableInterrupts(FLEXSPI_SLV_Type * base,uint32_t mask)362 static inline void FLEXSPI_SLV_EnableInterrupts(FLEXSPI_SLV_Type *base, uint32_t mask)
363 {
364     base->MODULE_INTEN |= mask;
365 }
366 
367 /*!
368  * @brief Disable the FLEXSPI FOLLOWER interrupts.
369  *
370  * @param base FLEXSPI FOLLOWER peripheral base address.
371  * @param mask FLEXSPI FOLLOWER interrupt source.
372  */
FLEXSPI_SLV_DisableInterrupts(FLEXSPI_SLV_Type * base,uint32_t mask)373 static inline void FLEXSPI_SLV_DisableInterrupts(FLEXSPI_SLV_Type *base, uint32_t mask)
374 {
375     base->MODULE_INTEN &= ~mask;
376 }
377 
378 /*!
379  * @brief Get the FLEXSPI FOLLOWER enabled interrupts.
380  *
381  * @param base FLEXSPI FOLLOWER peripheral base address.
382  */
FLEXSPI_SLV_GetEnabledInterrupts(FLEXSPI_SLV_Type * base)383 static inline uint32_t FLEXSPI_SLV_GetEnabledInterrupts(FLEXSPI_SLV_Type *base)
384 {
385     return (base->MODULE_INTEN);
386 }
387 
388 /*!
389  * @brief Enable the FLEXSPI FOLLOWER mailbox interrupts.
390  *
391  * @param base FLEXSPI FOLLOWER peripheral base address.
392  * @param enable Whether enable the mailbox interrupt.
393  */
FLEXSPI_SLV_EnableMailInterrupt(FLEXSPI_SLV_Type * base,bool enable)394 static inline void FLEXSPI_SLV_EnableMailInterrupt(FLEXSPI_SLV_Type *base, bool enable)
395 {
396     base->SPI_MAIL_CTRL = FLEXSPI_SLV_SPI_MAIL_CTRL_SPIINTEN(enable ? 1 : 0);
397 }
398 
399 /*!
400  * @brief Return whether the FLEXSPI FOLLOWER enables the mailbox interrupt.
401  *
402  * @param base FLEXSPI FOLLOWER peripheral base address.
403  */
FLEXSPI_SLV_GetEnabledMailInterrupt(FLEXSPI_SLV_Type * base)404 static inline bool FLEXSPI_SLV_GetEnabledMailInterrupt(FLEXSPI_SLV_Type *base)
405 {
406     return ((base->SPI_MAIL_CTRL & FLEXSPI_SLV_SPI_MAIL_CTRL_SPIINTEN_MASK) ? true : false);
407 }
408 /* @} */
409 
410 /*!
411  * @brief Gets the SPI leader read/write out-of-allowed-range count.
412  *
413  * @param base FLEXSPI FOLLOWER peripheral base address.
414  * @param[out] rdCount Pointer through which the current number in the read out-of-allowed-range counter is returned.
415  *      Pass NULL if this value is not required.
416  * @param[out] wrCount Pointer through which the current number in the write out-of-allowed-range counter is returned
417  *      Pass NULL if this value is not required.
418  */
FLEXSPI_SLV_GetOutOfRangeCounts(FLEXSPI_SLV_Type * base,size_t * rdCount,size_t * wrCount)419 static inline void FLEXSPI_SLV_GetOutOfRangeCounts(FLEXSPI_SLV_Type *base, size_t *rdCount, size_t *wrCount)
420 {
421     if (NULL != rdCount)
422     {
423         *rdCount = ((base->MODULE_STATUS) & FLEXSPI_SLV_MODULE_STATUS_RDOFR_MASK) >> FLEXSPI_SLV_MODULE_STATUS_RDOFR_SHIFT;
424     }
425     if (NULL != wrCount)
426     {
427         *wrCount = ((base->MODULE_STATUS) & FLEXSPI_SLV_MODULE_STATUS_WROFR_MASK) >> FLEXSPI_SLV_MODULE_STATUS_WROFR_SHIFT;
428     }
429 }
430 
431 /*!
432  * @name Status
433  * @{
434  */
435 /*!
436  * @brief Get the FLEXSPI FOLLOWER interrupt status flags.
437  *
438  * @param base FLEXSPI FOLLOWER peripheral base address.
439  * @retval Interrupt status flag, use status flag to AND the bit mask could get the related status.
440  */
FLEXSPI_SLV_GetInterruptStatusFlags(FLEXSPI_SLV_Type * base)441 static inline uint32_t FLEXSPI_SLV_GetInterruptStatusFlags(FLEXSPI_SLV_Type *base)
442 {
443     return (base->MODULE_INT);
444 }
445 
446 /*!
447  * @brief Get the FLEXSPI FOLLOWER mailbox interrupt register.
448  *
449  * @param base FLEXSPI FOLLOWER peripheral base address.
450  * @return Return the index of the FLEXSPI FOLLOWER mail interrupt register
451  */
FLEXSPI_SLV_GetMailInterruptIndex(FLEXSPI_SLV_Type * base)452 static inline uint32_t FLEXSPI_SLV_GetMailInterruptIndex(FLEXSPI_SLV_Type *base)
453 {
454     uint32_t index;
455 
456     for (index = 0; index < FLEXSPI_SLV_SPIMAIL_COUNT; index++)
457     {
458         if (base->SPIMAIL[index] & 0x1U)
459         {
460             break;
461         }
462     }
463     return index;
464 }
465 
466 /*!
467  * @brief Get the FLEXSPI FOLLOWER mailbox data.
468  *
469  * @param base FLEXSPI FOLLOWER peripheral base address.
470  * @param index The index of the mail interrupt register
471  * @return Return the FLEXSPI FOLLOWER mailbox data
472  */
FLEXSPI_SLV_GetMailboxData(FLEXSPI_SLV_Type * base,uint32_t index)473 static inline uint32_t FLEXSPI_SLV_GetMailboxData(FLEXSPI_SLV_Type *base, uint32_t index)
474 {
475     return ((index < FLEXSPI_SLV_SPIMAIL_COUNT) ? base->SPIMAIL[index] : 0U);
476 }
477 
478 /*!
479  * @brief Clear the FLEXSPI FOLLOWER interrupt status flags.
480  *
481  * @param base FLEXSPI FOLLOWER peripheral base address.
482  * @param mask FLEXSPI FOLLOWER interrupt source.
483  */
FLEXSPI_SLV_ClearInterruptStatusFlags(FLEXSPI_SLV_Type * base,uint32_t mask)484 static inline void FLEXSPI_SLV_ClearInterruptStatusFlags(FLEXSPI_SLV_Type *base, uint32_t mask)
485 {
486     base->MODULE_INT |= mask;
487 }
488 
489 /*!
490  * @brief Clear the FLEXSPI FOLLOWER mailbox interrupt flag.
491  *
492  * @param base FLEXSPI FOLLOWER peripheral base address.
493  */
FLEXSPI_SLV_ClearMailInterruptFlag(FLEXSPI_SLV_Type * base)494 static inline void FLEXSPI_SLV_ClearMailInterruptFlag(FLEXSPI_SLV_Type *base)
495 {
496     base->SPI_MAIL_CTRL |= FLEXSPI_SLV_SPI_MAIL_CTRL_CLRINT_MASK;
497 }
498 
499 /*! @brief Returns whether the current AXI write leader is busy with a write command.
500  *
501  * @param base FLEXSPI FOLLOWER peripheral base address.
502  * @retval true The current AXI write leader is busy.
503  * @retval false The current AXI write leader is not busy.
504  */
FLEXSPI_SLV_GetAXIWriteBusyStatus(FLEXSPI_SLV_Type * base)505 static inline bool FLEXSPI_SLV_GetAXIWriteBusyStatus(FLEXSPI_SLV_Type *base)
506 {
507     return ((base->MODULE_STATUS & FLEXSPI_SLV_MODULE_STATUS_WIP_MASK) ? true : false);
508 }
509 
510 /*! @brief Returns whether the AXI read leader is busy with a read request or else idle with no pending
511  *         AXI read request.
512  *
513  * @param base FLEXSPI FOLLOWER peripheral base address.
514  * @retval true The current AXI read leader is idle.
515  * @retval false The current AXI read leader is busy.
516  */
FLEXSPI_SLV_GetAXIReadIdleStatus(FLEXSPI_SLV_Type * base)517 static inline bool FLEXSPI_SLV_GetAXIReadIdleStatus(FLEXSPI_SLV_Type *base)
518 {
519     return ((base->MODULE_STATUS & FLEXSPI_SLV_MODULE_STATUS_AXIREADIDLE_MASK) ? true : false);
520 }
521 
522 /*! @brief Returns whether the SPI to read/write register queue is idle.
523  *
524  * @param base FLEXSPI FOLLOWER peripheral base address.
525  * @retval true The SPI to read/write register queue is idle.
526  * @retval false The SPI to read/write register queue is busy.
527  */
FLEXSPI_SLV_GetRegReadWriteIdleStatus(FLEXSPI_SLV_Type * base)528 static inline bool FLEXSPI_SLV_GetRegReadWriteIdleStatus(FLEXSPI_SLV_Type *base)
529 {
530     return ((base->MODULE_STATUS & FLEXSPI_SLV_MODULE_STATUS_REGRWIDLE_MASK) ? true : false);
531 }
532 
533 /*! @brief Returns whether the SEQ control logic is idle or else busy with an ongoing SPI request.
534  *
535  * @param base FLEXSPI FOLLOWER peripheral base address.
536  * @retval true The SEQ control logic is idle.
537  * @retval false The SEQ control logic is busy.
538  */
FLEXSPI_SLV_GetSEQIdleStatus(FLEXSPI_SLV_Type * base)539 static inline bool FLEXSPI_SLV_GetSEQIdleStatus(FLEXSPI_SLV_Type *base)
540 {
541     return ((base->MODULE_STATUS & FLEXSPI_SLV_MODULE_STATUS_SEQIDLE_MASK) ? true : false);
542 }
543 
544 /*! @brief Returns whether the FLEXSPI FOLLOWER module is busy.
545  *
546  * @param base FLEXSPI FOLLOWER peripheral base address.
547  * @retval true The SEQ control logic is busy.
548  * @retval false The SEQ control logic is idle.
549  */
FLEXSPI_SLV_GetModuleBusyStatus(FLEXSPI_SLV_Type * base)550 static inline bool FLEXSPI_SLV_GetModuleBusyStatus(FLEXSPI_SLV_Type *base)
551 {
552     uint32_t statusMasks = 0, idleFlags = 0;
553 
554     statusMasks = FLEXSPI_SLV_MODULE_STATUS_WIP_MASK |
555                   FLEXSPI_SLV_MODULE_STATUS_AXIREADIDLE_MASK |
556                   FLEXSPI_SLV_MODULE_STATUS_REGRWIDLE_MASK |
557                   FLEXSPI_SLV_MODULE_STATUS_SEQIDLE_MASK;
558 
559     idleFlags = FLEXSPI_SLV_MODULE_STATUS_WIP(0) |
560                 FLEXSPI_SLV_MODULE_STATUS_AXIREADIDLE(1) |
561                 FLEXSPI_SLV_MODULE_STATUS_REGRWIDLE(1) |
562                 FLEXSPI_SLV_MODULE_STATUS_SEQIDLE(1);
563 
564     return (((base->MODULE_STATUS & statusMasks) != idleFlags) ? true : false);
565 }
566 /*@}*/
567 
568 /*!
569  * @name Bus Operations
570  * @{
571  */
572 
573 /*!
574  * @brief Sets the read memory command.
575  *
576  * @param base FLEXSPI FOLLOWER peripheral base address
577  * @param i The read command setting register index
578  * @param val The read command value.
579  */
FLEXSPI_SLV_Read_CommandSet(FLEXSPI_SLV_Type * base,uint32_t i,uint32_t val)580 static inline void FLEXSPI_SLV_Read_CommandSet(FLEXSPI_SLV_Type *base, uint32_t i, uint32_t val)
581 {
582     base->READ_COMMAND[i] &= ~FLEXSPI_SLV_READ_COMMAND_COMMANDSET_MASK;
583     base->READ_COMMAND[i] |= FLEXSPI_SLV_READ_COMMAND_COMMANDSET(val);
584 }
585 
586 /*!
587  * @brief Gets the read memory command.
588  *
589  * @param base FLEXSPI FOLLOWER peripheral base address
590  * @param i The read command setting register index
591  */
FLEXSPI_SLV_Read_CommandGet(FLEXSPI_SLV_Type * base,uint32_t i)592 static inline uint32_t FLEXSPI_SLV_Read_CommandGet(FLEXSPI_SLV_Type *base, uint32_t i)
593 {
594     uint32_t regBitVal = base->READ_COMMAND[i] & FLEXSPI_SLV_READ_COMMAND_COMMANDSET_MASK;
595 
596     return (regBitVal >> FLEXSPI_SLV_READ_COMMAND_COMMANDSET_SHIFT);
597 }
598 
599 /*!
600  * @brief Sets the dummy cycle for the read memory command.
601  *
602  * @param base FLEXSPI FOLLOWER peripheral base address
603  * @param i The read command dummy cycle setting register index
604  * @param val The dummy cycle value of the read command.
605  */
FLEXSPI_SLV_Read_Command_DummyCyclesSet(FLEXSPI_SLV_Type * base,uint32_t i,uint32_t val)606 static inline void FLEXSPI_SLV_Read_Command_DummyCyclesSet(FLEXSPI_SLV_Type *base, uint32_t i, uint32_t val)
607 {
608     base->READ_COMMAND[i] &= ~FLEXSPI_SLV_READ_COMMAND_DUMMYCYCLES_MASK;
609     base->READ_COMMAND[i] |= FLEXSPI_SLV_READ_COMMAND_DUMMYCYCLES(val);
610 }
611 
612 /*!
613  * @brief Gets the dummy cycle for the read memory command.
614  *
615  * @param base FLEXSPI FOLLOWER peripheral base address
616  * @param i The read command dummy cycle setting register index
617  */
FLEXSPI_SLV_Read_Command_DummyCyclesGet(FLEXSPI_SLV_Type * base,uint32_t i)618 static inline uint32_t FLEXSPI_SLV_Read_Command_DummyCyclesGet(FLEXSPI_SLV_Type *base, uint32_t i)
619 {
620     uint32_t regBitVal = base->READ_COMMAND[i] & FLEXSPI_SLV_READ_COMMAND_DUMMYCYCLES_MASK;
621 
622     return (regBitVal >> FLEXSPI_SLV_READ_COMMAND_DUMMYCYCLES_SHIFT);
623 }
624 
625 /*!
626  * @brief Sets the write memory command.
627  *
628  * @param base FLEXSPI FOLLOWER peripheral base address
629  * @param i The write command setting register index
630  * @param val The write command value.
631  */
FLEXSPI_SLV_Write_CommandSet(FLEXSPI_SLV_Type * base,uint32_t i,uint32_t val)632 static inline void FLEXSPI_SLV_Write_CommandSet(FLEXSPI_SLV_Type *base, uint32_t i, uint32_t val)
633 {
634     base->WRITE_COMMAND[i] &= ~FLEXSPI_SLV_WRITE_COMMAND_COMMANDSET_MASK;
635     base->WRITE_COMMAND[i] |= FLEXSPI_SLV_WRITE_COMMAND_COMMANDSET(val);
636 }
637 
638 /*!
639  * @brief Sets the read register command.
640  *
641  * @param base FLEXSPI FOLLOWER peripheral base address
642  * @param val The read register command value.
643  */
FLEXSPI_SLV_Read_Register_CommandSet(FLEXSPI_SLV_Type * base,uint32_t val)644 static inline void FLEXSPI_SLV_Read_Register_CommandSet(FLEXSPI_SLV_Type *base, uint32_t val)
645 {
646     base->READ_REGISTER_COMMAND0 &= ~FLEXSPI_SLV_READ_REGISTER_COMMAND0_COMMANDSET_MASK;
647     base->READ_REGISTER_COMMAND0 |= FLEXSPI_SLV_READ_REGISTER_COMMAND0_COMMANDSET(val);
648 }
649 
650 /*!
651  * @brief Sets the dummy cycle for the read register command.
652  *
653  * @param base FLEXSPI FOLLOWER peripheral base address
654  * @param val The dummy cycle value of the read register command.
655  */
FLEXSPI_SLV_Read_Register_Command_DummyCyclesSet(FLEXSPI_SLV_Type * base,uint32_t val)656 static inline void FLEXSPI_SLV_Read_Register_Command_DummyCyclesSet(FLEXSPI_SLV_Type *base, uint32_t val)
657 {
658     base->READ_REGISTER_COMMAND0 &= ~FLEXSPI_SLV_READ_REGISTER_COMMAND0_DUMMYCYCLES_MASK;
659     base->READ_REGISTER_COMMAND0 |= FLEXSPI_SLV_READ_REGISTER_COMMAND0_DUMMYCYCLES(val);
660 }
661 
662 /*!
663  * @brief Sets the write register command.
664  *
665  * @param base FLEXSPI FOLLOWER peripheral base address
666  * @param val The write register command value.
667  */
FLEXSPI_SLV_Write_Register_CommandSet(FLEXSPI_SLV_Type * base,uint32_t val)668 static inline void FLEXSPI_SLV_Write_Register_CommandSet(FLEXSPI_SLV_Type *base, uint32_t val)
669 {
670     base->WRITE_REGISTER_COMMAND0 &= ~FLEXSPI_SLV_WRITE_REGISTER_COMMAND0_COMMANDSET_MASK;
671     base->WRITE_REGISTER_COMMAND0 |= FLEXSPI_SLV_WRITE_REGISTER_COMMAND0_COMMANDSET(val);
672 }
673 
674 /*! @} */
675 
676 /*!
677  * @name Transactional
678  * @{
679  */
680 
681 /*!
682  * @brief Initializes the FLEXSPI FOLLOWER handle which is used in transactional functions.
683  *
684  * @param base FLEXSPI FOLLOWER peripheral base address.
685  * @param handle Pointer to flexspi_slv_handle_t structure to store the interrupt state.
686  * @param callback Pointer to user callback function.
687  * @param userData User parameter passed to the callback function.
688  */
689 void FLEXSPI_SLV_InterruptCreateHandle(FLEXSPI_SLV_Type *base,
690                                        flexspi_slv_handle_t *handle,
691                                        flexspi_slv_interrupt_callback_t callback,
692                                        void *userData);
693 
694 /*!
695  * @brief Master interrupt handler.
696  *
697  * @param base FLEXSPI FOLLOWER peripheral base address.
698  * @param handle Pointer to flexspi_slv_handle_t structure.
699  */
700 void FLEXSPI_SLV_HandleIRQ(FLEXSPI_SLV_Type *base, flexspi_slv_handle_t *handle);
701 /*! @} */
702 
703 #if defined(__cplusplus)
704 }
705 #endif /*_cplusplus. */
706 /*@}*/
707 
708 #endif /* __FSL_FLEXSPI_FOLLOWER_H_ */
709 
710