fsl_flexspi_edma.h 5.9 KB

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