123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- /*
- * Copyright (c) 2016, Freescale Semiconductor, Inc.
- * Copyright 2016-2020 NXP
- * All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- #ifndef _FSL_FLEXSPI_EDMA_H_
- #define _FSL_FLEXSPI_EDMA_H_
- #include "fsl_flexspi.h"
- #include "fsl_dmamux.h"
- #include "fsl_edma.h"
- /*!
- * @addtogroup flexspi_edma
- * @{
- */
- /*******************************************************************************
- * Definitions
- ******************************************************************************/
- /*! @name Driver version */
- /*@{*/
- /*! @brief FLEXSPI EDMA driver version 2.3.2. */
- #define FSL_FLEXSPI_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 3, 2))
- /*@}*/
- typedef struct _flexspi_edma_handle flexspi_edma_handle_t;
- /*! @brief FLEXSPI eDMA transfer callback function for finish and error */
- typedef void (*flexspi_edma_callback_t)(FLEXSPI_Type *base,
- flexspi_edma_handle_t *handle,
- status_t status,
- void *userData);
- /*! @brief eDMA transfer configuration */
- typedef enum _flexspi_edma_ntransfer_size
- {
- kFLEXPSI_EDMAnSize1Bytes = 0x1U, /*!< Source/Destination data transfer size is 1 byte every time */
- kFLEXPSI_EDMAnSize2Bytes = 0x2U, /*!< Source/Destination data transfer size is 2 bytes every time */
- kFLEXPSI_EDMAnSize4Bytes = 0x4U, /*!< Source/Destination data transfer size is 4 bytes every time */
- kFLEXPSI_EDMAnSize8Bytes = 0x8U, /*!< Source/Destination data transfer size is 8 bytes every time */
- kFLEXPSI_EDMAnSize32Bytes = 0x20U, /*!< Source/Destination data transfer size is 32 bytes every time */
- } flexspi_edma_transfer_nsize_t;
- /*! @brief FLEXSPI DMA transfer handle, users should not touch the content of the handle.*/
- struct _flexspi_edma_handle
- {
- edma_handle_t *txDmaHandle; /*!< eDMA handler for FLEXSPI Tx. */
- edma_handle_t *rxDmaHandle; /*!< eDMA handler for FLEXSPI Rx. */
- size_t transferSize; /*!< Bytes need to transfer. */
- flexspi_edma_transfer_nsize_t nsize; /*!< eDMA SSIZE/DSIZE in each transfer. */
- uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */
- uint8_t count; /*!< The transfer data count in a DMA request. */
- uint32_t state; /*!< Internal state for FLEXSPI eDMA transfer. */
- flexspi_edma_callback_t completionCallback; /*!< A callback function called after the eDMA transfer is finished. */
- void *userData; /*!< User callback parameter */
- };
- /*******************************************************************************
- * APIs
- ******************************************************************************/
- #if defined(__cplusplus)
- extern "C" {
- #endif
- /*!
- * @name FLEXSPI eDMA Transactional
- * @{
- */
- /*!
- * @brief Initializes the FLEXSPI handle for transfer which is used in transactional functions and set the callback.
- *
- * @param base FLEXSPI peripheral base address
- * @param handle Pointer to flexspi_edma_handle_t structure
- * @param callback FLEXSPI callback, NULL means no callback.
- * @param userData User callback function data.
- * @param txDmaHandle User requested DMA handle for TX DMA transfer.
- * @param rxDmaHandle User requested DMA handle for RX DMA transfer.
- */
- void FLEXSPI_TransferCreateHandleEDMA(FLEXSPI_Type *base,
- flexspi_edma_handle_t *handle,
- flexspi_edma_callback_t callback,
- void *userData,
- edma_handle_t *txDmaHandle,
- edma_handle_t *rxDmaHandle);
- /*!
- * @brief Update FLEXSPI EDMA transfer source data transfer size(SSIZE) and destination data transfer size(DSIZE).
- *
- * @param base FLEXSPI peripheral base address
- * @param handle Pointer to flexspi_edma_handle_t structure
- * @param nsize FLEXSPI DMA transfer data transfer size(SSIZE/DSIZE), by default the size is
- * kFLEXPSI_EDMAnSize1Bytes(one byte).
- * @see flexspi_edma_transfer_nsize_t .
- */
- void FLEXSPI_TransferUpdateSizeEDMA(FLEXSPI_Type *base,
- flexspi_edma_handle_t *handle,
- flexspi_edma_transfer_nsize_t nsize);
- /*!
- * @brief Transfers FLEXSPI data using an eDMA non-blocking method.
- *
- * This function writes/receives data to/from the FLEXSPI transmit/receive FIFO. This function is non-blocking.
- * @param base FLEXSPI peripheral base address.
- * @param handle Pointer to flexspi_edma_handle_t structure
- * @param xfer FLEXSPI transfer structure.
- * @retval kStatus_FLEXSPI_Busy FLEXSPI is busy transfer.
- * @retval kStatus_InvalidArgument The watermark configuration is invalid, the watermark should be power of
- 2 to do successfully EDMA transfer.
- * @retval kStatus_Success FLEXSPI successfully start edma transfer.
- */
- status_t FLEXSPI_TransferEDMA(FLEXSPI_Type *base, flexspi_edma_handle_t *handle, flexspi_transfer_t *xfer);
- /*!
- * @brief Aborts the transfer data using eDMA.
- *
- * This function aborts the transfer data using eDMA.
- *
- * @param base FLEXSPI peripheral base address.
- * @param handle Pointer to flexspi_edma_handle_t structure
- */
- void FLEXSPI_TransferAbortEDMA(FLEXSPI_Type *base, flexspi_edma_handle_t *handle);
- /*!
- * @brief Gets the transferred counts of transfer.
- *
- * @param base FLEXSPI peripheral base address.
- * @param handle Pointer to flexspi_edma_handle_t structure.
- * @param count Bytes transfer.
- * @retval kStatus_Success Succeed get the transfer count.
- * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress.
- */
- status_t FLEXSPI_TransferGetTransferCountEDMA(FLEXSPI_Type *base, flexspi_edma_handle_t *handle, size_t *count);
- /* @} */
- #if defined(__cplusplus)
- }
- #endif
- /* @} */
- #endif /* _FSL_FLEXSPI_EDMA_H_ */
|