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