fsl_flexio_spi_edma.h 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /*
  2. * Copyright (c) 2015, Freescale Semiconductor, Inc.
  3. * Copyright 2016-2020 NXP
  4. * All rights reserved.
  5. *
  6. * SPDX-License-Identifier: BSD-3-Clause
  7. */
  8. #ifndef _FSL_FLEXIO_SPI_EDMA_H_
  9. #define _FSL_FLEXIO_SPI_EDMA_H_
  10. #include "fsl_flexio_spi.h"
  11. #include "fsl_edma.h"
  12. /*!
  13. * @addtogroup flexio_edma_spi
  14. * @{
  15. */
  16. /*******************************************************************************
  17. * Definitions
  18. ******************************************************************************/
  19. /*! @name Driver version */
  20. /*@{*/
  21. /*! @brief FlexIO SPI EDMA driver version. */
  22. #define FSL_FLEXIO_SPI_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 2, 1))
  23. /*@}*/
  24. /*! @brief typedef for flexio_spi_master_edma_handle_t in advance. */
  25. typedef struct _flexio_spi_master_edma_handle flexio_spi_master_edma_handle_t;
  26. /*! @brief Slave handle is the same with master handle. */
  27. typedef flexio_spi_master_edma_handle_t flexio_spi_slave_edma_handle_t;
  28. /*! @brief FlexIO SPI master callback for finished transmit */
  29. typedef void (*flexio_spi_master_edma_transfer_callback_t)(FLEXIO_SPI_Type *base,
  30. flexio_spi_master_edma_handle_t *handle,
  31. status_t status,
  32. void *userData);
  33. /*! @brief FlexIO SPI slave callback for finished transmit */
  34. typedef void (*flexio_spi_slave_edma_transfer_callback_t)(FLEXIO_SPI_Type *base,
  35. flexio_spi_slave_edma_handle_t *handle,
  36. status_t status,
  37. void *userData);
  38. /*! @brief FlexIO SPI eDMA transfer handle, users should not touch the content of the handle.*/
  39. struct _flexio_spi_master_edma_handle
  40. {
  41. size_t transferSize; /*!< Total bytes to be transferred. */
  42. uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */
  43. bool txInProgress; /*!< Send transfer in progress */
  44. bool rxInProgress; /*!< Receive transfer in progress */
  45. edma_handle_t *txHandle; /*!< DMA handler for SPI send */
  46. edma_handle_t *rxHandle; /*!< DMA handler for SPI receive */
  47. flexio_spi_master_edma_transfer_callback_t callback; /*!< Callback for SPI DMA transfer */
  48. void *userData; /*!< User Data for SPI DMA callback */
  49. };
  50. /*******************************************************************************
  51. * APIs
  52. ******************************************************************************/
  53. #if defined(__cplusplus)
  54. extern "C" {
  55. #endif
  56. /*!
  57. * @name eDMA Transactional
  58. * @{
  59. */
  60. /*!
  61. * @brief Initializes the FlexIO SPI master eDMA handle.
  62. *
  63. * This function initializes the FlexIO SPI master eDMA handle which can be used for other FlexIO SPI master
  64. * transactional
  65. * APIs.
  66. * For a specified FlexIO SPI instance, call this API once to get the initialized handle.
  67. *
  68. * @param base Pointer to FLEXIO_SPI_Type structure.
  69. * @param handle Pointer to flexio_spi_master_edma_handle_t structure to store the transfer state.
  70. * @param callback SPI callback, NULL means no callback.
  71. * @param userData callback function parameter.
  72. * @param txHandle User requested eDMA handle for FlexIO SPI RX eDMA transfer.
  73. * @param rxHandle User requested eDMA handle for FlexIO SPI TX eDMA transfer.
  74. * @retval kStatus_Success Successfully create the handle.
  75. * @retval kStatus_OutOfRange The FlexIO SPI eDMA type/handle table out of range.
  76. */
  77. status_t FLEXIO_SPI_MasterTransferCreateHandleEDMA(FLEXIO_SPI_Type *base,
  78. flexio_spi_master_edma_handle_t *handle,
  79. flexio_spi_master_edma_transfer_callback_t callback,
  80. void *userData,
  81. edma_handle_t *txHandle,
  82. edma_handle_t *rxHandle);
  83. /*!
  84. * @brief Performs a non-blocking FlexIO SPI transfer using eDMA.
  85. *
  86. * @note This interface returns immediately after transfer initiates. Call
  87. * FLEXIO_SPI_MasterGetTransferCountEDMA to poll the transfer status and check
  88. * whether the FlexIO SPI transfer is finished.
  89. *
  90. * @param base Pointer to FLEXIO_SPI_Type structure.
  91. * @param handle Pointer to flexio_spi_master_edma_handle_t structure to store the transfer state.
  92. * @param xfer Pointer to FlexIO SPI transfer structure.
  93. * @retval kStatus_Success Successfully start a transfer.
  94. * @retval kStatus_InvalidArgument Input argument is invalid.
  95. * @retval kStatus_FLEXIO_SPI_Busy FlexIO SPI is not idle, is running another transfer.
  96. */
  97. status_t FLEXIO_SPI_MasterTransferEDMA(FLEXIO_SPI_Type *base,
  98. flexio_spi_master_edma_handle_t *handle,
  99. flexio_spi_transfer_t *xfer);
  100. /*!
  101. * @brief Aborts a FlexIO SPI transfer using eDMA.
  102. *
  103. * @param base Pointer to FLEXIO_SPI_Type structure.
  104. * @param handle FlexIO SPI eDMA handle pointer.
  105. */
  106. void FLEXIO_SPI_MasterTransferAbortEDMA(FLEXIO_SPI_Type *base, flexio_spi_master_edma_handle_t *handle);
  107. /*!
  108. * @brief Gets the number of bytes transferred so far using FlexIO SPI master eDMA.
  109. *
  110. * @param base Pointer to FLEXIO_SPI_Type structure.
  111. * @param handle FlexIO SPI eDMA handle pointer.
  112. * @param count Number of bytes transferred so far by the non-blocking transaction.
  113. */
  114. status_t FLEXIO_SPI_MasterTransferGetCountEDMA(FLEXIO_SPI_Type *base,
  115. flexio_spi_master_edma_handle_t *handle,
  116. size_t *count);
  117. /*!
  118. * @brief Initializes the FlexIO SPI slave eDMA handle.
  119. *
  120. * This function initializes the FlexIO SPI slave eDMA handle.
  121. *
  122. * @param base Pointer to FLEXIO_SPI_Type structure.
  123. * @param handle Pointer to flexio_spi_slave_edma_handle_t structure to store the transfer state.
  124. * @param callback SPI callback, NULL means no callback.
  125. * @param userData callback function parameter.
  126. * @param txHandle User requested eDMA handle for FlexIO SPI TX eDMA transfer.
  127. * @param rxHandle User requested eDMA handle for FlexIO SPI RX eDMA transfer.
  128. */
  129. static inline void FLEXIO_SPI_SlaveTransferCreateHandleEDMA(FLEXIO_SPI_Type *base,
  130. flexio_spi_slave_edma_handle_t *handle,
  131. flexio_spi_slave_edma_transfer_callback_t callback,
  132. void *userData,
  133. edma_handle_t *txHandle,
  134. edma_handle_t *rxHandle)
  135. {
  136. (void)FLEXIO_SPI_MasterTransferCreateHandleEDMA(base, handle, callback, userData, txHandle, rxHandle);
  137. }
  138. /*!
  139. * @brief Performs a non-blocking FlexIO SPI transfer using eDMA.
  140. *
  141. * @note This interface returns immediately after transfer initiates. Call
  142. * FLEXIO_SPI_SlaveGetTransferCountEDMA to poll the transfer status and
  143. * check whether the FlexIO SPI transfer is finished.
  144. *
  145. * @param base Pointer to FLEXIO_SPI_Type structure.
  146. * @param handle Pointer to flexio_spi_slave_edma_handle_t structure to store the transfer state.
  147. * @param xfer Pointer to FlexIO SPI transfer structure.
  148. * @retval kStatus_Success Successfully start a transfer.
  149. * @retval kStatus_InvalidArgument Input argument is invalid.
  150. * @retval kStatus_FLEXIO_SPI_Busy FlexIO SPI is not idle, is running another transfer.
  151. */
  152. status_t FLEXIO_SPI_SlaveTransferEDMA(FLEXIO_SPI_Type *base,
  153. flexio_spi_slave_edma_handle_t *handle,
  154. flexio_spi_transfer_t *xfer);
  155. /*!
  156. * @brief Aborts a FlexIO SPI transfer using eDMA.
  157. *
  158. * @param base Pointer to FLEXIO_SPI_Type structure.
  159. * @param handle Pointer to flexio_spi_slave_edma_handle_t structure to store the transfer state.
  160. */
  161. static inline void FLEXIO_SPI_SlaveTransferAbortEDMA(FLEXIO_SPI_Type *base, flexio_spi_slave_edma_handle_t *handle)
  162. {
  163. FLEXIO_SPI_MasterTransferAbortEDMA(base, handle);
  164. }
  165. /*!
  166. * @brief Gets the number of bytes transferred so far using FlexIO SPI slave eDMA.
  167. *
  168. * @param base Pointer to FLEXIO_SPI_Type structure.
  169. * @param handle FlexIO SPI eDMA handle pointer.
  170. * @param count Number of bytes transferred so far by the non-blocking transaction.
  171. */
  172. static inline status_t FLEXIO_SPI_SlaveTransferGetCountEDMA(FLEXIO_SPI_Type *base,
  173. flexio_spi_slave_edma_handle_t *handle,
  174. size_t *count)
  175. {
  176. return FLEXIO_SPI_MasterTransferGetCountEDMA(base, handle, count);
  177. }
  178. /*! @} */
  179. #if defined(__cplusplus)
  180. }
  181. #endif
  182. /*!
  183. * @}
  184. */
  185. #endif