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