Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:23:01

0001 /*
0002  * Copyright (c) 2016, Freescale Semiconductor, Inc.
0003  * Copyright 2017-2020 NXP
0004  * All rights reserved.
0005  *
0006  *
0007  * SPDX-License-Identifier: BSD-3-Clause
0008  */
0009 #ifndef _FSL_SPDIF_EDMA_H_
0010 #define _FSL_SPDIF_EDMA_H_
0011 
0012 #include "fsl_spdif.h"
0013 #include "fsl_edma.h"
0014 
0015 /*!
0016  * @addtogroup spdif_edma
0017  * @{
0018  */
0019 
0020 /*******************************************************************************
0021  * Definitions
0022  ******************************************************************************/
0023 
0024 /*! @name Driver version */
0025 /*@{*/
0026 #define FSL_SPDIF_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 0, 5)) /*!< Version 2.0.5 */
0027 /*@}*/
0028 
0029 typedef struct _spdif_edma_handle spdif_edma_handle_t;
0030 
0031 /*! @brief SPDIF eDMA transfer callback function for finish and error */
0032 typedef void (*spdif_edma_callback_t)(SPDIF_Type *base, spdif_edma_handle_t *handle, status_t status, void *userData);
0033 
0034 /*! @brief SPDIF transfer structure */
0035 typedef struct _spdif_edma_transfer
0036 {
0037     uint8_t *leftData;  /*!< Data start address to transfer. */
0038     uint8_t *rightData; /*!< Data start address to transfer. */
0039     size_t dataSize;    /*!< Transfer size. */
0040 } spdif_edma_transfer_t;
0041 
0042 /*! @brief SPDIF DMA transfer handle, users should not touch the content of the handle.*/
0043 struct _spdif_edma_handle
0044 {
0045     edma_handle_t *dmaLeftHandle;                    /*!< DMA handler for SPDIF left channel */
0046     edma_handle_t *dmaRightHandle;                   /*!< DMA handler for SPDIF right channel */
0047     uint8_t nbytes;                                  /*!< eDMA minor byte transfer count initially configured. */
0048     uint8_t count;                                   /*!< The transfer data count in a DMA request */
0049     uint32_t state;                                  /*!< Internal state for SPDIF eDMA transfer */
0050     spdif_edma_callback_t callback;                  /*!< Callback for users while transfer finish or error occurs */
0051     void *userData;                                  /*!< User callback parameter */
0052     edma_tcd_t leftTcd[SPDIF_XFER_QUEUE_SIZE + 1U];  /*!< TCD pool for eDMA transfer. */
0053     edma_tcd_t rightTcd[SPDIF_XFER_QUEUE_SIZE + 1U]; /*!< TCD pool for eDMA transfer. */
0054     spdif_edma_transfer_t spdifQueue[SPDIF_XFER_QUEUE_SIZE]; /*!< Transfer queue storing queued transfer. */
0055     size_t transferSize[SPDIF_XFER_QUEUE_SIZE]; /*!< Data bytes need to transfer, left and right are the same, so use
0056                                                    one */
0057     volatile uint8_t queueUser;                 /*!< Index for user to queue transfer. */
0058     volatile uint8_t queueDriver;               /*!< Index for driver to get the transfer data and size */
0059 };
0060 
0061 /*******************************************************************************
0062  * APIs
0063  ******************************************************************************/
0064 #if defined(__cplusplus)
0065 extern "C" {
0066 #endif
0067 
0068 /*!
0069  * @name eDMA Transactional
0070  * @{
0071  */
0072 
0073 /*!
0074  * @brief Initializes the SPDIF eDMA handle.
0075  *
0076  * This function initializes the SPDIF master DMA handle, which can be used for other SPDIF master transactional APIs.
0077  * Usually, for a specified SPDIF instance, call this API once to get the initialized handle.
0078  *
0079  * @param base SPDIF base pointer.
0080  * @param handle SPDIF eDMA handle pointer.
0081  * @param base SPDIF peripheral base address.
0082  * @param callback Pointer to user callback function.
0083  * @param userData User parameter passed to the callback function.
0084  * @param dmaLeftHandle eDMA handle pointer for left channel, this handle shall be static allocated by users.
0085  * @param dmaRightHandle eDMA handle pointer for right channel, this handle shall be static allocated by users.
0086  */
0087 void SPDIF_TransferTxCreateHandleEDMA(SPDIF_Type *base,
0088                                       spdif_edma_handle_t *handle,
0089                                       spdif_edma_callback_t callback,
0090                                       void *userData,
0091                                       edma_handle_t *dmaLeftHandle,
0092                                       edma_handle_t *dmaRightHandle);
0093 
0094 /*!
0095  * @brief Initializes the SPDIF Rx eDMA handle.
0096  *
0097  * This function initializes the SPDIF slave DMA handle, which can be used for other SPDIF master transactional APIs.
0098  * Usually, for a specified SPDIF instance, call this API once to get the initialized handle.
0099  *
0100  * @param base SPDIF base pointer.
0101  * @param handle SPDIF eDMA handle pointer.
0102  * @param base SPDIF peripheral base address.
0103  * @param callback Pointer to user callback function.
0104  * @param userData User parameter passed to the callback function.
0105  * @param dmaLeftHandle eDMA handle pointer for left channel, this handle shall be static allocated by users.
0106  * @param dmaRightHandle eDMA handle pointer for right channel, this handle shall be static allocated by users.
0107  */
0108 void SPDIF_TransferRxCreateHandleEDMA(SPDIF_Type *base,
0109                                       spdif_edma_handle_t *handle,
0110                                       spdif_edma_callback_t callback,
0111                                       void *userData,
0112                                       edma_handle_t *dmaLeftHandle,
0113                                       edma_handle_t *dmaRightHandle);
0114 
0115 /*!
0116  * @brief Performs a non-blocking SPDIF transfer using DMA.
0117  *
0118  * @note This interface returns immediately after the transfer initiates. Call
0119  * SPDIF_GetTransferStatus to poll the transfer status and check whether the SPDIF transfer is finished.
0120  *
0121  * @param base SPDIF base pointer.
0122  * @param handle SPDIF eDMA handle pointer.
0123  * @param xfer Pointer to the DMA transfer structure.
0124  * @retval kStatus_Success Start a SPDIF eDMA send successfully.
0125  * @retval kStatus_InvalidArgument The input argument is invalid.
0126  * @retval kStatus_TxBusy SPDIF is busy sending data.
0127  */
0128 status_t SPDIF_TransferSendEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle, spdif_edma_transfer_t *xfer);
0129 
0130 /*!
0131  * @brief Performs a non-blocking SPDIF receive using eDMA.
0132  *
0133  * @note This interface returns immediately after the transfer initiates. Call
0134  * the SPDIF_GetReceiveRemainingBytes to poll the transfer status and check whether the SPDIF transfer is finished.
0135  *
0136  * @param base SPDIF base pointer
0137  * @param handle SPDIF eDMA handle pointer.
0138  * @param xfer Pointer to DMA transfer structure.
0139  * @retval kStatus_Success Start a SPDIF eDMA receive successfully.
0140  * @retval kStatus_InvalidArgument The input argument is invalid.
0141  * @retval kStatus_RxBusy SPDIF is busy receiving data.
0142  */
0143 status_t SPDIF_TransferReceiveEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle, spdif_edma_transfer_t *xfer);
0144 
0145 /*!
0146  * @brief Aborts a SPDIF transfer using eDMA.
0147  *
0148  * @param base SPDIF base pointer.
0149  * @param handle SPDIF eDMA handle pointer.
0150  */
0151 void SPDIF_TransferAbortSendEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle);
0152 
0153 /*!
0154  * @brief Aborts a SPDIF receive using eDMA.
0155  *
0156  * @param base SPDIF base pointer
0157  * @param handle SPDIF eDMA handle pointer.
0158  */
0159 void SPDIF_TransferAbortReceiveEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle);
0160 
0161 /*!
0162  * @brief Gets byte count sent by SPDIF.
0163  *
0164  * @param base SPDIF base pointer.
0165  * @param handle SPDIF eDMA handle pointer.
0166  * @param count Bytes count sent by SPDIF.
0167  * @retval kStatus_Success Succeed get the transfer count.
0168  * @retval kStatus_NoTransferInProgress There is no non-blocking transaction in progress.
0169  */
0170 status_t SPDIF_TransferGetSendCountEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle, size_t *count);
0171 
0172 /*!
0173  * @brief Gets byte count received by SPDIF.
0174  *
0175  * @param base SPDIF base pointer
0176  * @param handle SPDIF eDMA handle pointer.
0177  * @param count Bytes count received by SPDIF.
0178  * @retval kStatus_Success Succeed get the transfer count.
0179  * @retval kStatus_NoTransferInProgress There is no non-blocking transaction in progress.
0180  */
0181 status_t SPDIF_TransferGetReceiveCountEDMA(SPDIF_Type *base, spdif_edma_handle_t *handle, size_t *count);
0182 
0183 /*! @} */
0184 
0185 #if defined(__cplusplus)
0186 }
0187 #endif
0188 
0189 /*!
0190  * @}
0191  */
0192 #endif