1 /*
2  * Copyright 2022 NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #ifndef FSL_LPUART_FREERTOS_H__
9 #define FSL_LPUART_FREERTOS_H__
10 
11 #include "fsl_lpuart.h"
12 #include "FreeRTOS.h"
13 #include "event_groups.h"
14 #include "semphr.h"
15 
16 /*!
17  * @addtogroup lpuart_freertos_driver
18  * @{
19  */
20 
21 /*******************************************************************************
22  * Definitions
23  ******************************************************************************/
24 
25 /*! @name Driver version */
26 /*@{*/
27 /*! @brief LPUART FreeRTOS driver version 2.0.0. */
28 #define FSL_LPUART_FREERTOS_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
29 /*@}*/
30 
31 /*! @brief LPUART RTOS configuration structure. */
32 typedef struct _lpuart_rtos_config
33 {
34     LPUART_Type *base;                /*!< UART base address */
35     uint32_t srcclk;                  /*!< UART source clock in Hz*/
36     uint32_t baudrate;                /*!< Desired communication speed */
37     lpuart_parity_mode_t parity;      /*!< Parity setting */
38     lpuart_stop_bit_count_t stopbits; /*!< Number of stop bits to use */
39     uint8_t *buffer;                  /*!< Buffer for background reception */
40     uint32_t buffer_size;             /*!< Size of buffer for background reception */
41     /* Zero in constant and multiplier is interpreted as infinit timeout. */
42     uint32_t rx_timeout_constant_ms;   /*!< RX timeout applied per receive */
43     uint32_t rx_timeout_multiplier_ms; /*!< RX timeout added for each byte of the receive. */
44     uint32_t tx_timeout_constant_ms;   /*!< TX timeout applied per transmition */
45     uint32_t tx_timeout_multiplier_ms; /*!< TX timeout added for each byte of the transmition. */
46 #if defined(FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT) && FSL_FEATURE_LPUART_HAS_MODEM_SUPPORT
47     bool enableRxRTS;                         /*!< RX RTS enable */
48     bool enableTxCTS;                         /*!< TX CTS enable */
49     lpuart_transmit_cts_source_t txCtsSource; /*!< TX CTS source */
50     lpuart_transmit_cts_config_t txCtsConfig; /*!< TX CTS configure */
51 #endif
52 } lpuart_rtos_config_t;
53 
54 /*!
55  * @cond RTOS_PRIVATE
56  * @name LPUART event flags
57  *
58  * This are only valid states for txEvent and rxEvent (lpuart_rtos_handle_t).
59  */
60 /*@{*/
61 /*! @brief Event flag - uart transmit complete. */
62 #define RTOS_LPUART_TX_COMPLETE 0x1U
63 /*! @brief Event flag - uart receive complete. */
64 #define RTOS_LPUART_RX_COMPLETE 0x2U
65 /*! @brief Event flag - ring buffer overrun. */
66 #define RTOS_LPUART_RING_BUFFER_OVERRUN 0x4U
67 /*! @brief Event flag - hardware buffer overrun. */
68 #define RTOS_LPUART_HARDWARE_BUFFER_OVERRUN 0x8U
69 /*@}*/
70 
71 /*! @brief LPUART FreeRTOS transfer structure. */
72 typedef struct _lpuart_rtos_handle
73 {
74     LPUART_Type *base;                 /*!< UART base address */
75     lpuart_transfer_t txTransfer;      /*!< TX transfer structure */
76     lpuart_transfer_t rxTransfer;      /*!< RX transfer structure */
77     SemaphoreHandle_t rxSemaphore;     /*!< RX semaphore for resource sharing */
78     SemaphoreHandle_t txSemaphore;     /*!< TX semaphore for resource sharing */
79     EventGroupHandle_t rxEvent;        /*!< RX completion event */
80     EventGroupHandle_t txEvent;        /*!< TX completion event */
81     uint32_t rx_timeout_constant_ms;   /*!< RX Timeout applied per transfer */
82     uint32_t rx_timeout_multiplier_ms; /*!< RX Timeout added for each byte of the transfer. */
83     uint32_t tx_timeout_constant_ms;   /*!< TX Timeout applied per transfer */
84     uint32_t tx_timeout_multiplier_ms; /*!< TX Timeout added for each byte of the transfer. */
85     void *t_state;                     /*!< Transactional state of the underlying driver */
86 #if (configSUPPORT_STATIC_ALLOCATION == 1)
87     StaticSemaphore_t txSemaphoreBuffer; /*!< Statically allocated memory for txSemaphore */
88     StaticSemaphore_t rxSemaphoreBuffer; /*!< Statically allocated memory for rxSemaphore */
89     StaticEventGroup_t txEventBuffer;    /*!< Statically allocated memory for txEvent */
90     StaticEventGroup_t rxEventBuffer;    /*!< Statically allocated memory for rxEvent */
91 #endif
92 } lpuart_rtos_handle_t;
93 /*! \endcond */
94 
95 /*******************************************************************************
96  * API
97  ******************************************************************************/
98 
99 #if defined(__cplusplus)
100 extern "C" {
101 #endif
102 
103 /*!
104  * @name LPUART RTOS Operation
105  * @{
106  */
107 
108 /*!
109  * @brief Initializes an LPUART instance for operation in RTOS.
110  *
111  * @param handle The RTOS LPUART handle, the pointer to an allocated space for RTOS context.
112  * @param t_handle The pointer to an allocated space to store the transactional layer internal state.
113  * @param cfg The pointer to the parameters required to configure the LPUART after initialization.
114  * @return 0 succeed, others failed
115  */
116 int LPUART_RTOS_Init(lpuart_rtos_handle_t *handle, lpuart_handle_t *t_handle, const lpuart_rtos_config_t *cfg);
117 
118 /*!
119  * @brief Deinitializes an LPUART instance for operation.
120  *
121  * This function deinitializes the LPUART module, sets all register value to the reset value,
122  * and releases the resources.
123  *
124  * @param handle The RTOS LPUART handle.
125  */
126 int LPUART_RTOS_Deinit(lpuart_rtos_handle_t *handle);
127 
128 /*!
129  * @name LPUART transactional Operation
130  * @{
131  */
132 
133 /*!
134  * @brief Sends data in the background.
135  *
136  * This function sends data. It is an synchronous API.
137  * If the hardware buffer is full, the task is in the blocked state.
138  *
139  * @param handle The RTOS LPUART handle.
140  * @param buffer The pointer to buffer to send.
141  * @param length The number of bytes to send.
142  */
143 int LPUART_RTOS_Send(lpuart_rtos_handle_t *handle, uint8_t *buffer, uint32_t length);
144 
145 /*!
146  * @brief Receives data.
147  *
148  * This function receives data from LPUART. It is an synchronous API. If any data is immediately available
149  * it is returned immediately and the number of bytes received.
150  *
151  * @param handle The RTOS LPUART handle.
152  * @param buffer The pointer to buffer where to write received data.
153  * @param length The number of bytes to receive.
154  * @param received The pointer to a variable of size_t where the number of received data is filled.
155  */
156 int LPUART_RTOS_Receive(lpuart_rtos_handle_t *handle, uint8_t *buffer, uint32_t length, size_t *received);
157 
158 /*!
159  * @brief Set RX timeout in runtime
160  *
161  * This function can modify RX timeout between initialization and receive.
162  *
163  * param handle The RTOS LPUART handle.
164  * param rx_timeout_constant_ms RX timeout applied per receive.
165  * param rx_timeout_multiplier_ms RX timeout added for each byte of the receive.
166  */
167 int LPUART_RTOS_SetRxTimeout(lpuart_rtos_handle_t *handle,
168                              uint32_t rx_timeout_constant_ms,
169                              uint32_t rx_timeout_multiplier_ms);
170 
171 /*!
172  * @brief Set TX timeout in runtime
173  *
174  * This function can modify TX timeout between initialization and send.
175  *
176  * param handle The RTOS LPUART handle.
177  * param tx_timeout_constant_ms TX timeout applied per transmition.
178  * param tx_timeout_multiplier_ms TX timeout added for each byte of the transmition.
179  */
180 int LPUART_RTOS_SetTxTimeout(lpuart_rtos_handle_t *handle,
181                              uint32_t tx_timeout_constant_ms,
182                              uint32_t tx_timeout_multiplier_ms);
183 
184 /* @} */
185 
186 #if defined(__cplusplus)
187 }
188 #endif
189 
190 /*! @}*/
191 
192 #endif /* FSL_LPUART_FREERTOS_H__ */
193