Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:22:59

0001 /*
0002  * Copyright (c) 2015, Freescale Semiconductor, Inc.
0003  * Copyright 2016-2020, 2022 NXP
0004  * All rights reserved.
0005  *
0006  * SPDX-License-Identifier: BSD-3-Clause
0007  */
0008 #ifndef _FSL_FLEXIO_SPI_EDMA_H_
0009 #define _FSL_FLEXIO_SPI_EDMA_H_
0010 
0011 #include "fsl_flexio_spi.h"
0012 #include "fsl_edma.h"
0013 
0014 /*!
0015  * @addtogroup flexio_edma_spi
0016  * @{
0017  */
0018 
0019 /*******************************************************************************
0020  * Definitions
0021  ******************************************************************************/
0022 
0023 /*! @name Driver version */
0024 /*@{*/
0025 /*! @brief FlexIO SPI EDMA driver version. */
0026 #define FSL_FLEXIO_SPI_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 3, 0))
0027 /*@}*/
0028 
0029 /*! @brief  typedef for flexio_spi_master_edma_handle_t in advance. */
0030 typedef struct _flexio_spi_master_edma_handle flexio_spi_master_edma_handle_t;
0031 
0032 /*! @brief  Slave handle is the same with master handle. */
0033 typedef flexio_spi_master_edma_handle_t flexio_spi_slave_edma_handle_t;
0034 
0035 /*! @brief FlexIO SPI master callback for finished transmit */
0036 typedef void (*flexio_spi_master_edma_transfer_callback_t)(FLEXIO_SPI_Type *base,
0037                                                            flexio_spi_master_edma_handle_t *handle,
0038                                                            status_t status,
0039                                                            void *userData);
0040 
0041 /*! @brief FlexIO SPI slave callback for finished transmit */
0042 typedef void (*flexio_spi_slave_edma_transfer_callback_t)(FLEXIO_SPI_Type *base,
0043                                                           flexio_spi_slave_edma_handle_t *handle,
0044                                                           status_t status,
0045                                                           void *userData);
0046 
0047 /*! @brief FlexIO SPI eDMA transfer handle, users should not touch the content of the handle.*/
0048 struct _flexio_spi_master_edma_handle
0049 {
0050     size_t transferSize;                                 /*!< Total bytes to be transferred. */
0051     uint8_t nbytes;                                      /*!< eDMA minor byte transfer count initially configured. */
0052     bool txInProgress;                                   /*!< Send transfer in progress */
0053     bool rxInProgress;                                   /*!< Receive transfer in progress */
0054     edma_handle_t *txHandle;                             /*!< DMA handler for SPI send */
0055     edma_handle_t *rxHandle;                             /*!< DMA handler for SPI receive */
0056     flexio_spi_master_edma_transfer_callback_t callback; /*!< Callback for SPI DMA transfer */
0057     void *userData;                                      /*!< User Data for SPI DMA callback */
0058 };
0059 
0060 /*******************************************************************************
0061  * APIs
0062  ******************************************************************************/
0063 #if defined(__cplusplus)
0064 extern "C" {
0065 #endif
0066 
0067 /*!
0068  * @name eDMA Transactional
0069  * @{
0070  */
0071 
0072 /*!
0073  * @brief Initializes the FlexIO SPI master eDMA handle.
0074  *
0075  * This function initializes the FlexIO SPI master eDMA handle which can be used for other FlexIO SPI master
0076  * transactional
0077  * APIs.
0078  * For a specified FlexIO SPI instance, call this API once to get the initialized handle.
0079  *
0080  * @param base Pointer to FLEXIO_SPI_Type structure.
0081  * @param handle Pointer to flexio_spi_master_edma_handle_t structure to store the transfer state.
0082  * @param callback SPI callback, NULL means no callback.
0083  * @param userData callback function parameter.
0084  * @param txHandle User requested eDMA handle for FlexIO SPI RX eDMA transfer.
0085  * @param rxHandle User requested eDMA handle for FlexIO SPI TX eDMA transfer.
0086  * @retval kStatus_Success Successfully create the handle.
0087  * @retval kStatus_OutOfRange The FlexIO SPI eDMA type/handle table out of range.
0088  */
0089 status_t FLEXIO_SPI_MasterTransferCreateHandleEDMA(FLEXIO_SPI_Type *base,
0090                                                    flexio_spi_master_edma_handle_t *handle,
0091                                                    flexio_spi_master_edma_transfer_callback_t callback,
0092                                                    void *userData,
0093                                                    edma_handle_t *txHandle,
0094                                                    edma_handle_t *rxHandle);
0095 
0096 /*!
0097  * @brief Performs a non-blocking FlexIO SPI transfer using eDMA.
0098  *
0099  * @note This interface returns immediately after transfer initiates. Call
0100  * FLEXIO_SPI_MasterGetTransferCountEDMA to poll the transfer status and check
0101  * whether the FlexIO SPI transfer is finished.
0102  *
0103  * @param base Pointer to FLEXIO_SPI_Type structure.
0104  * @param handle Pointer to flexio_spi_master_edma_handle_t structure to store the transfer state.
0105  * @param xfer Pointer to FlexIO SPI transfer structure.
0106  * @retval kStatus_Success Successfully start a transfer.
0107  * @retval kStatus_InvalidArgument Input argument is invalid.
0108  * @retval kStatus_FLEXIO_SPI_Busy FlexIO SPI is not idle, is running another transfer.
0109  */
0110 status_t FLEXIO_SPI_MasterTransferEDMA(FLEXIO_SPI_Type *base,
0111                                        flexio_spi_master_edma_handle_t *handle,
0112                                        flexio_spi_transfer_t *xfer);
0113 
0114 /*!
0115  * @brief Aborts a FlexIO SPI transfer using eDMA.
0116  *
0117  * @param base Pointer to FLEXIO_SPI_Type structure.
0118  * @param handle FlexIO SPI eDMA handle pointer.
0119  */
0120 void FLEXIO_SPI_MasterTransferAbortEDMA(FLEXIO_SPI_Type *base, flexio_spi_master_edma_handle_t *handle);
0121 
0122 /*!
0123  * @brief Gets the number of bytes transferred so far using FlexIO SPI master eDMA.
0124  *
0125  * @param base Pointer to FLEXIO_SPI_Type structure.
0126  * @param handle FlexIO SPI eDMA handle pointer.
0127  * @param count Number of bytes transferred so far by the non-blocking transaction.
0128  */
0129 status_t FLEXIO_SPI_MasterTransferGetCountEDMA(FLEXIO_SPI_Type *base,
0130                                                flexio_spi_master_edma_handle_t *handle,
0131                                                size_t *count);
0132 
0133 /*!
0134  * @brief Initializes the FlexIO SPI slave eDMA handle.
0135  *
0136  * This function initializes the FlexIO SPI slave eDMA handle.
0137  *
0138  * @param base Pointer to FLEXIO_SPI_Type structure.
0139  * @param handle Pointer to flexio_spi_slave_edma_handle_t structure to store the transfer state.
0140  * @param callback SPI callback, NULL means no callback.
0141  * @param userData callback function parameter.
0142  * @param txHandle User requested eDMA handle for FlexIO SPI TX eDMA transfer.
0143  * @param rxHandle User requested eDMA handle for FlexIO SPI RX eDMA transfer.
0144  */
0145 static inline void FLEXIO_SPI_SlaveTransferCreateHandleEDMA(FLEXIO_SPI_Type *base,
0146                                                             flexio_spi_slave_edma_handle_t *handle,
0147                                                             flexio_spi_slave_edma_transfer_callback_t callback,
0148                                                             void *userData,
0149                                                             edma_handle_t *txHandle,
0150                                                             edma_handle_t *rxHandle)
0151 {
0152     (void)FLEXIO_SPI_MasterTransferCreateHandleEDMA(base, handle, callback, userData, txHandle, rxHandle);
0153 }
0154 
0155 /*!
0156  * @brief Performs a non-blocking FlexIO SPI transfer using eDMA.
0157  *
0158  * @note This interface returns immediately after transfer initiates. Call
0159  * FLEXIO_SPI_SlaveGetTransferCountEDMA to poll the transfer status and
0160  * check whether the FlexIO SPI transfer is finished.
0161  *
0162  * @param base Pointer to FLEXIO_SPI_Type structure.
0163  * @param handle Pointer to flexio_spi_slave_edma_handle_t structure to store the transfer state.
0164  * @param xfer Pointer to FlexIO SPI transfer structure.
0165  * @retval kStatus_Success Successfully start a transfer.
0166  * @retval kStatus_InvalidArgument Input argument is invalid.
0167  * @retval kStatus_FLEXIO_SPI_Busy FlexIO SPI is not idle, is running another transfer.
0168  */
0169 status_t FLEXIO_SPI_SlaveTransferEDMA(FLEXIO_SPI_Type *base,
0170                                       flexio_spi_slave_edma_handle_t *handle,
0171                                       flexio_spi_transfer_t *xfer);
0172 
0173 /*!
0174  * @brief Aborts a FlexIO SPI transfer using eDMA.
0175  *
0176  * @param base Pointer to FLEXIO_SPI_Type structure.
0177  * @param handle Pointer to flexio_spi_slave_edma_handle_t structure to store the transfer state.
0178  */
0179 static inline void FLEXIO_SPI_SlaveTransferAbortEDMA(FLEXIO_SPI_Type *base, flexio_spi_slave_edma_handle_t *handle)
0180 {
0181     FLEXIO_SPI_MasterTransferAbortEDMA(base, handle);
0182 }
0183 
0184 /*!
0185  * @brief Gets the number of bytes transferred so far using FlexIO SPI slave eDMA.
0186  *
0187  * @param base Pointer to FLEXIO_SPI_Type structure.
0188  * @param handle FlexIO SPI eDMA handle pointer.
0189  * @param count Number of bytes transferred so far by the non-blocking transaction.
0190  */
0191 static inline status_t FLEXIO_SPI_SlaveTransferGetCountEDMA(FLEXIO_SPI_Type *base,
0192                                                             flexio_spi_slave_edma_handle_t *handle,
0193                                                             size_t *count)
0194 {
0195     return FLEXIO_SPI_MasterTransferGetCountEDMA(base, handle, count);
0196 }
0197 
0198 /*! @} */
0199 
0200 #if defined(__cplusplus)
0201 }
0202 #endif
0203 
0204 /*!
0205  * @}
0206  */
0207 #endif