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