1 /*
2  * Copyright (c) 2015, Freescale Semiconductor, Inc.
3  * Copyright 2016-2020 NXP
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 #ifndef _FSL_UART_EDMA_H_
9 #define _FSL_UART_EDMA_H_
10 
11 #include "fsl_uart.h"
12 #include "fsl_edma.h"
13 
14 /*!
15  * @addtogroup uart_edma_driver
16  * @{
17  */
18 
19 /*******************************************************************************
20  * Definitions
21  ******************************************************************************/
22 
23 /*! @name Driver version */
24 /*@{*/
25 /*! @brief UART EDMA driver version. */
26 #define FSL_UART_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 5, 0))
27 /*@}*/
28 
29 /* Forward declaration of the handle typedef. */
30 typedef struct _uart_edma_handle uart_edma_handle_t;
31 
32 /*! @brief UART transfer callback function. */
33 typedef void (*uart_edma_transfer_callback_t)(UART_Type *base,
34                                               uart_edma_handle_t *handle,
35                                               status_t status,
36                                               void *userData);
37 
38 /*!
39  * @brief UART eDMA handle
40  */
41 struct _uart_edma_handle
42 {
43     uart_edma_transfer_callback_t callback; /*!< Callback function. */
44     void *userData;                         /*!< UART callback function parameter.*/
45     size_t rxDataSizeAll;                   /*!< Size of the data to receive. */
46     size_t txDataSizeAll;                   /*!< Size of the data to send out. */
47 
48     edma_handle_t *txEdmaHandle; /*!< The eDMA TX channel used. */
49     edma_handle_t *rxEdmaHandle; /*!< The eDMA RX channel used. */
50 
51     uint8_t nbytes; /*!< eDMA minor byte transfer count initially configured. */
52 
53     volatile uint8_t txState; /*!< TX transfer state. */
54     volatile uint8_t rxState; /*!< RX transfer state */
55 };
56 
57 /*******************************************************************************
58  * API
59  ******************************************************************************/
60 
61 #if defined(__cplusplus)
62 extern "C" {
63 #endif
64 
65 /*!
66  * @name eDMA transactional
67  * @{
68  */
69 
70 /*!
71  * @brief Initializes the UART handle which is used in transactional functions.
72  * @param base UART peripheral base address.
73  * @param handle Pointer to the uart_edma_handle_t structure.
74  * @param callback UART callback, NULL means no callback.
75  * @param userData User callback function data.
76  * @param rxEdmaHandle User-requested DMA handle for RX DMA transfer.
77  * @param txEdmaHandle User-requested DMA handle for TX DMA transfer.
78  */
79 void UART_TransferCreateHandleEDMA(UART_Type *base,
80                                    uart_edma_handle_t *handle,
81                                    uart_edma_transfer_callback_t callback,
82                                    void *userData,
83                                    edma_handle_t *txEdmaHandle,
84                                    edma_handle_t *rxEdmaHandle);
85 
86 /*!
87  * @brief Sends data using eDMA.
88  *
89  * This function sends data using eDMA. This is a non-blocking function, which returns
90  * right away. When all data is sent, the send callback function is called.
91  *
92  * @param base UART peripheral base address.
93  * @param handle UART handle pointer.
94  * @param xfer UART eDMA transfer structure. See #uart_transfer_t.
95  * @retval kStatus_Success if succeeded; otherwise failed.
96  * @retval kStatus_UART_TxBusy Previous transfer ongoing.
97  * @retval kStatus_InvalidArgument Invalid argument.
98  */
99 status_t UART_SendEDMA(UART_Type *base, uart_edma_handle_t *handle, uart_transfer_t *xfer);
100 
101 /*!
102  * @brief Receives data using eDMA.
103  *
104  * This function receives data using eDMA. This is a non-blocking function, which returns
105  * right away. When all data is received, the receive callback function is called.
106  *
107  * @param base UART peripheral base address.
108  * @param handle Pointer to the uart_edma_handle_t structure.
109  * @param xfer UART eDMA transfer structure. See #uart_transfer_t.
110  * @retval kStatus_Success if succeeded; otherwise failed.
111  * @retval kStatus_UART_RxBusy Previous transfer ongoing.
112  * @retval kStatus_InvalidArgument Invalid argument.
113  */
114 status_t UART_ReceiveEDMA(UART_Type *base, uart_edma_handle_t *handle, uart_transfer_t *xfer);
115 
116 /*!
117  * @brief Aborts the sent data using eDMA.
118  *
119  * This function aborts sent data using eDMA.
120  *
121  * @param base UART peripheral base address.
122  * @param handle Pointer to the uart_edma_handle_t structure.
123  */
124 void UART_TransferAbortSendEDMA(UART_Type *base, uart_edma_handle_t *handle);
125 
126 /*!
127  * @brief Aborts the receive data using eDMA.
128  *
129  * This function aborts receive data using eDMA.
130  *
131  * @param base UART peripheral base address.
132  * @param handle Pointer to the uart_edma_handle_t structure.
133  */
134 void UART_TransferAbortReceiveEDMA(UART_Type *base, uart_edma_handle_t *handle);
135 
136 /*!
137  * @brief Gets the number of bytes that have been written to UART TX register.
138  *
139  * This function gets the number of bytes that have been written to UART TX
140  * register by DMA.
141  *
142  * @param base UART peripheral base address.
143  * @param handle UART handle pointer.
144  * @param count Send bytes count.
145  * @retval kStatus_NoTransferInProgress No send in progress.
146  * @retval kStatus_InvalidArgument Parameter is invalid.
147  * @retval kStatus_Success Get successfully through the parameter \p count;
148  */
149 status_t UART_TransferGetSendCountEDMA(UART_Type *base, uart_edma_handle_t *handle, uint32_t *count);
150 
151 /*!
152  * @brief Gets the number of received bytes.
153  *
154  * This function gets the number of received bytes.
155  *
156  * @param base UART peripheral base address.
157  * @param handle UART handle pointer.
158  * @param count Receive bytes count.
159  * @retval kStatus_NoTransferInProgress No receive in progress.
160  * @retval kStatus_InvalidArgument Parameter is invalid.
161  * @retval kStatus_Success Get successfully through the parameter \p count;
162  */
163 status_t UART_TransferGetReceiveCountEDMA(UART_Type *base, uart_edma_handle_t *handle, uint32_t *count);
164 
165 /*!
166  * @brief UART eDMA IRQ handle function.
167  *
168  * This function handles the UART transmit complete IRQ request and invoke user callback.
169  *
170  * @param base UART peripheral base address.
171  * @param uartEdmaHandle UART handle pointer.
172  */
173 void UART_TransferEdmaHandleIRQ(UART_Type *base, void *uartEdmaHandle);
174 
175 /*@}*/
176 
177 #if defined(__cplusplus)
178 }
179 #endif
180 
181 /*! @}*/
182 
183 #endif /* _FSL_UART_EDMA_H_ */
184