1 /*
2  * Copyright 2021-2023 NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #ifndef FSL_FLEXSPI_EDMA_H_
9 #define FSL_FLEXSPI_EDMA_H_
10 
11 #include "fsl_flexspi.h"
12 #include "fsl_edma.h"
13 
14 /*!
15  * @addtogroup flexspi_edma
16  * @{
17  */
18 
19 /*******************************************************************************
20  * Definitions
21  ******************************************************************************/
22 
23 /*! @name Driver version */
24 /*! @{ */
25 /*! @brief FLEXSPI EDMA driver. */
26 #define FSL_FLEXSPI_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 0, 1))
27 /*! @} */
28 
29 typedef struct _flexspi_edma_handle flexspi_edma_handle_t;
30 
31 /*! @brief FLEXSPI eDMA transfer callback function for finish and error */
32 typedef void (*flexspi_edma_callback_t)(FLEXSPI_Type *base,
33                                         flexspi_edma_handle_t *handle,
34                                         status_t status,
35                                         void *userData);
36 
37 /*! @brief eDMA transfer configuration */
38 typedef enum _flexspi_edma_ntransfer_size
39 {
40     kFLEXPSI_EDMAnSize1Bytes  = 0x1U,  /*!< Source/Destination data transfer size is 1 byte every time */
41     kFLEXPSI_EDMAnSize2Bytes  = 0x2U,  /*!< Source/Destination data transfer size is 2 bytes every time */
42     kFLEXPSI_EDMAnSize4Bytes  = 0x4U,  /*!< Source/Destination data transfer size is 4 bytes every time */
43     kFLEXPSI_EDMAnSize8Bytes  = 0x8U,  /*!< Source/Destination data transfer size is 8 bytes every time */
44     kFLEXPSI_EDMAnSize32Bytes = 0x20U, /*!< Source/Destination data transfer size is 32 bytes every time */
45 } flexspi_edma_transfer_nsize_t;
46 
47 /*! @brief FLEXSPI DMA transfer handle, users should not touch the content of the handle.*/
48 struct _flexspi_edma_handle
49 {
50     edma_handle_t *txDmaHandle;                 /*!< eDMA handler for FLEXSPI Tx. */
51     edma_handle_t *rxDmaHandle;                 /*!< eDMA handler for FLEXSPI Rx. */
52     size_t transferSize;                        /*!< Bytes need to transfer. */
53     flexspi_edma_transfer_nsize_t nsize;        /*!< eDMA SSIZE/DSIZE in each transfer. */
54     uint8_t nbytes;                             /*!< eDMA minor byte transfer count initially configured. */
55     uint8_t count;                              /*!< The transfer data count in a DMA request. */
56     uint32_t state;                             /*!< Internal state for FLEXSPI eDMA transfer. */
57     flexspi_edma_callback_t completionCallback; /*!< A callback function called after the eDMA transfer is finished. */
58     void *userData;                             /*!< User callback parameter */
59 };
60 
61 /*******************************************************************************
62  * APIs
63  ******************************************************************************/
64 #if defined(__cplusplus)
65 extern "C" {
66 #endif
67 
68 /*!
69  * @name FLEXSPI eDMA Transactional
70  * @{
71  */
72 
73 /*!
74  * @brief Initializes the FLEXSPI handle for transfer which is used in transactional functions and set the callback.
75  *
76  * @param base FLEXSPI peripheral base address
77  * @param handle Pointer to flexspi_edma_handle_t structure
78  * @param callback FLEXSPI callback, NULL means no callback.
79  * @param userData User callback function data.
80  * @param txDmaHandle User requested DMA handle for TX DMA transfer.
81  * @param rxDmaHandle User requested DMA handle for RX DMA transfer.
82  */
83 void FLEXSPI_TransferCreateHandleEDMA(FLEXSPI_Type *base,
84                                       flexspi_edma_handle_t *handle,
85                                       flexspi_edma_callback_t callback,
86                                       void *userData,
87                                       edma_handle_t *txDmaHandle,
88                                       edma_handle_t *rxDmaHandle);
89 
90 /*!
91  * @brief Update FLEXSPI EDMA transfer source data transfer size(SSIZE) and destination data transfer size(DSIZE).
92  *
93  * @param base FLEXSPI peripheral base address
94  * @param handle Pointer to flexspi_edma_handle_t structure
95  * @param nsize FLEXSPI DMA transfer data transfer size(SSIZE/DSIZE), by default the size is
96  * kFLEXPSI_EDMAnSize1Bytes(one byte).
97  * @see flexspi_edma_transfer_nsize_t               .
98  */
99 void FLEXSPI_TransferUpdateSizeEDMA(FLEXSPI_Type *base,
100                                     flexspi_edma_handle_t *handle,
101                                     flexspi_edma_transfer_nsize_t nsize);
102 
103 /*!
104  * @brief Transfers FLEXSPI data using an eDMA non-blocking method.
105  *
106  * This function writes/receives data to/from the FLEXSPI transmit/receive FIFO. This function is non-blocking.
107  * @param base FLEXSPI peripheral base address.
108  * @param handle Pointer to flexspi_edma_handle_t structure
109  * @param xfer FLEXSPI transfer structure.
110  * @retval kStatus_FLEXSPI_Busy     FLEXSPI is busy transfer.
111  * @retval kStatus_InvalidArgument  The watermark configuration is invalid, the watermark should be power of
112                                     2 to do successfully EDMA transfer.
113  * @retval kStatus_Success          FLEXSPI successfully start edma transfer.
114  */
115 status_t FLEXSPI_TransferEDMA(FLEXSPI_Type *base, flexspi_edma_handle_t *handle, flexspi_transfer_t *xfer);
116 
117 /*!
118  * @brief Aborts the transfer data using eDMA.
119  *
120  * This function aborts the transfer data using eDMA.
121  *
122  * @param base FLEXSPI peripheral base address.
123  * @param handle Pointer to flexspi_edma_handle_t structure
124  */
125 void FLEXSPI_TransferAbortEDMA(FLEXSPI_Type *base, flexspi_edma_handle_t *handle);
126 
127 /*!
128  * @brief Gets the transferred counts of transfer.
129  *
130  * @param base FLEXSPI peripheral base address.
131  * @param handle Pointer to flexspi_edma_handle_t structure.
132  * @param count Bytes transfer.
133  * @retval kStatus_Success Succeed get the transfer count.
134  * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress.
135  */
136 status_t FLEXSPI_TransferGetTransferCountEDMA(FLEXSPI_Type *base, flexspi_edma_handle_t *handle, size_t *count);
137 
138 /*! @} */
139 
140 #if defined(__cplusplus)
141 }
142 #endif
143 
144 /*! @} */
145 
146 #endif /* FSL_FLEXSPI_EDMA_H_ */
147