1 /* 2 * Copyright 2016-2020 NXP 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 #ifndef _FSL_SPI_DMA_H_ 7 #define _FSL_SPI_DMA_H_ 8 9 #include "fsl_ecspi.h" 10 #include "fsl_sdma.h" 11 12 /*! 13 * @addtogroup ecspi_sdma 14 * @{ 15 */ 16 17 /******************************************************************************* 18 * Definitions 19 ******************************************************************************/ 20 /*! @name Driver version */ 21 /*@{*/ 22 /*! @brief ECSPI FreeRTOS driver version. */ 23 #define FSL_ECSPI_FREERTOS_DRIVER_VERSION (MAKE_VERSION(2, 2, 0)) 24 /*@}*/ 25 26 typedef struct _ecspi_sdma_handle ecspi_sdma_handle_t; 27 28 /*! @brief ECSPI SDMA callback called at the end of transfer. */ 29 typedef void (*ecspi_sdma_callback_t)(ECSPI_Type *base, ecspi_sdma_handle_t *handle, status_t status, void *userData); 30 31 /*! @brief ECSPI SDMA transfer handle, users should not touch the content of the handle.*/ 32 struct _ecspi_sdma_handle 33 { 34 bool txInProgress; /*!< Send transfer finished */ 35 bool rxInProgress; /*!< Receive transfer finished */ 36 sdma_handle_t *txSdmaHandle; /*!< DMA handler for ECSPI send */ 37 sdma_handle_t *rxSdmaHandle; /*!< DMA handler for ECSPI receive */ 38 ecspi_sdma_callback_t callback; /*!< Callback for ECSPI SDMA transfer */ 39 void *userData; /*!< User Data for ECSPI SDMA callback */ 40 uint32_t state; /*!< Internal state of ECSPI SDMA transfer */ 41 uint32_t ChannelTx; /*!< Channel for send handle */ 42 uint32_t ChannelRx; /*!< Channel for receive handler */ 43 }; 44 45 /******************************************************************************* 46 * APIs 47 ******************************************************************************/ 48 #if defined(__cplusplus) 49 extern "C" { 50 #endif 51 52 /*! 53 * @name DMA Transactional 54 * @{ 55 */ 56 57 /*! 58 * @brief Initialize the ECSPI master SDMA handle. 59 * 60 * This function initializes the ECSPI master SDMA handle which can be used for other SPI master transactional APIs. 61 * Usually, for a specified ECSPI instance, user need only call this API once to get the initialized handle. 62 * 63 * @param base ECSPI peripheral base address. 64 * @param handle ECSPI handle pointer. 65 * @param callback User callback function called at the end of a transfer. 66 * @param userData User data for callback. 67 * @param txHandle SDMA handle pointer for ECSPI Tx, the handle shall be static allocated by users. 68 * @param rxHandle SDMA handle pointer for ECSPI Rx, the handle shall be static allocated by users. 69 * @param eventSourceTx event source for ECSPI send, which can be found in SDMA mapping. 70 * @param eventSourceRx event source for ECSPI receive, which can be found in SDMA mapping. 71 * @param TxChannel SDMA channel for ECSPI send. 72 * @param RxChannel SDMA channel for ECSPI receive. 73 */ 74 void ECSPI_MasterTransferCreateHandleSDMA(ECSPI_Type *base, 75 ecspi_sdma_handle_t *handle, 76 ecspi_sdma_callback_t callback, 77 void *userData, 78 sdma_handle_t *txHandle, 79 sdma_handle_t *rxHandle, 80 uint32_t eventSourceTx, 81 uint32_t eventSourceRx, 82 uint32_t TxChannel, 83 uint32_t RxChannel); 84 85 /*! 86 * @brief Initialize the ECSPI Slave SDMA handle. 87 * 88 * This function initializes the ECSPI Slave SDMA handle which can be used for other SPI Slave transactional APIs. 89 * Usually, for a specified ECSPI instance, user need only call this API once to get the initialized handle. 90 * 91 * @param base ECSPI peripheral base address. 92 * @param handle ECSPI handle pointer. 93 * @param callback User callback function called at the end of a transfer. 94 * @param userData User data for callback. 95 * @param txHandle SDMA handle pointer for ECSPI Tx, the handle shall be static allocated by users. 96 * @param rxHandle SDMA handle pointer for ECSPI Rx, the handle shall be static allocated by users. 97 * @param eventSourceTx event source for ECSPI send, which can be found in SDMA mapping. 98 * @param eventSourceRx event source for ECSPI receive, which can be found in SDMA mapping. 99 * @param TxChannel SDMA channel for ECSPI send. 100 * @param RxChannel SDMA channel for ECSPI receive. 101 */ 102 void ECSPI_SlaveTransferCreateHandleSDMA(ECSPI_Type *base, 103 ecspi_sdma_handle_t *handle, 104 ecspi_sdma_callback_t callback, 105 void *userData, 106 sdma_handle_t *txHandle, 107 sdma_handle_t *rxHandle, 108 uint32_t eventSourceTx, 109 uint32_t eventSourceRx, 110 uint32_t TxChannel, 111 uint32_t RxChannel); 112 113 /*! 114 * @brief Perform a non-blocking ECSPI master transfer using SDMA. 115 * 116 * @note This interface returned immediately after transfer initiates. 117 * 118 * @param base ECSPI peripheral base address. 119 * @param handle ECSPI SDMA handle pointer. 120 * @param xfer Pointer to sdma transfer structure. 121 * @retval kStatus_Success Successfully start a transfer. 122 * @retval kStatus_InvalidArgument Input argument is invalid. 123 * @retval kStatus_ECSPI_Busy EECSPI is not idle, is running another transfer. 124 */ 125 status_t ECSPI_MasterTransferSDMA(ECSPI_Type *base, ecspi_sdma_handle_t *handle, ecspi_transfer_t *xfer); 126 127 /*! 128 * @brief Perform a non-blocking ECSPI slave transfer using SDMA. 129 * 130 * @note This interface returned immediately after transfer initiates. 131 * 132 * @param base ECSPI peripheral base address. 133 * @param handle ECSPI SDMA handle pointer. 134 * @param xfer Pointer to sdma transfer structure. 135 * @retval kStatus_Success Successfully start a transfer. 136 * @retval kStatus_InvalidArgument Input argument is invalid. 137 * @retval kStatus_ECSPI_Busy EECSPI is not idle, is running another transfer. 138 */ 139 status_t ECSPI_SlaveTransferSDMA(ECSPI_Type *base, ecspi_sdma_handle_t *handle, ecspi_transfer_t *xfer); 140 /*! 141 * @brief Abort a ECSPI master transfer using SDMA. 142 * 143 * @param base ECSPI peripheral base address. 144 * @param handle ECSPI SDMA handle pointer. 145 */ 146 void ECSPI_MasterTransferAbortSDMA(ECSPI_Type *base, ecspi_sdma_handle_t *handle); 147 /*! 148 * @brief Abort a ECSPI slave transfer using SDMA. 149 * 150 * @param base ECSPI peripheral base address. 151 * @param handle ECSPI SDMA handle pointer. 152 */ 153 void ECSPI_SlaveTransferAbortSDMA(ECSPI_Type *base, ecspi_sdma_handle_t *handle); 154 155 /*! @} */ 156 157 #if defined(__cplusplus) 158 } 159 #endif 160 161 /*! 162 * @} 163 */ 164 #endif 165