1 /*
2 * Copyright 2018 -2021 NXP
3 * All rights reserved.
4 *
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8
9 #include "fsl_component_serial_manager.h"
10 #include "fsl_component_serial_port_internal.h"
11
12 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U)) || \
13 (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))
14 #include "fsl_adapter_uart.h"
15
16 #include "fsl_component_serial_port_uart.h"
17
18 /*******************************************************************************
19 * Definitions
20 ******************************************************************************/
21 #ifndef NDEBUG
22 #if (defined(DEBUG_CONSOLE_ASSERT_DISABLE) && (DEBUG_CONSOLE_ASSERT_DISABLE > 0U))
23 #undef assert
24 #define assert(n)
25 #else
26 /* MISRA C-2012 Rule 17.2 */
27 #undef assert
28 #define assert(n) \
29 while (!(n)) \
30 { \
31 ; \
32 }
33 #endif
34 #endif
35
36 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
37 #define SERIAL_PORT_UART_RECEIVE_DATA_LENGTH 1U
38 typedef struct _serial_uart_send_state
39 {
40 uint8_t *buffer;
41 uint32_t length;
42 serial_manager_callback_t callback;
43 void *callbackParam;
44 volatile uint8_t busy;
45 } serial_uart_send_state_t;
46
47 typedef struct _serial_uart_recv_state
48 {
49 serial_manager_callback_t callback;
50 void *callbackParam;
51 volatile uint8_t busy;
52 volatile uint8_t rxEnable;
53 uint8_t readBuffer[SERIAL_PORT_UART_RECEIVE_DATA_LENGTH];
54 } serial_uart_recv_state_t;
55
56 typedef struct _serial_uart_dma_recv_state
57 {
58 serial_manager_callback_t callback;
59 void *callbackParam;
60 volatile uint8_t busy;
61 volatile uint8_t rxEnable;
62 uint8_t readBuffer[SERIAL_PORT_UART_DMA_RECEIVE_DATA_LENGTH];
63 } serial_uart_dma_recv_state_t;
64
65 typedef struct _serial_uart_block_state
66 {
67 UART_HANDLE_DEFINE(usartHandleBuffer);
68 } serial_uart_block_state_t;
69 #endif
70
71 typedef struct _serial_uart_state
72 {
73 UART_HANDLE_DEFINE(usartHandleBuffer);
74 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
75 serial_uart_send_state_t tx;
76 serial_uart_recv_state_t rx;
77 #endif
78 } serial_uart_state_t;
79 #endif
80 #if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))
81 #if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))
82 typedef struct _serial_uart_dma_state
83 {
84 UART_HANDLE_DEFINE(usartHandleBuffer);
85 UART_DMA_HANDLE_DEFINE(uartDmaHandle);
86 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
87 serial_uart_send_state_t tx;
88 serial_uart_dma_recv_state_t rx;
89 #endif
90 } serial_uart_dma_state_t;
91 #endif
92 #endif
93
94 /*******************************************************************************
95 * Prototypes
96 ******************************************************************************/
97
98 /*******************************************************************************
99 * Code
100 ******************************************************************************/
101
102 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
Serial_UartEnableReceiving(serial_uart_state_t * serialUartHandle)103 static serial_manager_status_t Serial_UartEnableReceiving(serial_uart_state_t *serialUartHandle)
104 {
105 #if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
106 hal_uart_transfer_t transfer;
107 #endif
108 if (1U == serialUartHandle->rx.rxEnable)
109 {
110 serialUartHandle->rx.busy = 1U;
111 #if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
112 transfer.data = &serialUartHandle->rx.readBuffer[0];
113 transfer.dataSize = sizeof(serialUartHandle->rx.readBuffer);
114 if (kStatus_HAL_UartSuccess !=
115 HAL_UartTransferReceiveNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), &transfer))
116 #else
117 if (kStatus_HAL_UartSuccess !=
118 HAL_UartReceiveNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),
119 &serialUartHandle->rx.readBuffer[0], sizeof(serialUartHandle->rx.readBuffer)))
120 #endif
121 {
122 serialUartHandle->rx.busy = 0U;
123 return kStatus_SerialManager_Error;
124 }
125 }
126 return kStatus_SerialManager_Success;
127 }
128
129 /* UART user callback */
Serial_UartCallback(hal_uart_handle_t handle,hal_uart_status_t status,void * userData)130 static void Serial_UartCallback(hal_uart_handle_t handle, hal_uart_status_t status, void *userData)
131 {
132 serial_uart_state_t *serialUartHandle;
133 serial_manager_callback_message_t serialMsg;
134
135 assert(userData);
136 serialUartHandle = (serial_uart_state_t *)userData;
137
138 if ((hal_uart_status_t)kStatus_HAL_UartRxIdle == status)
139 {
140 #if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
141 (void)HAL_UartTransferAbortReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
142 #else
143 (void)HAL_UartAbortReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
144 #endif
145 if ((NULL != serialUartHandle->rx.callback))
146 {
147 serialMsg.buffer = &serialUartHandle->rx.readBuffer[0];
148 serialMsg.length = sizeof(serialUartHandle->rx.readBuffer);
149 serialUartHandle->rx.callback(serialUartHandle->rx.callbackParam, &serialMsg,
150 kStatus_SerialManager_Success);
151 }
152 }
153 else if ((hal_uart_status_t)kStatus_HAL_UartTxIdle == status)
154 {
155 if (0U != serialUartHandle->tx.busy)
156 {
157 serialUartHandle->tx.busy = 0U;
158 if ((NULL != serialUartHandle->tx.callback))
159 {
160 serialMsg.buffer = serialUartHandle->tx.buffer;
161 serialMsg.length = serialUartHandle->tx.length;
162 serialUartHandle->tx.callback(serialUartHandle->tx.callbackParam, &serialMsg,
163 kStatus_SerialManager_Success);
164 }
165 }
166 }
167 else
168 {
169 }
170 }
171 #endif
172
Serial_UartInit(serial_handle_t serialHandle,void * serialConfig)173 serial_manager_status_t Serial_UartInit(serial_handle_t serialHandle, void *serialConfig)
174 {
175 serial_uart_state_t *serialUartHandle;
176 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
177 serial_port_uart_config_t *uartConfig = (serial_port_uart_config_t *)serialConfig;
178 #endif
179 serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Success;
180 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
181 #if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
182 #if 0 /* Not used below! */
183 hal_uart_transfer_t transfer;
184 #endif
185 #endif
186 #endif
187
188 assert(serialConfig);
189 assert(serialHandle);
190 assert(SERIAL_PORT_UART_HANDLE_SIZE >= sizeof(serial_uart_state_t));
191
192 serialUartHandle = (serial_uart_state_t *)serialHandle;
193 serialManagerStatus = (serial_manager_status_t)HAL_UartInit(
194 ((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), (const hal_uart_config_t *)serialConfig);
195 assert(kStatus_SerialManager_Success == serialManagerStatus);
196 (void)serialManagerStatus;
197
198 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
199 serialUartHandle->rx.rxEnable = uartConfig->enableRx;
200 #if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
201
202 (void)HAL_UartTransferInstallCallback(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),
203 Serial_UartCallback, serialUartHandle);
204 #else
205 (void)HAL_UartInstallCallback(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), Serial_UartCallback,
206 serialUartHandle);
207 #endif
208 #endif
209
210 return serialManagerStatus;
211 }
212
Serial_UartDeinit(serial_handle_t serialHandle)213 serial_manager_status_t Serial_UartDeinit(serial_handle_t serialHandle)
214 {
215 serial_uart_state_t *serialUartHandle;
216
217 assert(serialHandle);
218
219 serialUartHandle = (serial_uart_state_t *)serialHandle;
220
221 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
222 #if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
223 (void)HAL_UartTransferAbortReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
224 #else
225 (void)HAL_UartAbortReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
226 #endif
227 #endif
228 (void)HAL_UartDeinit(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
229
230 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
231 serialUartHandle->tx.busy = 0U;
232 serialUartHandle->rx.busy = 0U;
233 #endif
234
235 return kStatus_SerialManager_Success;
236 }
237
238 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
239
Serial_UartWrite(serial_handle_t serialHandle,uint8_t * buffer,uint32_t length)240 serial_manager_status_t Serial_UartWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)
241 {
242 serial_uart_state_t *serialUartHandle;
243 hal_uart_status_t uartstatus;
244 #if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
245 hal_uart_transfer_t transfer;
246 #endif
247
248 assert(serialHandle);
249 assert(buffer);
250 assert(length);
251
252 serialUartHandle = (serial_uart_state_t *)serialHandle;
253 if (0U != serialUartHandle->tx.busy)
254 {
255 return kStatus_SerialManager_Busy;
256 }
257 serialUartHandle->tx.busy = 1U;
258
259 serialUartHandle->tx.buffer = buffer;
260 serialUartHandle->tx.length = length;
261
262 #if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
263 transfer.data = buffer;
264 transfer.dataSize = length;
265 uartstatus =
266 HAL_UartTransferSendNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), &transfer);
267 #else
268
269 uartstatus = HAL_UartSendNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), buffer, length);
270 #endif
271 assert(kStatus_HAL_UartSuccess == uartstatus);
272 (void)uartstatus;
273
274 return kStatus_SerialManager_Success;
275 }
276
Serial_UartRead(serial_handle_t serialHandle,uint8_t * buffer,uint32_t length)277 serial_manager_status_t Serial_UartRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)
278 {
279 assert(serialHandle);
280 (void)buffer;
281 (void)length;
282 return (serial_manager_status_t)Serial_UartEnableReceiving(serialHandle);
283 }
284
285 #else
286
Serial_UartWrite(serial_handle_t serialHandle,uint8_t * buffer,uint32_t length)287 serial_manager_status_t Serial_UartWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)
288 {
289 serial_uart_state_t *serialUartHandle;
290
291 assert(serialHandle);
292 assert(buffer);
293 assert(length);
294
295 serialUartHandle = (serial_uart_state_t *)serialHandle;
296
297 return (serial_manager_status_t)HAL_UartSendBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),
298 buffer, length);
299 }
300
Serial_UartRead(serial_handle_t serialHandle,uint8_t * buffer,uint32_t length)301 serial_manager_status_t Serial_UartRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)
302 {
303 serial_uart_state_t *serialUartHandle;
304
305 assert(serialHandle);
306 assert(buffer);
307 assert(length);
308
309 serialUartHandle = (serial_uart_state_t *)serialHandle;
310
311 return (serial_manager_status_t)HAL_UartReceiveBlocking(
312 ((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), buffer, length);
313 }
314
315 #endif
316
317 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
Serial_UartCancelWrite(serial_handle_t serialHandle)318 serial_manager_status_t Serial_UartCancelWrite(serial_handle_t serialHandle)
319 {
320 serial_uart_state_t *serialUartHandle;
321 serial_manager_callback_message_t serialMsg;
322 uint32_t primask;
323 uint8_t isBusy = 0U;
324
325 assert(serialHandle);
326
327 serialUartHandle = (serial_uart_state_t *)serialHandle;
328
329 primask = DisableGlobalIRQ();
330 isBusy = serialUartHandle->tx.busy;
331 serialUartHandle->tx.busy = 0U;
332 EnableGlobalIRQ(primask);
333
334 #if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))
335 (void)HAL_UartTransferAbortSend(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
336 #else
337 (void)HAL_UartAbortSend(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
338 #endif
339 if (0U != isBusy)
340 {
341 if ((NULL != serialUartHandle->tx.callback))
342 {
343 serialMsg.buffer = serialUartHandle->tx.buffer;
344 serialMsg.length = serialUartHandle->tx.length;
345 serialUartHandle->tx.callback(serialUartHandle->tx.callbackParam, &serialMsg,
346 kStatus_SerialManager_Canceled);
347 }
348 }
349 return kStatus_SerialManager_Success;
350 }
351
Serial_UartInstallTxCallback(serial_handle_t serialHandle,serial_manager_callback_t callback,void * callbackParam)352 serial_manager_status_t Serial_UartInstallTxCallback(serial_handle_t serialHandle,
353 serial_manager_callback_t callback,
354 void *callbackParam)
355 {
356 serial_uart_state_t *serialUartHandle;
357
358 assert(serialHandle);
359
360 serialUartHandle = (serial_uart_state_t *)serialHandle;
361
362 serialUartHandle->tx.callback = callback;
363 serialUartHandle->tx.callbackParam = callbackParam;
364
365 return kStatus_SerialManager_Success;
366 }
367
Serial_UartInstallRxCallback(serial_handle_t serialHandle,serial_manager_callback_t callback,void * callbackParam)368 serial_manager_status_t Serial_UartInstallRxCallback(serial_handle_t serialHandle,
369 serial_manager_callback_t callback,
370 void *callbackParam)
371 {
372 serial_uart_state_t *serialUartHandle;
373
374 assert(serialHandle);
375
376 serialUartHandle = (serial_uart_state_t *)serialHandle;
377
378 serialUartHandle->rx.callback = callback;
379 serialUartHandle->rx.callbackParam = callbackParam;
380
381 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
382 (void)Serial_UartEnableReceiving(serialUartHandle);
383 #endif
384 return kStatus_SerialManager_Success;
385 }
386
Serial_UartIsrFunction(serial_handle_t serialHandle)387 void Serial_UartIsrFunction(serial_handle_t serialHandle)
388 {
389 serial_uart_state_t *serialUartHandle;
390
391 assert(serialHandle);
392
393 serialUartHandle = (serial_uart_state_t *)serialHandle;
394
395 HAL_UartIsrFunction(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
396 }
397 #endif
398
Serial_UartEnterLowpower(serial_handle_t serialHandle)399 serial_manager_status_t Serial_UartEnterLowpower(serial_handle_t serialHandle)
400 {
401 serial_uart_state_t *serialUartHandle;
402 hal_uart_status_t uartstatus;
403
404 assert(serialHandle);
405
406 serialUartHandle = (serial_uart_state_t *)serialHandle;
407
408 uartstatus = HAL_UartEnterLowpower(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
409 assert(kStatus_HAL_UartSuccess == uartstatus);
410 (void)uartstatus;
411
412 return kStatus_SerialManager_Success;
413 }
414
Serial_UartExitLowpower(serial_handle_t serialHandle)415 serial_manager_status_t Serial_UartExitLowpower(serial_handle_t serialHandle)
416 {
417 serial_uart_state_t *serialUartHandle;
418 serial_manager_status_t status = kStatus_SerialManager_Success;
419 hal_uart_status_t uartstatus;
420
421 assert(serialHandle);
422
423 serialUartHandle = (serial_uart_state_t *)serialHandle;
424
425 uartstatus = HAL_UartExitLowpower(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
426 assert(kStatus_HAL_UartSuccess == uartstatus);
427 (void)uartstatus;
428
429 return status;
430 }
431
432 #if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))
433 #if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))
434 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
Serial_UartDmaEnableReceiving(serial_uart_dma_state_t * serialUartHandle)435 static serial_manager_status_t Serial_UartDmaEnableReceiving(serial_uart_dma_state_t *serialUartHandle)
436 {
437 if (1U == serialUartHandle->rx.rxEnable)
438 {
439 serialUartHandle->rx.busy = 1U;
440 if (kStatus_HAL_UartDmaSuccess !=
441 HAL_UartDMATransferReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),
442 &serialUartHandle->rx.readBuffer[0], sizeof(serialUartHandle->rx.readBuffer),
443 false))
444
445 {
446 serialUartHandle->rx.busy = 0U;
447 return kStatus_SerialManager_Error;
448 }
449 }
450 return kStatus_SerialManager_Success;
451 }
452
453 /* UART user callback */
Serial_UartDmaCallback(hal_uart_dma_handle_t handle,hal_dma_callback_msg_t * dmaMsg,void * callbackParam)454 static void Serial_UartDmaCallback(hal_uart_dma_handle_t handle, hal_dma_callback_msg_t *dmaMsg, void *callbackParam)
455 {
456 serial_uart_dma_state_t *serialUartHandle;
457 serial_manager_callback_message_t cb_msg;
458
459 assert(callbackParam);
460 serialUartHandle = (serial_uart_dma_state_t *)callbackParam;
461
462 if (((hal_uart_dma_status_t)kStatus_HAL_UartDmaRxIdle == dmaMsg->status) ||
463 (kStatus_HAL_UartDmaIdleline == dmaMsg->status))
464 {
465 if ((NULL != serialUartHandle->rx.callback))
466 {
467 cb_msg.buffer = dmaMsg->data;
468 cb_msg.length = dmaMsg->dataSize;
469 serialUartHandle->rx.callback(serialUartHandle->rx.callbackParam, &cb_msg, kStatus_SerialManager_Success);
470 }
471
472 if (kStatus_HAL_UartDmaSuccess ==
473 HAL_UartDMATransferReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),
474 &serialUartHandle->rx.readBuffer[0], sizeof(serialUartHandle->rx.readBuffer),
475 false))
476 {
477 serialUartHandle->rx.busy = 1U;
478 }
479 }
480 else if (kStatus_HAL_UartDmaTxIdle == dmaMsg->status)
481 {
482 if (0U != serialUartHandle->tx.busy)
483 {
484 serialUartHandle->tx.busy = 0U;
485 if ((NULL != serialUartHandle->tx.callback))
486 {
487 cb_msg.buffer = dmaMsg->data;
488 cb_msg.length = dmaMsg->dataSize;
489 serialUartHandle->tx.callback(serialUartHandle->tx.callbackParam, &cb_msg,
490 kStatus_SerialManager_Success);
491 }
492 }
493 }
494 else
495 {
496 }
497 }
498
499 #endif
500
Serial_UartDmaInit(serial_handle_t serialHandle,void * serialConfig)501 serial_manager_status_t Serial_UartDmaInit(serial_handle_t serialHandle, void *serialConfig)
502 {
503 serial_uart_dma_state_t *serialUartHandle;
504 #if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))
505 serial_port_uart_dma_config_t *uartConfig = (serial_port_uart_dma_config_t *)serialConfig;
506 #endif
507 serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Success;
508
509 assert(serialConfig);
510 assert(serialHandle);
511
512 assert(SERIAL_PORT_UART_DMA_HANDLE_SIZE >= sizeof(serial_uart_dma_state_t));
513
514 serialUartHandle = (serial_uart_dma_state_t *)serialHandle;
515 serialManagerStatus = (serial_manager_status_t)HAL_UartInit(
516 ((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), (const hal_uart_config_t *)serialConfig);
517 assert(kStatus_SerialManager_Success == serialManagerStatus);
518 (void)serialManagerStatus;
519
520 #if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))
521
522 hal_uart_dma_config_t dmaConfig;
523
524 dmaConfig.uart_instance = uartConfig->instance;
525 dmaConfig.dma_instance = uartConfig->dma_instance;
526 dmaConfig.rx_channel = uartConfig->rx_channel;
527 dmaConfig.tx_channel = uartConfig->tx_channel;
528 dmaConfig.dma_mux_configure = uartConfig->dma_mux_configure;
529 dmaConfig.dma_channel_mux_configure = uartConfig->dma_channel_mux_configure;
530
531 // Init uart dma
532 (void)HAL_UartDMAInit(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),
533 (hal_uart_dma_handle_t *)serialUartHandle->uartDmaHandle, &dmaConfig);
534
535 #endif
536 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
537
538 serialUartHandle->rx.rxEnable = uartConfig->enableRx;
539 (void)HAL_UartDMATransferInstallCallback(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),
540 Serial_UartDmaCallback, serialUartHandle);
541
542 #endif
543 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
544 serialManagerStatus = Serial_UartDmaEnableReceiving(serialUartHandle);
545 #endif
546
547 return serialManagerStatus;
548 }
549
Serial_UartDmaDeinit(serial_handle_t serialHandle)550 serial_manager_status_t Serial_UartDmaDeinit(serial_handle_t serialHandle)
551 {
552 serial_uart_dma_state_t *serialUartHandle;
553
554 assert(serialHandle);
555
556 serialUartHandle = (serial_uart_dma_state_t *)serialHandle;
557
558 (void)HAL_UartDMAAbortReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
559
560 (void)HAL_UartDeinit(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
561 (void)HAL_UartDMADeinit(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
562
563 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
564 serialUartHandle->tx.busy = 0U;
565 serialUartHandle->rx.busy = 0U;
566 #endif
567
568 return kStatus_SerialManager_Success;
569 }
570
571 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
572
Serial_UartDmaWrite(serial_handle_t serialHandle,uint8_t * buffer,uint32_t length)573 serial_manager_status_t Serial_UartDmaWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)
574 {
575 serial_uart_dma_state_t *serialUartHandle;
576 hal_uart_status_t uartstatus;
577
578 assert(serialHandle);
579 assert(buffer);
580 assert(length);
581
582 serialUartHandle = (serial_uart_dma_state_t *)serialHandle;
583
584 if (0U != serialUartHandle->tx.busy)
585 {
586 return kStatus_SerialManager_Busy;
587 }
588 serialUartHandle->tx.busy = 1U;
589
590 serialUartHandle->tx.buffer = buffer;
591 serialUartHandle->tx.length = length;
592
593 uartstatus = (hal_uart_status_t)HAL_UartDMATransferSend(
594 ((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), buffer, length);
595
596 assert(kStatus_HAL_UartSuccess == uartstatus);
597 (void)uartstatus;
598
599 return kStatus_SerialManager_Success;
600 }
601
602 #endif
603
604 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
Serial_UartDmaCancelWrite(serial_handle_t serialHandle)605 serial_manager_status_t Serial_UartDmaCancelWrite(serial_handle_t serialHandle)
606 {
607 serial_uart_dma_state_t *serialUartHandle;
608 serial_manager_callback_message_t serialMsg;
609 uint32_t primask;
610 uint8_t isBusy = 0U;
611
612 assert(serialHandle);
613
614 serialUartHandle = (serial_uart_dma_state_t *)serialHandle;
615
616 primask = DisableGlobalIRQ();
617 isBusy = serialUartHandle->tx.busy;
618 serialUartHandle->tx.busy = 0U;
619 EnableGlobalIRQ(primask);
620
621 (void)HAL_UartDMAAbortSend(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
622
623 if (0U != isBusy)
624 {
625 if ((NULL != serialUartHandle->tx.callback))
626 {
627 serialMsg.buffer = serialUartHandle->tx.buffer;
628 serialMsg.length = serialUartHandle->tx.length;
629 serialUartHandle->tx.callback(serialUartHandle->tx.callbackParam, &serialMsg,
630 kStatus_SerialManager_Canceled);
631 }
632 }
633 return kStatus_SerialManager_Success;
634 }
635
Serial_UartDmaInstallTxCallback(serial_handle_t serialHandle,serial_manager_callback_t callback,void * callbackParam)636 serial_manager_status_t Serial_UartDmaInstallTxCallback(serial_handle_t serialHandle,
637 serial_manager_callback_t callback,
638 void *callbackParam)
639 {
640 serial_uart_dma_state_t *serialUartHandle;
641
642 assert(serialHandle);
643
644 serialUartHandle = (serial_uart_dma_state_t *)serialHandle;
645
646 serialUartHandle->tx.callback = callback;
647 serialUartHandle->tx.callbackParam = callbackParam;
648
649 return kStatus_SerialManager_Success;
650 }
651
Serial_UartDmaInstallRxCallback(serial_handle_t serialHandle,serial_manager_callback_t callback,void * callbackParam)652 serial_manager_status_t Serial_UartDmaInstallRxCallback(serial_handle_t serialHandle,
653 serial_manager_callback_t callback,
654 void *callbackParam)
655 {
656 serial_uart_dma_state_t *serialUartHandle;
657
658 assert(serialHandle);
659
660 serialUartHandle = (serial_uart_dma_state_t *)serialHandle;
661
662 serialUartHandle->rx.callback = callback;
663 serialUartHandle->rx.callbackParam = callbackParam;
664
665 return kStatus_SerialManager_Success;
666 }
667
Serial_UartDmaIsrFunction(serial_handle_t serialHandle)668 void Serial_UartDmaIsrFunction(serial_handle_t serialHandle)
669 {
670 serial_uart_dma_state_t *serialUartHandle;
671
672 assert(serialHandle);
673
674 serialUartHandle = (serial_uart_dma_state_t *)serialHandle;
675
676 HAL_UartIsrFunction(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
677 }
678 #endif
679
Serial_UartDmaEnterLowpower(serial_handle_t serialHandle)680 serial_manager_status_t Serial_UartDmaEnterLowpower(serial_handle_t serialHandle)
681 {
682 serial_uart_dma_state_t *serialUartHandle;
683 hal_uart_status_t uartstatus;
684
685 assert(serialHandle);
686
687 serialUartHandle = (serial_uart_dma_state_t *)serialHandle;
688
689 uartstatus = HAL_UartEnterLowpower(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
690 assert(kStatus_HAL_UartSuccess == uartstatus);
691 (void)uartstatus;
692
693 return kStatus_SerialManager_Success;
694 }
695
Serial_UartDmaExitLowpower(serial_handle_t serialHandle)696 serial_manager_status_t Serial_UartDmaExitLowpower(serial_handle_t serialHandle)
697 {
698 serial_uart_dma_state_t *serialUartHandle;
699 serial_manager_status_t status = kStatus_SerialManager_Success;
700 hal_uart_status_t uartstatus;
701
702 assert(serialHandle);
703
704 serialUartHandle = (serial_uart_dma_state_t *)serialHandle;
705
706 uartstatus = HAL_UartExitLowpower(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));
707 assert(kStatus_HAL_UartSuccess == uartstatus);
708 (void)uartstatus;
709
710 return status;
711 }
712 #endif
713 #endif
714