/* * Copyright (c) 2018, Freescale Semiconductor, Inc. * Copyright 2019 - 2020, NXP * All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #ifndef _FSL_PDM_SDMA_H_ #define _FSL_PDM_SDMA_H_ #include "fsl_pdm.h" #include "fsl_sdma.h" /*! * @addtogroup pdm_sdma PDM SDMA Driver * @ingroup pdm * @{ */ /******************************************************************************* * Definitions ******************************************************************************/ /*! @name Driver version */ /*@{*/ #define FSL_PDM_SDMA_DRIVER_VERSION (MAKE_VERSION(2, 7, 0)) /*!< Version 2.7.0 */ /*@}*/ typedef struct _pdm_sdma_handle pdm_sdma_handle_t; /*! @brief PDM eDMA transfer callback function for finish and error */ typedef void (*pdm_sdma_callback_t)(PDM_Type *base, pdm_sdma_handle_t *handle, status_t status, void *userData); /*! @brief PDM DMA transfer handle, users should not touch the content of the handle.*/ struct _pdm_sdma_handle { sdma_handle_t *dmaHandle; /*!< DMA handler for PDM send */ uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */ uint8_t fifoWidth; /*!< fifo width */ uint8_t endChannel; /*!< The last enabled channel */ uint8_t channelNums; /*!< total channel numbers */ uint32_t count; /*!< The transfer data count in a DMA request */ uint32_t state; /*!< Internal state for PDM eDMA transfer */ uint32_t eventSource; /*!< PDM event source number */ pdm_sdma_callback_t callback; /*!< Callback for users while transfer finish or error occurs */ void *userData; /*!< User callback parameter */ sdma_buffer_descriptor_t bdPool[PDM_XFER_QUEUE_SIZE]; /*!< BD pool for SDMA transfer. */ pdm_transfer_t pdmQueue[PDM_XFER_QUEUE_SIZE]; /*!< Transfer queue storing queued transfer. */ size_t transferSize[PDM_XFER_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 */ }; /******************************************************************************* * APIs ******************************************************************************/ #if defined(__cplusplus) extern "C" { #endif /*! * @name eDMA Transactional * @{ */ /*! * @brief Initializes the PDM eDMA handle. * * This function initializes the PDM DMA handle, which can be used for other PDM master transactional APIs. * Usually, for a specified PDM instance, call this API once to get the initialized handle. * * @param base PDM base pointer. * @param handle PDM eDMA handle pointer. * @param callback Pointer to user callback function. * @param userData User parameter passed to the callback function. * @param dmaHandle eDMA handle pointer, this handle shall be static allocated by users. * @param eventSource PDM event source number. */ void PDM_TransferCreateHandleSDMA(PDM_Type *base, pdm_sdma_handle_t *handle, pdm_sdma_callback_t callback, void *userData, sdma_handle_t *dmaHandle, uint32_t eventSource); /*! * @brief Performs a non-blocking PDM receive using eDMA. * * @note This interface returns immediately after the transfer initiates. Call * the PDM_GetReceiveRemainingBytes to poll the transfer status and check whether the PDM transfer is finished. * * @param base PDM base pointer * @param handle PDM eDMA handle pointer. * @param xfer Pointer to DMA transfer structure. * @retval kStatus_Success Start a PDM eDMA receive successfully. * @retval kStatus_InvalidArgument The input argument is invalid. * @retval kStatus_RxBusy PDM is busy receiving data. */ status_t PDM_TransferReceiveSDMA(PDM_Type *base, pdm_sdma_handle_t *handle, pdm_transfer_t *xfer); /*! * @brief Aborts a PDM receive using eDMA. * * @param base PDM base pointer * @param handle PDM eDMA handle pointer. */ void PDM_TransferAbortReceiveSDMA(PDM_Type *base, pdm_sdma_handle_t *handle); /*! * @brief PDM channel configurations. * * @param base PDM base pointer. * @param handle PDM eDMA handle pointer. * @param channel channel number. * @param config channel configurations. */ void PDM_SetChannelConfigSDMA(PDM_Type *base, pdm_sdma_handle_t *handle, uint32_t channel, const pdm_channel_config_t *config); /*! * @brief Terminate all the PDM sdma receive transfer. * * @param base PDM base pointer. * @param handle PDM SDMA handle pointer. */ void PDM_TransferTerminateReceiveSDMA(PDM_Type *base, pdm_sdma_handle_t *handle); /*! @} */ #if defined(__cplusplus) } #endif /*! * @} */ #endif