summaryrefslogtreecommitdiffstats
path: root/bsps/arm/imxrt/mcux-sdk/drivers/pdm/fsl_pdm_sdma.h
diff options
context:
space:
mode:
Diffstat (limited to 'bsps/arm/imxrt/mcux-sdk/drivers/pdm/fsl_pdm_sdma.h')
-rw-r--r--bsps/arm/imxrt/mcux-sdk/drivers/pdm/fsl_pdm_sdma.h140
1 files changed, 140 insertions, 0 deletions
diff --git a/bsps/arm/imxrt/mcux-sdk/drivers/pdm/fsl_pdm_sdma.h b/bsps/arm/imxrt/mcux-sdk/drivers/pdm/fsl_pdm_sdma.h
new file mode 100644
index 0000000000..9237341309
--- /dev/null
+++ b/bsps/arm/imxrt/mcux-sdk/drivers/pdm/fsl_pdm_sdma.h
@@ -0,0 +1,140 @@
+/*
+ * 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