diff options
Diffstat (limited to 'bsps/arm/imxrt/mcux-sdk/drivers/asrc/fsl_asrc_edma.h')
-rw-r--r-- | bsps/arm/imxrt/mcux-sdk/drivers/asrc/fsl_asrc_edma.h | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/bsps/arm/imxrt/mcux-sdk/drivers/asrc/fsl_asrc_edma.h b/bsps/arm/imxrt/mcux-sdk/drivers/asrc/fsl_asrc_edma.h new file mode 100644 index 0000000000..89053232c8 --- /dev/null +++ b/bsps/arm/imxrt/mcux-sdk/drivers/asrc/fsl_asrc_edma.h @@ -0,0 +1,245 @@ +/* + * Copyright 2019-2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef _FSL_ASRC_P2P_EDMA_H_ +#define _FSL_ASRC_P2P_EDMA_H_ + +#include "fsl_edma.h" +#include "fsl_asrc.h" + +/*! + * @addtogroup asrc_edma_driver + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*@{*/ +#define FSL_ASRC_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 1, 0)) /*!< Version 2.1.0 */ +/*@}*/ +/*!< @brief ASRC IN edma QUEUE size */ +#define ASRC_XFER_IN_QUEUE_SIZE 4U +#define ASRC_XFER_OUT_QUEUE_SIZE (ASRC_XFER_QUEUE_SIZE * 2U) + +typedef struct _asrc_edma_handle asrc_edma_handle_t; + +/*! @brief ASRC eDMA transfer callback function for finish and error */ +typedef void (*asrc_edma_callback_t)(ASRC_Type *base, asrc_edma_handle_t *handle, status_t status, void *userData); + +/*! @brief ASRC trigger peripheral function pointer */ +typedef void (*asrc_start_peripheral_t)(bool start); +/*! @brief destination peripheral configuration */ +typedef struct _asrc_p2p_edma_config +{ + uint8_t watermark; /*!< peripheral watermark */ + uint8_t channel; /*!< peripheral channel number */ + asrc_start_peripheral_t startPeripheral; /*!< trigger peripheral start */ +} asrc_p2p_edma_config_t; + +/*!@ brief asrc in edma handler */ +typedef struct _asrc_in_edma_handle +{ + edma_handle_t *inDmaHandle; /*!< DMA handler for ASRC in */ + + uint8_t tcd[(ASRC_XFER_IN_QUEUE_SIZE + 1U) * sizeof(edma_tcd_t)]; /*!< TCD pool for eDMA send. */ + + uint32_t sampleWidth; /*!< input data width */ + uint32_t fifoThreshold; /*!< ASRC input fifo threshold */ + uint32_t *asrcQueue[ASRC_XFER_IN_QUEUE_SIZE]; /*!< Transfer queue storing queued transfer. */ + size_t transferSize[ASRC_XFER_IN_QUEUE_SIZE]; /*!< Data bytes need to transfer */ + volatile uint8_t queueUser; /*!< Index for user to queue transfer. */ + volatile uint8_t queueDriver; /*!< Index for driver to get the transfer data and size */ + uint32_t state; /*!< Internal state for ASRC eDMA transfer */ + + const asrc_p2p_edma_config_t *peripheralConfig; /*!< peripheral configuration pointer */ +} asrc_in_edma_handle_t; + +/*!@ brief asrc out edma handler */ +typedef struct _asrc_out_edma_handle +{ + edma_handle_t *outDmaHandle; /*!< DMA handler for ASRC out */ + + uint8_t tcd[(ASRC_XFER_OUT_QUEUE_SIZE + 1U) * sizeof(edma_tcd_t)]; /*!< TCD pool for eDMA send. */ + + uint32_t sampleWidth; /*!< output data width */ + uint32_t fifoThreshold; /*!< ASRC output fifo threshold */ + uint32_t *asrcQueue[ASRC_XFER_OUT_QUEUE_SIZE]; /*!< Transfer queue storing queued transfer. */ + size_t transferSize[ASRC_XFER_OUT_QUEUE_SIZE]; /*!< Data bytes need to transfer */ + volatile uint8_t queueUser; /*!< Index for user to queue transfer. */ + volatile uint8_t queueDriver; /*!< Index for driver to get the transfer data and size */ + uint32_t state; /*!< Internal state for ASRC eDMA transfer */ + const asrc_p2p_edma_config_t *peripheralConfig; /*!< peripheral configuration pointer */ +} asrc_out_edma_handle_t; + +/*! @brief ASRC DMA transfer handle.*/ +struct _asrc_edma_handle +{ + asrc_in_edma_handle_t in; /*!< asrc in handler */ + asrc_out_edma_handle_t out; /*!< asrc out handler */ + asrc_channel_pair_t channelPair; /*!< channel pair */ + void *userData; /*!< User callback parameter */ + asrc_edma_callback_t callback; /*!< Callback for users while transfer finish or error occurs */ +}; + +/******************************************************************************* + * APIs + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name eDMA Transactional + * @{ + */ + +/*! + * @brief Initializes the ASRC IN eDMA handle. + * + * This function initializes the ASRC DMA handle, which can be used for other ASRC transactional APIs. + * Usually, for a specified ASRC channel pair, call this API once to get the initialized handle. + * + * @param base ASRC base pointer. + * @param channelPair ASRC channel pair + * @param handle ASRC eDMA handle pointer. + * @param callback Pointer to user callback function. + * @param inDmaHandle DMA handler for ASRC in. + * @param periphConfig peripheral configuration. + * @param userData User parameter passed to the callback function. + */ +void ASRC_TransferInCreateHandleEDMA(ASRC_Type *base, + asrc_edma_handle_t *handle, + asrc_channel_pair_t channelPair, + asrc_edma_callback_t callback, + edma_handle_t *inDmaHandle, + const asrc_p2p_edma_config_t *periphConfig, + void *userData); + +/*! + * @brief Initializes the ASRC OUT eDMA handle. + * + * This function initializes the ASRC DMA handle, which can be used for other ASRC transactional APIs. + * Usually, for a specified ASRC channel pair, call this API once to get the initialized handle. + * + * @param base ASRC base pointer. + * @param channelPair ASRC channel pair + * @param handle ASRC eDMA handle pointer. + * @param callback Pointer to user callback function. + * @param outDmaHandle DMA handler for ASRC out. + * @param periphConfig peripheral configuration. + * @param userData User parameter passed to the callback function. + */ +void ASRC_TransferOutCreateHandleEDMA(ASRC_Type *base, + asrc_edma_handle_t *handle, + asrc_channel_pair_t channelPair, + asrc_edma_callback_t callback, + edma_handle_t *outDmaHandle, + const asrc_p2p_edma_config_t *periphConfig, + void *userData); + +/*! + * @brief Configures the ASRC P2P channel pair. + * + * + * @param base ASRC base pointer. + * @param handle ASRC eDMA handle pointer. + * @param asrcConfig asrc configurations. + * @param inSampleRate ASRC input sample rate. + * @param outSampleRate ASRC output sample rate. + */ +status_t ASRC_TransferSetChannelPairConfigEDMA(ASRC_Type *base, + asrc_edma_handle_t *handle, + asrc_channel_pair_config_t *asrcConfig, + uint32_t inSampleRate, + uint32_t outSampleRate); + +/*! + * @brief Get output sample buffer size can be transferred by edma. + * + * @note This API is depends on the ASRC output configuration, should be called after the + * ASRC_TransferSetChannelPairConfigEDMA. + * + * @param base asrc base pointer. + * @param handle ASRC channel pair edma handle. + * @param inSampleRate input sample rate. + * @param outSampleRate output sample rate. + * @param inSamplesize input sampleS size. + * @retval output buffer size in byte. + */ +uint32_t ASRC_GetOutSamplesSizeEDMA( + ASRC_Type *base, asrc_edma_handle_t *handle, uint32_t inSampleRate, uint32_t outSampleRate, uint32_t inSamplesize); + +/*! + * @brief Performs a non-blocking ASRC m2m convert using EDMA. + * + * @note This interface returns immediately after the transfer initiates. + + * @param base ASRC base pointer. + * @param handle ASRC eDMA handle pointer. + * @param xfer Pointer to the DMA transfer structure. + * @retval kStatus_Success Start a ASRC eDMA send successfully. + * @retval kStatus_InvalidArgument The input argument is invalid. + * @retval kStatus_ASRCQueueFull ASRC EDMA driver queue is full. + */ +status_t ASRC_TransferEDMA(ASRC_Type *base, asrc_edma_handle_t *handle, asrc_transfer_t *xfer); + +/*! + * @brief Aborts a ASRC IN transfer using eDMA. + * + * This function only aborts the current transfer slots, the other transfer slots' information still kept + * in the handler. If users want to terminate all transfer slots, just call ASRC_TransferTerminalP2PEDMA. + * + * @param base ASRC base pointer. + * @param handle ASRC eDMA handle pointer. + */ +void ASRC_TransferInAbortEDMA(ASRC_Type *base, asrc_edma_handle_t *handle); + +/*! + * @brief Aborts a ASRC OUT transfer using eDMA. + * + * This function only aborts the current transfer slots, the other transfer slots' information still kept + * in the handler. If users want to terminate all transfer slots, just call ASRC_TransferTerminalP2PEDMA. + * + * @param base ASRC base pointer. + * @param handle ASRC eDMA handle pointer. + */ +void ASRC_TransferOutAbortEDMA(ASRC_Type *base, asrc_edma_handle_t *handle); + +/*! + * @brief Terminate In ASRC Convert. + * + * This function will clear all transfer slots buffered in the asrc queue. If users only want to abort the + * current transfer slot, please call ASRC_TransferAbortPP2PEDMA. + * + * @param base ASRC base pointer. + * @param handle ASRC eDMA handle pointer. + */ +void ASRC_TransferInTerminalEDMA(ASRC_Type *base, asrc_edma_handle_t *handle); + +/*! + * @brief Terminate Out ASRC Convert. + * + * This function will clear all transfer slots buffered in the asrc queue. If users only want to abort the + * current transfer slot, please call ASRC_TransferAbortPP2PEDMA. + * + * @param base ASRC base pointer. + * @param handle ASRC eDMA handle pointer. + */ +void ASRC_TransferOutTerminalEDMA(ASRC_Type *base, asrc_edma_handle_t *handle); + +/*! @} */ + +#if defined(__cplusplus) +} +#endif + +/*! + * @} + */ +#endif |