1 /*
2  * Copyright 2018-2024 NXP
3  * All rights reserved.
4  *
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 #include <string.h>
10 #include "fsl_component_serial_manager.h"
11 #include "fsl_component_serial_port_internal.h"
12 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
13 
14 #include "fsl_component_generic_list.h"
15 
16 /*
17  * The OSA_USED macro can only be defined when the OSA component is used.
18  * If the source code of the OSA component does not exist, the OSA_USED cannot be defined.
19  * OR, If OSA component is not added into project event the OSA source code exists, the OSA_USED
20  * also cannot be defined.
21  * The source code path of the OSA component is <MCUXpresso_SDK>/components/osa.
22  *
23  */
24 #if defined(OSA_USED)
25 #include "fsl_os_abstraction.h"
26 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
27 #include "fsl_component_common_task.h"
28 #else
29 
30 #endif
31 
32 #endif
33 
34 #endif
35 
36 /*******************************************************************************
37  * Definitions
38  ******************************************************************************/
39 
40 #ifndef NDEBUG
41 #if (defined(DEBUG_CONSOLE_ASSERT_DISABLE) && (DEBUG_CONSOLE_ASSERT_DISABLE > 0U))
42 #undef assert
43 #define assert(n)
44 #else
45 /* MISRA C-2012 Rule 17.2 */
46 #undef assert
47 #define assert(n) \
48     while (!(n))  \
49     {             \
50         ;         \
51     }
52 #endif
53 #endif
54 
55 /* Weak function. */
56 #if defined(__GNUC__)
57 #define __WEAK_FUNC __attribute__((weak))
58 #elif defined(__ICCARM__)
59 #define __WEAK_FUNC __weak
60 #elif defined(__CC_ARM) || defined(__ARMCC_VERSION)
61 #define __WEAK_FUNC __attribute__((weak))
62 #elif defined(__DSC__) || defined(__CW__)
63 #define __WEAK_FUNC __attribute__((weak))
64 #endif
65 
66 #define SERIAL_EVENT_DATA_RECEIVED   (0U)
67 #define SERIAL_EVENT_DATA_SENT       (1U)
68 #define SERIAL_EVENT_DATA_START_SEND (2U)
69 #define SERIAL_EVENT_DATA_RX_NOTIFY  (3U)
70 #define SERIAL_EVENT_DATA_NUMBER     (4U)
71 
72 #define SERIAL_MANAGER_WRITE_TAG 0xAABB5754U
73 #define SERIAL_MANAGER_READ_TAG  0xBBAA5244U
74 
75 #ifndef RINGBUFFER_WATERMARK_THRESHOLD
76 #define RINGBUFFER_WATERMARK_THRESHOLD 95U / 100U
77 #endif
78 
79 #ifndef gSerialManagerLpConstraint_c
80 #define gSerialManagerLpConstraint_c 0
81 #endif
82 
83 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
84 typedef enum _serial_manager_transmission_mode
85 {
86     kSerialManager_TransmissionBlocking    = 0x0U, /*!< Blocking transmission*/
87     kSerialManager_TransmissionNonBlocking = 0x1U, /*!< None blocking transmission*/
88 } serial_manager_transmission_mode_t;
89 
90 /* TX transfer structure */
91 typedef struct _serial_manager_transfer
92 {
93     uint8_t *buffer;
94     volatile uint32_t length;
95     volatile uint32_t soFar;
96     serial_manager_transmission_mode_t mode;
97     serial_manager_status_t status;
98 } serial_manager_transfer_t;
99 #endif
100 
101 /* write handle structure */
102 typedef struct _serial_manager_send_handle
103 {
104 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
105     list_element_t link; /*!< list element of the link */
106     serial_manager_transfer_t transfer;
107 #endif
108     struct _serial_manager_handle *serialManagerHandle;
109 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
110     serial_manager_callback_t callback;
111     void *callbackParam;
112     uint32_t tag;
113 #endif
114 } serial_manager_write_handle_t;
115 typedef struct _serial_manager_send_block_handle
116 {
117     struct _serial_manager_handle *serialManagerHandle;
118 
119 } serial_manager_write_block_handle_t;
120 
121 typedef serial_manager_write_handle_t serial_manager_read_handle_t;
122 typedef serial_manager_write_block_handle_t serial_manager_read_block_handle_t;
123 
124 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
125 /* receive state structure */
126 typedef struct _serial_manager_read_ring_buffer
127 {
128     uint8_t *ringBuffer;
129     uint32_t ringBufferSize;
130     volatile uint32_t ringHead;
131     volatile uint32_t ringTail;
132 } serial_manager_read_ring_buffer_t;
133 
134 #if defined(__CC_ARM)
135 #pragma anon_unions
136 #endif
137 typedef struct _serial_manager_block_handle
138 {
139     serial_manager_type_t handleType;
140     serial_port_type_t type;
141     serial_manager_read_handle_t *volatile openedReadHandleHead;
142     volatile uint32_t openedWriteHandleCount;
143     union
144     {
145         uint32_t lowLevelhandleBuffer[1];
146 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
147         uint8_t uartHandleBuffer[SERIAL_PORT_UART_BLOCK_HANDLE_SIZE];
148 #endif
149     };
150 
151 } serial_manager_block_handle_t;
152 #endif
153 
154 /* The serial manager handle structure */
155 typedef struct _serial_manager_handle
156 {
157 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
158     serial_manager_type_t handleType;
159 #endif
160     serial_port_type_t serialPortType;
161     serial_manager_read_handle_t *volatile openedReadHandleHead;
162     volatile uint32_t openedWriteHandleCount;
163     union
164     {
165         uint32_t lowLevelhandleBuffer[1];
166 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
167         uint8_t uartHandleBuffer[SERIAL_PORT_UART_HANDLE_SIZE];
168 #endif
169 #if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))
170         uint8_t uartDmaHandleBuffer[SERIAL_PORT_UART_DMA_HANDLE_SIZE];
171 #endif
172 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
173         uint8_t usbcdcHandleBuffer[SERIAL_PORT_USB_CDC_HANDLE_SIZE];
174 #endif
175 #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
176         uint8_t swoHandleBuffer[SERIAL_PORT_SWO_HANDLE_SIZE];
177 #endif
178 #if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
179         uint8_t usbcdcVirtualHandleBuffer[SERIAL_PORT_VIRTUAL_HANDLE_SIZE];
180 #endif
181 #if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))
182         uint8_t rpmsgHandleBuffer[SERIAL_PORT_RPMSG_HANDLE_SIZE];
183 #endif
184 #if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))
185         uint8_t spiMasterHandleBuffer[SERIAL_PORT_SPI_MASTER_HANDLE_SIZE];
186 #endif
187 #if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))
188         uint8_t spiSlaveHandleBuffer[SERIAL_PORT_SPI_SLAVE_HANDLE_SIZE];
189 #endif
190 #if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))
191         uint8_t bleWuHandleBuffer[SERIAL_PORT_BLE_WU_HANDLE_SIZE];
192 #endif
193     };
194 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
195     serial_manager_read_ring_buffer_t ringBuffer;
196 #endif
197 
198 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
199 
200 #if defined(OSA_USED)
201 
202 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
203     common_task_message_t commontaskMsg;
204 #else
205     OSA_SEMAPHORE_HANDLE_DEFINE(serSemaphore); /*!< Semaphore instance */
206     OSA_TASK_HANDLE_DEFINE(taskId);            /*!< Task handle */
207 #endif
208     uint8_t serialManagerState[SERIAL_EVENT_DATA_NUMBER]; /*!< Used to indicate the serial mnager state */
209 
210 #endif
211 
212 #endif
213 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
214     list_label_t runningWriteHandleHead;   /*!< The queue of running write handle */
215     list_label_t completedWriteHandleHead; /*!< The queue of completed write handle */
216 #endif
217 
218 } serial_manager_handle_t;
219 
220 /*******************************************************************************
221  * Prototypes
222  ******************************************************************************/
223 
224 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
225 static void SerialManager_Task(void *param);
226 #endif
227 
228 /*******************************************************************************
229  * Variables
230  ******************************************************************************/
231 
232 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
233 
234 #if defined(OSA_USED)
235 
236 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
237 
238 #else
239                                                /*
240                                                 * \brief Defines the serial manager task's stack
241                                                 */
242 static OSA_TASK_DEFINE(SerialManager_Task, SERIAL_MANAGER_TASK_PRIORITY, 1, SERIAL_MANAGER_TASK_STACK_SIZE, false);
243 #endif
244 
245 #endif
246 
247 #endif
248 static const serial_manager_lowpower_critical_CBs_t *s_pfserialLowpowerCriticalCallbacks = NULL;
249 /*******************************************************************************
250  * Code
251  ******************************************************************************/
252 
253 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
SerialManager_AddTail(list_label_t * queue,serial_manager_write_handle_t * node)254 static void SerialManager_AddTail(list_label_t *queue, serial_manager_write_handle_t *node)
255 {
256     (void)LIST_AddTail(queue, &node->link);
257 }
258 
SerialManager_RemoveHead(list_label_t * queue)259 static void SerialManager_RemoveHead(list_label_t *queue)
260 {
261     (void)LIST_RemoveHead(queue);
262 }
263 
SerialManager_SetLpConstraint(int32_t power_mode)264 static int32_t SerialManager_SetLpConstraint(int32_t power_mode)
265 {
266     int32_t status = -1;
267     if ((s_pfserialLowpowerCriticalCallbacks != NULL) &&
268         (s_pfserialLowpowerCriticalCallbacks->serialEnterLowpowerCriticalFunc != NULL))
269     {
270         status = s_pfserialLowpowerCriticalCallbacks->serialEnterLowpowerCriticalFunc(power_mode);
271     }
272     return status;
273 }
SerialManager_ReleaseLpConstraint(int32_t power_mode)274 static int32_t SerialManager_ReleaseLpConstraint(int32_t power_mode)
275 {
276     int32_t status = -1;
277     if ((s_pfserialLowpowerCriticalCallbacks != NULL) &&
278         (s_pfserialLowpowerCriticalCallbacks->serialExitLowpowerCriticalFunc != NULL))
279     {
280         status = s_pfserialLowpowerCriticalCallbacks->serialExitLowpowerCriticalFunc(power_mode);
281     }
282     return status;
283 }
284 #endif
285 
286 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
287 
SerialManager_StartWriting(serial_manager_handle_t * serHandle)288 static serial_manager_status_t SerialManager_StartWriting(serial_manager_handle_t *serHandle)
289 {
290     serial_manager_status_t status = kStatus_SerialManager_Error;
291     serial_manager_write_handle_t *writeHandle =
292         (serial_manager_write_handle_t *)(void *)LIST_GetHead(&serHandle->runningWriteHandleHead);
293 
294     if (writeHandle != NULL)
295     {
296         (void)SerialManager_SetLpConstraint(gSerialManagerLpConstraint_c);
297         switch (serHandle->serialPortType)
298         {
299 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
300             case kSerialPort_Uart:
301                 status = Serial_UartWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
302                                           writeHandle->transfer.buffer, writeHandle->transfer.length);
303                 break;
304 #endif
305 #if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))
306             case kSerialPort_UartDma:
307                 status = Serial_UartDmaWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
308                                              writeHandle->transfer.buffer, writeHandle->transfer.length);
309                 break;
310 #endif
311 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
312             case kSerialPort_UsbCdc:
313                 status = Serial_UsbCdcWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
314                                             writeHandle->transfer.buffer, writeHandle->transfer.length);
315                 break;
316 #endif
317 #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
318             case kSerialPort_Swo:
319                 status = Serial_SwoWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
320                                          writeHandle->transfer.buffer, writeHandle->transfer.length);
321                 break;
322 #endif
323 #if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
324             case kSerialPort_Virtual:
325                 status = Serial_PortVirtualWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
326                                                  writeHandle->transfer.buffer, writeHandle->transfer.length);
327                 break;
328 #endif
329 #if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))
330             case kSerialPort_Rpmsg:
331                 status = Serial_RpmsgWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
332                                            writeHandle->transfer.buffer, writeHandle->transfer.length);
333                 break;
334 #endif
335 #if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))
336             case kSerialPort_SpiMaster:
337                 status = Serial_SpiMasterWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
338                                                writeHandle->transfer.buffer, writeHandle->transfer.length);
339                 break;
340 #endif
341 #if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))
342             case kSerialPort_SpiSlave:
343                 status = Serial_SpiSlaveWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
344                                               writeHandle->transfer.buffer, writeHandle->transfer.length);
345                 break;
346 #endif
347 #if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))
348             case kSerialPort_BleWu:
349                 status = Serial_PortBleWuWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
350                                                writeHandle->transfer.buffer, writeHandle->transfer.length);
351                 break;
352 #endif
353 
354             default:
355                 status = kStatus_SerialManager_Error;
356                 break;
357         }
358         if (kStatus_SerialManager_Success != status)
359         {
360             (void)SerialManager_ReleaseLpConstraint(gSerialManagerLpConstraint_c);
361         }
362     }
363     return status;
364 }
365 
SerialManager_StartReading(serial_manager_handle_t * serHandle,serial_manager_read_handle_t * readHandle,uint8_t * buffer,uint32_t length)366 static serial_manager_status_t SerialManager_StartReading(serial_manager_handle_t *serHandle,
367                                                           serial_manager_read_handle_t *readHandle,
368                                                           uint8_t *buffer,
369                                                           uint32_t length)
370 {
371     serial_manager_status_t status = kStatus_SerialManager_Error;
372 
373     if (NULL != readHandle)
374     {
375 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
376         if (kSerialPort_Uart == serHandle->serialPortType) /* Serial port UART */
377         {
378             status = Serial_UartRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
379         }
380 #endif
381 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
382         if (serHandle->serialPortType == kSerialPort_UsbCdc)
383         {
384             status = Serial_UsbCdcRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
385         }
386 #endif
387 #if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
388         if (serHandle->serialPortType == kSerialPort_Virtual)
389         {
390             status = Serial_PortVirtualRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
391         }
392 #endif
393 #if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))
394         if (serHandle->serialPortType == kSerialPort_SpiMaster)
395         {
396             status = Serial_SpiMasterRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
397         }
398 #endif
399 #if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))
400         if (serHandle->serialPortType == kSerialPort_SpiSlave)
401         {
402             status = Serial_SpiSlaveRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
403         }
404 #endif
405 
406 #if 0
407 #if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))
408         if (serHandle->serialPortType == kSerialPort_Rpmsg)
409         {
410             status = Serial_RpmsgRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
411         }
412 #endif
413 #endif
414 #if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))
415         if (serHandle->serialPortType == kSerialPort_BleWu)
416         {
417             status = Serial_PortBleWuRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
418         }
419 #endif
420     }
421     return status;
422 }
423 
424 #else /*SERIAL_MANAGER_NON_BLOCKING_MODE > 0U*/
425 
SerialManager_StartWriting(serial_manager_handle_t * serHandle,serial_manager_write_handle_t * writeHandle,uint8_t * buffer,uint32_t length)426 static serial_manager_status_t SerialManager_StartWriting(serial_manager_handle_t *serHandle,
427                                                           serial_manager_write_handle_t *writeHandle,
428                                                           uint8_t *buffer,
429                                                           uint32_t length)
430 {
431     serial_manager_status_t status = kStatus_SerialManager_Error;
432 
433 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
434     if (kSerialPort_Uart == serHandle->serialPortType) /* Serial port UART */
435     {
436         status = Serial_UartWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
437     }
438     else
439 #endif
440 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
441         if (kSerialPort_UsbCdc == serHandle->serialPortType) /* Serial port UsbCdc */
442     {
443         status = Serial_UsbCdcWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
444     }
445     else
446 #endif
447 #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
448         if (kSerialPort_Swo == serHandle->serialPortType) /* Serial port SWO */
449     {
450         status = Serial_SwoWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
451     }
452     else
453 #endif
454 #if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
455         if (kSerialPort_Virtual == serHandle->serialPortType) /* Serial port UsbCdcVirtual */
456     {
457         status = Serial_PortVirtualWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
458     }
459     else
460 #endif
461 #if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))
462         if (kSerialPort_Rpmsg == serHandle->serialPortType) /* Serial port Rpmsg */
463     {
464         status = Serial_RpmsgWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
465     }
466     else
467 #endif
468 #if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))
469         if (kSerialPort_SpiMaster == serHandle->serialPortType) /* Serial port Spi Master */
470     {
471         status = Serial_SpiMasterWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
472     }
473     else
474 #endif
475 #if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))
476         if (kSerialPort_BleWu == serHandle->serialPortType) /* Serial port BLE WU */
477     {
478         status = Serial_PortBleWuWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
479     }
480     else
481 #endif
482     {
483         /*MISRA rule*/
484     }
485     return status;
486 }
487 
SerialManager_StartReading(serial_manager_handle_t * serHandle,serial_manager_read_handle_t * readHandle,uint8_t * buffer,uint32_t length)488 static serial_manager_status_t SerialManager_StartReading(serial_manager_handle_t *serHandle,
489                                                           serial_manager_read_handle_t *readHandle,
490                                                           uint8_t *buffer,
491                                                           uint32_t length)
492 {
493     serial_manager_status_t status = kStatus_SerialManager_Error;
494 
495 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
496     if (kSerialPort_Uart == serHandle->serialPortType) /* Serial port UART */
497     {
498         status = Serial_UartRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
499     }
500     else
501 #endif
502 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
503         if (kSerialPort_UsbCdc == serHandle->serialPortType) /* Serial port UsbCdc */
504     {
505         status = Serial_UsbCdcRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
506     }
507     else
508 #endif
509 #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
510         if (kSerialPort_Swo == serHandle->serialPortType) /* Serial port SWO */
511     {
512         status = Serial_SwoRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
513     }
514     else
515 #endif
516 #if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
517         if (kSerialPort_Virtual == serHandle->serialPortType) /* Serial port UsbCdcVirtual */
518     {
519         status = Serial_PortVirtualRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
520     }
521     else
522 #endif
523 #if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))
524         if (kSerialPort_Rpmsg == serHandle->serialPortType) /* Serial port UsbCdcVirtual */
525     {
526         status = Serial_RpmsgRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
527     }
528     else
529 #endif
530 #if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))
531         if (kSerialPort_SpiMaster == serHandle->serialPortType) /* Serial port Spi Master */
532     {
533         status = Serial_SpiMasterRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
534     }
535     else
536 #endif
537 #if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))
538         if (kSerialPort_BleWu == serHandle->serialPortType) /* Serial port BLE WU */
539     {
540         status = Serial_PortBleWuRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);
541     }
542     else
543 #endif
544     {
545         /*MISRA rule*/
546     }
547     return status;
548 }
549 #endif /*SERIAL_MANAGER_NON_BLOCKING_MODE > 0U*/
550 
551 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
SerialManager_IsrFunction(serial_manager_handle_t * serHandle)552 static void SerialManager_IsrFunction(serial_manager_handle_t *serHandle)
553 {
554     uint32_t regPrimask = DisableGlobalIRQ();
555     switch (serHandle->serialPortType)
556     {
557 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
558         case kSerialPort_Uart:
559             Serial_UartIsrFunction(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
560             break;
561 #endif
562 #if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))
563         case kSerialPort_UartDma:
564             Serial_UartIsrFunction(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
565             break;
566 #endif
567 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
568         case kSerialPort_UsbCdc:
569             Serial_UsbCdcIsrFunction(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
570             break;
571 #endif
572 #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
573         case kSerialPort_Swo:
574             Serial_SwoIsrFunction(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
575             break;
576 #endif
577 #if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
578         case kSerialPort_Virtual:
579             Serial_PortVirtualIsrFunction(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
580             break;
581 #endif
582 #if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))
583         case kSerialPort_BleWu:
584             Serial_PortBleWuIsrFunction(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
585             break;
586 #endif
587         default:
588             /*MISRA rule 16.4*/
589             break;
590     }
591     EnableGlobalIRQ(regPrimask);
592 }
593 
SerialManager_Task(void * param)594 static void SerialManager_Task(void *param)
595 {
596     serial_manager_handle_t *serHandle = (serial_manager_handle_t *)param;
597     serial_manager_write_handle_t *serialWriteHandle;
598     serial_manager_read_handle_t *serialReadHandle;
599     uint32_t primask;
600     serial_manager_callback_message_t serialMsg;
601 #if (defined(SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY) && (SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY > 0U))
602     uint32_t ringBufferLength;
603 #endif /* SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY */
604 
605     if (NULL != serHandle)
606     {
607 #if defined(OSA_USED)
608 
609 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
610 #else
611 
612         do
613         {
614             if (KOSA_StatusSuccess ==
615                 OSA_SemaphoreWait((osa_semaphore_handle_t)serHandle->serSemaphore, osaWaitForever_c))
616             {
617 #endif
618 #endif
619 #if defined(OSA_USED)
620 
621 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
622 #else
623                 primask     = DisableGlobalIRQ();
624                 uint8_t *ev = serHandle->serialManagerState;
625                 EnableGlobalIRQ(primask);
626                 if (0U != (ev[SERIAL_EVENT_DATA_START_SEND]))
627 #endif
628 #endif
629         {
630 #if defined(OSA_USED)
631 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
632 #else
633                     (void)SerialManager_StartWriting(serHandle);
634                     primask = DisableGlobalIRQ();
635                     serHandle->serialManagerState[SERIAL_EVENT_DATA_START_SEND]--;
636                     EnableGlobalIRQ(primask);
637 #endif
638 #endif
639         }
640 #if defined(OSA_USED)
641 
642 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
643 #else
644                 if (0U != (ev[SERIAL_EVENT_DATA_SENT]))
645 #endif
646 
647 #endif
648         {
649             serialWriteHandle =
650                 (serial_manager_write_handle_t *)(void *)LIST_GetHead(&serHandle->completedWriteHandleHead);
651             while (NULL != serialWriteHandle)
652             {
653                 SerialManager_RemoveHead(&serHandle->completedWriteHandleHead);
654                 serialMsg.buffer                   = serialWriteHandle->transfer.buffer;
655                 serialMsg.length                   = serialWriteHandle->transfer.soFar;
656                 serialWriteHandle->transfer.buffer = NULL;
657                 if (NULL != serialWriteHandle->callback)
658                 {
659                     serialWriteHandle->callback(serialWriteHandle->callbackParam, &serialMsg,
660                                                 serialWriteHandle->transfer.status);
661                 }
662                 serialWriteHandle =
663                     (serial_manager_write_handle_t *)(void *)LIST_GetHead(&serHandle->completedWriteHandleHead);
664                 (void)SerialManager_ReleaseLpConstraint(gSerialManagerLpConstraint_c);
665             }
666 #if defined(OSA_USED)
667 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
668 #else
669                     primask = DisableGlobalIRQ();
670                     serHandle->serialManagerState[SERIAL_EVENT_DATA_SENT]--;
671                     EnableGlobalIRQ(primask);
672 #endif
673 #endif
674         }
675 #if defined(OSA_USED)
676 
677 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
678 #else
679                 if (0U != (ev[SERIAL_EVENT_DATA_RECEIVED]))
680 #endif
681 
682 #endif
683         {
684             primask          = DisableGlobalIRQ();
685             serialReadHandle = serHandle->openedReadHandleHead;
686             EnableGlobalIRQ(primask);
687 
688             if (NULL != serialReadHandle)
689             {
690                 if (NULL != serialReadHandle->transfer.buffer)
691                 {
692                     if (serialReadHandle->transfer.soFar >= serialReadHandle->transfer.length)
693                     {
694                         serialMsg.buffer                  = serialReadHandle->transfer.buffer;
695                         serialMsg.length                  = serialReadHandle->transfer.soFar;
696                         serialReadHandle->transfer.buffer = NULL;
697                         if (NULL != serialReadHandle->callback)
698                         {
699                             serialReadHandle->callback(serialReadHandle->callbackParam, &serialMsg,
700                                                        serialReadHandle->transfer.status);
701                         }
702                     }
703                 }
704             }
705 #if defined(OSA_USED)
706 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
707 #else
708                     primask = DisableGlobalIRQ();
709                     serHandle->serialManagerState[SERIAL_EVENT_DATA_RECEIVED]--;
710                     EnableGlobalIRQ(primask);
711 #endif
712 #endif
713         }
714 
715 #if (defined(SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY) && (SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY > 0U))
716 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
717 #else
718                 if (0U != (ev[SERIAL_EVENT_DATA_RX_NOTIFY]))
719 #endif
720         {
721             primask                                                 = DisableGlobalIRQ();
722             serHandle->serialManagerState[SERIAL_EVENT_DATA_RX_NOTIFY] = 0;
723             ringBufferLength =
724                 serHandle->ringBuffer.ringHead + serHandle->ringBuffer.ringBufferSize - serHandle->ringBuffer.ringTail;
725             ringBufferLength = ringBufferLength % serHandle->ringBuffer.ringBufferSize;
726             EnableGlobalIRQ(primask);
727             /* Notify there are data in ringbuffer */
728             if (0U != ringBufferLength)
729             {
730                 serialMsg.buffer = NULL;
731                 serialMsg.length = ringBufferLength;
732                 if ((NULL != serHandle->openedReadHandleHead) && (NULL != serHandle->openedReadHandleHead->callback))
733                 {
734                     serHandle->openedReadHandleHead->callback(serHandle->openedReadHandleHead->callbackParam, &serialMsg,
735                                                            kStatus_SerialManager_Notify);
736                 }
737             }
738         }
739 #endif /* SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY */
740 
741 #if defined(OSA_USED)
742 
743 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
744 #else
745             }
746         } while (0U != gUseRtos_c);
747 #endif
748 
749 #endif
750     }
751 }
752 #endif
753 
754 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
755 static void SerialManager_TxCallback(void *callbackParam,
756                                      serial_manager_callback_message_t *message,
757                                      serial_manager_status_t status)
758 {
759     serial_manager_handle_t *serHandle;
760     serial_manager_write_handle_t *writeHandle;
761 #if (defined(OSA_USED))
762 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
763     /* Need to support common_task. */
764 #else /* SERIAL_MANAGER_USE_COMMON_TASK */
765     uint32_t primask;
766 #endif
767 #endif
768     assert(NULL != callbackParam);
769     assert(NULL != message);
770 
771     serHandle = (serial_manager_handle_t *)callbackParam;
772 
773     writeHandle = (serial_manager_write_handle_t *)(void *)LIST_GetHead(&serHandle->runningWriteHandleHead);
774 
775     if (NULL != writeHandle)
776     {
777         SerialManager_RemoveHead(&serHandle->runningWriteHandleHead);
778 
779 #if (defined(OSA_USED) && defined(SERIAL_MANAGER_TASK_HANDLE_TX) && (SERIAL_MANAGER_TASK_HANDLE_TX == 1))
780 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
781         /* Need to support common_task. */
782 #else  /* SERIAL_MANAGER_USE_COMMON_TASK */
783         primask = DisableGlobalIRQ();
784         serHandle->serialManagerState[SERIAL_EVENT_DATA_START_SEND]++;
785         EnableGlobalIRQ(primask);
786         (void)OSA_SemaphorePost((osa_semaphore_handle_t)serHandle->serSemaphore);
787 
788 #endif /* SERIAL_MANAGER_USE_COMMON_TASK */
789 #else  /* OSA_USED && SERIAL_MANAGER_TASK_HANDLE_TX */
790        (void)SerialManager_StartWriting(serHandle);
791 #endif /* OSA_USED && SERIAL_MANAGER_TASK_HANDLE_TX */
792 
793         writeHandle->transfer.soFar  = message->length;
794         writeHandle->transfer.status = status;
795         if (kSerialManager_TransmissionNonBlocking == writeHandle->transfer.mode)
796         {
797             SerialManager_AddTail(&serHandle->completedWriteHandleHead, writeHandle);
798 #if defined(OSA_USED)
799 
800 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
801             serHandle->commontaskMsg.callback      = SerialManager_Task;
802             serHandle->commontaskMsg.callbackParam = serHandle;
803             COMMON_TASK_post_message(&serHandle->commontaskMsg);
804 #else
805             primask = DisableGlobalIRQ();
806             serHandle->serialManagerState[SERIAL_EVENT_DATA_SENT]++;
807             EnableGlobalIRQ(primask);
808             (void)OSA_SemaphorePost((osa_semaphore_handle_t)serHandle->serSemaphore);
809 #endif
810 
811 #else
812             SerialManager_Task(serHandle);
813 #endif
814         }
815         else
816         {
817             writeHandle->transfer.buffer = NULL;
818             (void)SerialManager_ReleaseLpConstraint(gSerialManagerLpConstraint_c);
819         }
820     }
821 }
822 
823 void SerialManager_RxCallback(void *callbackParam,
824                               serial_manager_callback_message_t *message,
825                               serial_manager_status_t status);
826 void SerialManager_RxCallback(void *callbackParam,
827                               serial_manager_callback_message_t *message,
828                               serial_manager_status_t status)
829 {
830     serial_manager_handle_t *serHandle;
831 #if (!((defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))) && \
832      !((defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))))
833     uint32_t ringBufferLength = 0;
834     uint32_t primask;
835 #endif
836     assert(NULL != callbackParam);
837     assert(NULL != message);
838 
839     serHandle = (serial_manager_handle_t *)callbackParam;
840 #if ((defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U)) || \
841      (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U)))
842     serHandle->openedReadHandleHead->transfer.status = kStatus_SerialManager_Success;
843     serHandle->openedReadHandleHead->transfer.soFar  = message->length;
844     serHandle->openedReadHandleHead->transfer.length = message->length;
845     serHandle->openedReadHandleHead->transfer.buffer = message->buffer;
846 #if defined(OSA_USED)
847 
848 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
849     serHandle->commontaskMsg.callback      = SerialManager_Task;
850     serHandle->commontaskMsg.callbackParam = serHandle;
851     COMMON_TASK_post_message(&serHandle->commontaskMsg);
852 #else
853     primask = DisableGlobalIRQ();
854     serHandle->serialManagerState[SERIAL_EVENT_DATA_RECEIVED]++;
855     EnableGlobalIRQ(primask);
856     (void)OSA_SemaphorePost((osa_semaphore_handle_t)serHandle->serSemaphore);
857 #endif
858 
859 #else
860     SerialManager_Task(serHandle);
861 #endif
862 #else
863     status = kStatus_SerialManager_Notify;
864 
865     primask = DisableGlobalIRQ();
866 
867     /* If wrap around is expected copy byte one after the other. Note that this could also be done with 2 memcopy for
868      * better efficiency. */
869     if (serHandle->ringBuffer.ringHead + message->length >= serHandle->ringBuffer.ringBufferSize)
870     {
871         for (uint32_t i = 0; i < message->length; i++)
872         {
873             serHandle->ringBuffer.ringBuffer[serHandle->ringBuffer.ringHead++] = message->buffer[i];
874 
875             if (serHandle->ringBuffer.ringHead >= serHandle->ringBuffer.ringBufferSize)
876             {
877                 serHandle->ringBuffer.ringHead = 0U;
878             }
879             if (serHandle->ringBuffer.ringHead == serHandle->ringBuffer.ringTail)
880             {
881                 status = kStatus_SerialManager_RingBufferOverflow;
882                 serHandle->ringBuffer.ringTail++;
883                 if (serHandle->ringBuffer.ringTail >= serHandle->ringBuffer.ringBufferSize)
884                 {
885                     serHandle->ringBuffer.ringTail = 0U;
886                 }
887             }
888         }
889     }
890     else /*No wrap is expected so do a memcpy*/
891     {
892         (void)memcpy(&serHandle->ringBuffer.ringBuffer[serHandle->ringBuffer.ringHead], message->buffer,
893                      message->length);
894         serHandle->ringBuffer.ringHead += message->length;
895     }
896 
897     ringBufferLength =
898         serHandle->ringBuffer.ringHead + serHandle->ringBuffer.ringBufferSize - serHandle->ringBuffer.ringTail;
899     ringBufferLength = ringBufferLength % serHandle->ringBuffer.ringBufferSize;
900 
901     if ((NULL != serHandle->openedReadHandleHead) && (NULL != serHandle->openedReadHandleHead->transfer.buffer))
902     {
903         if (serHandle->openedReadHandleHead->transfer.length > serHandle->openedReadHandleHead->transfer.soFar)
904         {
905             uint32_t remainLength =
906                 serHandle->openedReadHandleHead->transfer.length - serHandle->openedReadHandleHead->transfer.soFar;
907             for (uint32_t i = 0; i < MIN(ringBufferLength, remainLength); i++)
908             {
909                 serHandle->openedReadHandleHead->transfer.buffer[serHandle->openedReadHandleHead->transfer.soFar] =
910                     serHandle->ringBuffer.ringBuffer[serHandle->ringBuffer.ringTail];
911                 serHandle->ringBuffer.ringTail++;
912                 serHandle->openedReadHandleHead->transfer.soFar++;
913                 if (serHandle->ringBuffer.ringTail >= serHandle->ringBuffer.ringBufferSize)
914                 {
915                     serHandle->ringBuffer.ringTail = 0U;
916                 }
917             }
918             ringBufferLength = ringBufferLength - MIN(ringBufferLength, remainLength);
919         }
920 
921         if (serHandle->openedReadHandleHead->transfer.length > serHandle->openedReadHandleHead->transfer.soFar)
922         {
923         }
924         else
925         {
926             if (kSerialManager_TransmissionBlocking == serHandle->openedReadHandleHead->transfer.mode)
927             {
928                 serHandle->openedReadHandleHead->transfer.buffer = NULL;
929             }
930             else
931             {
932                 serHandle->openedReadHandleHead->transfer.status = kStatus_SerialManager_Success;
933 
934 #if defined(OSA_USED)
935 
936 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
937                 serHandle->commontaskMsg.callback                = SerialManager_Task;
938                 serHandle->commontaskMsg.callbackParam           = serHandle;
939                 COMMON_TASK_post_message(&serHandle->commontaskMsg);
940 #else
941                 serHandle->serialManagerState[SERIAL_EVENT_DATA_RECEIVED]++;
942                 (void)OSA_SemaphorePost((osa_semaphore_handle_t)serHandle->serSemaphore);
943 #endif
944 
945 #else
946                 SerialManager_Task(serHandle);
947 #endif
948             }
949         }
950     }
951 #if (defined(SERIAL_MANAGER_RING_BUFFER_FLOWCONTROL) && (SERIAL_MANAGER_RING_BUFFER_FLOWCONTROL > 0U))
952     uint32_t ringBufferWaterMark =
953         serHandle->ringBuffer.ringHead + serHandle->ringBuffer.ringBufferSize - serHandle->ringBuffer.ringTail;
954     ringBufferWaterMark = ringBufferWaterMark % serHandle->ringBuffer.ringBufferSize;
955     if (ringBufferWaterMark < (uint32_t)(serHandle->ringBuffer.ringBufferSize * RINGBUFFER_WATERMARK_THRESHOLD))
956     {
957         (void)SerialManager_StartReading(serHandle, serHandle->openedReadHandleHead, NULL, ringBufferLength);
958     }
959 #else
960     (void)SerialManager_StartReading(serHandle, serHandle->openedReadHandleHead, NULL, ringBufferLength);
961 #endif
962     if (0U != ringBufferLength)
963     {
964 #if (defined(SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY) && (SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY > 0U))
965         if (serHandle->serialManagerState[SERIAL_EVENT_DATA_RX_NOTIFY] == 0)
966         {
967             serHandle->serialManagerState[SERIAL_EVENT_DATA_RX_NOTIFY]++;
968             (void)OSA_SemaphorePost((osa_semaphore_handle_t)serHandle->serSemaphore);
969         }
970 
971         (void)status; /* Fix "set but never used" warning. */
972 #else  /* !SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY */
973         message->buffer = NULL;
974         message->length = ringBufferLength;
975         if ((NULL != serHandle->openedReadHandleHead) && (NULL != serHandle->openedReadHandleHead->callback))
976         {
977             serHandle->openedReadHandleHead->callback(serHandle->openedReadHandleHead->callbackParam, message, status);
978         }
979 #endif /* SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY */
980     }
981 
982 #if (!((defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))) && \
983      !((defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))))
984     if (kSerialManager_Blocking ==
985         serHandle->handleType) /* No need to check for (NULL != serHandle->openedReadHandleHead) condition as it is
986                                already done in SerialManager_StartReading() */
987 #else
988     if (NULL != serHandle->openedReadHandleHead)
989 #endif
990     {
991         ringBufferLength = serHandle->ringBuffer.ringBufferSize - 1U - ringBufferLength;
992         (void)SerialManager_StartReading(serHandle, serHandle->openedReadHandleHead, NULL, ringBufferLength);
993     }
994     EnableGlobalIRQ(primask);
995 #endif
996 }
997 
998 /*
999  * This function is used for perdiodic check if the transfer is complete, and will be called in blocking transfer at
1000  * non-blocking mode. The perdiodic unit is ms and default value is define by
1001  * SERIAL_MANAGER_WRITE_TIME_DELAY_DEFAULT_VALUE/SERIAL_MANAGER_READ_TIME_DELAY_DEFAULT_VALUE. The function
1002  * SerialManager_WriteTimeDelay()/SerialManager_ReadTimeDelay() is a weak function, so it could be re-implemented by
1003  * upper layer.
1004  */
1005 __WEAK_FUNC void SerialManager_WriteTimeDelay(uint32_t ms);
1006 __WEAK_FUNC void SerialManager_WriteTimeDelay(uint32_t ms)
1007 {
1008 #if defined(OSA_USED)
1009     OSA_TimeDelay(ms);
1010 #endif
1011 }
1012 
1013 __WEAK_FUNC void SerialManager_ReadTimeDelay(uint32_t ms);
1014 __WEAK_FUNC void SerialManager_ReadTimeDelay(uint32_t ms)
1015 {
1016 #if defined(OSA_USED)
1017     OSA_TimeDelay(ms);
1018 #endif
1019 }
1020 
1021 static serial_manager_status_t SerialManager_Write(serial_write_handle_t writeHandle,
1022                                                    uint8_t *buffer,
1023                                                    uint32_t length,
1024                                                    serial_manager_transmission_mode_t mode)
1025 {
1026     serial_manager_write_handle_t *serialWriteHandle;
1027     serial_manager_handle_t *serHandle;
1028 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
1029     serial_manager_status_t status = kStatus_SerialManager_Success;
1030 #endif /* SERIAL_PORT_TYPE_USBCDC */
1031     uint32_t primask;
1032     uint8_t isEmpty = 0U;
1033 
1034     assert(NULL != writeHandle);
1035     assert(NULL != buffer);
1036     assert(length > 0U);
1037 
1038     serialWriteHandle = (serial_manager_write_handle_t *)writeHandle;
1039     serHandle         = serialWriteHandle->serialManagerHandle;
1040     assert(NULL != serHandle);
1041 
1042     assert(SERIAL_MANAGER_WRITE_TAG == serialWriteHandle->tag);
1043     assert(!((kSerialManager_TransmissionNonBlocking == mode) && (NULL == serialWriteHandle->callback)));
1044 
1045     primask = DisableGlobalIRQ();
1046     if (NULL != serialWriteHandle->transfer.buffer)
1047     {
1048         EnableGlobalIRQ(primask);
1049         return kStatus_SerialManager_Busy;
1050     }
1051     serialWriteHandle->transfer.buffer = buffer;
1052     serialWriteHandle->transfer.length = length;
1053     serialWriteHandle->transfer.soFar  = 0U;
1054     serialWriteHandle->transfer.mode   = mode;
1055 
1056     if (NULL == LIST_GetHead(&serHandle->runningWriteHandleHead))
1057     {
1058         isEmpty = 1U;
1059     }
1060     SerialManager_AddTail(&serHandle->runningWriteHandleHead, serialWriteHandle);
1061     EnableGlobalIRQ(primask);
1062 
1063     if (0U != isEmpty)
1064     {
1065 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
1066     if (serHandle->serialPortType == kSerialPort_UsbCdc)
1067     {
1068         status = Serial_UsbCdcGetConnectedStatus((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]);
1069         if (status == kStatus_SerialManager_NotConnected)
1070         {
1071             SerialManager_RemoveHead(&serHandle->runningWriteHandleHead);
1072             serialWriteHandle->transfer.buffer = NULL;
1073             serialWriteHandle->transfer.length = 0U;
1074             return status;
1075         }
1076     }
1077 #endif /* SERIAL_PORT_TYPE_USBCDC */
1078 #if (defined(OSA_USED) && defined(SERIAL_MANAGER_TASK_HANDLE_TX) && (SERIAL_MANAGER_TASK_HANDLE_TX == 1))
1079 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
1080         /* Need to support common_task. */
1081 #else  /* SERIAL_MANAGER_USE_COMMON_TASK */
1082         if ((kSerialManager_TransmissionBlocking == mode) && (0U == gUseRtos_c))
1083         {
1084             (void)SerialManager_StartWriting(serHandle);
1085         }
1086         else
1087         {
1088             primask = DisableGlobalIRQ();
1089             serHandle->serialManagerState[SERIAL_EVENT_DATA_START_SEND]++;
1090             EnableGlobalIRQ(primask);
1091             (void)OSA_SemaphorePost((osa_semaphore_handle_t)serHandle->serSemaphore);
1092         }
1093 #endif /* SERIAL_MANAGER_USE_COMMON_TASK */
1094 #else  /* OSA_USED && SERIAL_MANAGER_TASK_HANDLE_TX */
1095         (void)SerialManager_StartWriting(serHandle);
1096 #endif /* OSA_USED && SERIAL_MANAGER_TASK_HANDLE_TX */
1097     }
1098 
1099     if (kSerialManager_TransmissionBlocking == mode)
1100     {
1101         while (serialWriteHandle->transfer.length > serialWriteHandle->transfer.soFar)
1102         {
1103             if (SerialManager_needPollingIsr())
1104             {
1105                 SerialManager_IsrFunction(serHandle);
1106             }
1107             else
1108             {
1109                 SerialManager_WriteTimeDelay(SERIAL_MANAGER_WRITE_TIME_DELAY_DEFAULT_VALUE);
1110             }
1111         }
1112     }
1113     return kStatus_SerialManager_Success;
1114 }
1115 
1116 static serial_manager_status_t SerialManager_Read(serial_read_handle_t readHandle,
1117                                                   uint8_t *buffer,
1118                                                   uint32_t length,
1119                                                   serial_manager_transmission_mode_t mode,
1120                                                   uint32_t *receivedLength)
1121 {
1122     serial_manager_read_handle_t *serialReadHandle;
1123     serial_manager_handle_t *serHandle;
1124     uint32_t dataLength;
1125     uint32_t primask;
1126 
1127     assert(NULL != readHandle);
1128     assert(NULL != buffer);
1129     assert(length > 0U);
1130 
1131     serialReadHandle = (serial_manager_read_handle_t *)readHandle;
1132 
1133     serHandle = serialReadHandle->serialManagerHandle;
1134     assert(NULL != serHandle);
1135 
1136     assert(SERIAL_MANAGER_READ_TAG == serialReadHandle->tag);
1137     assert(!((kSerialManager_TransmissionNonBlocking == mode) && (NULL == serialReadHandle->callback)));
1138 
1139     primask = DisableGlobalIRQ();
1140     if (NULL != serialReadHandle->transfer.buffer)
1141     {
1142         EnableGlobalIRQ(primask);
1143         return kStatus_SerialManager_Busy;
1144     }
1145     serialReadHandle->transfer.buffer = buffer;
1146     serialReadHandle->transfer.length = length;
1147     serialReadHandle->transfer.soFar  = 0U;
1148     serialReadHandle->transfer.mode   = mode;
1149 
1150     /* This code is reached if (serHandle->handleType != kSerialManager_Blocking)*/
1151 #if (!((defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))) && \
1152      !((defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))))
1153     if (length == 1U)
1154     {
1155         if (serHandle->ringBuffer.ringHead != serHandle->ringBuffer.ringTail)
1156         {
1157             buffer[serialReadHandle->transfer.soFar++] =
1158                 serHandle->ringBuffer.ringBuffer[serHandle->ringBuffer.ringTail];
1159             serHandle->ringBuffer.ringTail++;
1160             if (serHandle->ringBuffer.ringTail >= serHandle->ringBuffer.ringBufferSize)
1161             {
1162                 serHandle->ringBuffer.ringTail = 0U;
1163             }
1164         }
1165     }
1166     else
1167 #endif /*(!defined(SERIAL_PORT_TYPE_USBCDC) && !defined(SERIAL_PORT_TYPE_VIRTUAL))*/
1168     {
1169         dataLength =
1170             serHandle->ringBuffer.ringHead + serHandle->ringBuffer.ringBufferSize - serHandle->ringBuffer.ringTail;
1171         dataLength = dataLength % serHandle->ringBuffer.ringBufferSize;
1172 
1173         for (serialReadHandle->transfer.soFar = 0U; serialReadHandle->transfer.soFar < MIN(dataLength, length);
1174              serialReadHandle->transfer.soFar++)
1175         {
1176             buffer[serialReadHandle->transfer.soFar] = serHandle->ringBuffer.ringBuffer[serHandle->ringBuffer.ringTail];
1177             serHandle->ringBuffer.ringTail++;
1178             if (serHandle->ringBuffer.ringTail >= serHandle->ringBuffer.ringBufferSize)
1179             {
1180                 serHandle->ringBuffer.ringTail = 0U;
1181             }
1182         }
1183 
1184         dataLength =
1185             serHandle->ringBuffer.ringHead + serHandle->ringBuffer.ringBufferSize - serHandle->ringBuffer.ringTail;
1186         dataLength = dataLength % serHandle->ringBuffer.ringBufferSize;
1187         dataLength = serHandle->ringBuffer.ringBufferSize - 1U - dataLength;
1188 
1189         (void)SerialManager_StartReading(serHandle, readHandle, NULL, dataLength);
1190     }
1191 
1192     if (NULL != receivedLength)
1193     {
1194         *receivedLength                   = serialReadHandle->transfer.soFar;
1195         serialReadHandle->transfer.buffer = NULL;
1196         EnableGlobalIRQ(primask);
1197     }
1198     else
1199     {
1200         if (serialReadHandle->transfer.soFar >= serialReadHandle->transfer.length)
1201         {
1202             serialReadHandle->transfer.buffer = NULL;
1203             EnableGlobalIRQ(primask);
1204             if (kSerialManager_TransmissionNonBlocking == mode)
1205             {
1206                 if (NULL != serialReadHandle->callback)
1207                 {
1208                     serial_manager_callback_message_t serialMsg;
1209                     serialMsg.buffer = buffer;
1210                     serialMsg.length = serialReadHandle->transfer.soFar;
1211                     serialReadHandle->callback(serialReadHandle->callbackParam, &serialMsg,
1212                                                kStatus_SerialManager_Success);
1213                 }
1214             }
1215         }
1216         else
1217         {
1218             EnableGlobalIRQ(primask);
1219         }
1220 
1221         if (kSerialManager_TransmissionBlocking == mode)
1222         {
1223             while (serialReadHandle->transfer.length > serialReadHandle->transfer.soFar)
1224             {
1225                 SerialManager_ReadTimeDelay(SERIAL_MANAGER_READ_TIME_DELAY_DEFAULT_VALUE);
1226             }
1227         }
1228     }
1229 #if (defined(SERIAL_MANAGER_RING_BUFFER_FLOWCONTROL) && (SERIAL_MANAGER_RING_BUFFER_FLOWCONTROL > 0U))
1230     uint32_t ringBufferWaterMark =
1231         serHandle->ringBuffer.ringHead + serHandle->ringBuffer.ringBufferSize - serHandle->ringBuffer.ringTail;
1232     ringBufferWaterMark = ringBufferWaterMark % serHandle->ringBuffer.ringBufferSize;
1233     if (ringBufferWaterMark < (uint32_t)(serHandle->ringBuffer.ringBufferSize * RINGBUFFER_WATERMARK_THRESHOLD))
1234     {
1235         (void)SerialManager_StartReading(serHandle, serHandle->openedReadHandleHead, NULL,
1236                                          serialReadHandle->transfer.length);
1237     }
1238 #endif
1239     return kStatus_SerialManager_Success;
1240 }
1241 
1242 #else
1243 
1244 static serial_manager_status_t SerialManager_Write(serial_write_handle_t writeHandle, uint8_t *buffer, uint32_t length)
1245 {
1246     serial_manager_write_handle_t *serialWriteHandle;
1247     serial_manager_handle_t *serHandle;
1248 
1249     assert(writeHandle);
1250     assert(buffer);
1251     assert(length);
1252 
1253     serialWriteHandle = (serial_manager_write_handle_t *)writeHandle;
1254     serHandle         = serialWriteHandle->serialManagerHandle;
1255 
1256     assert(serHandle);
1257 
1258     return SerialManager_StartWriting(serHandle, serialWriteHandle, buffer, length);
1259 }
1260 
1261 static serial_manager_status_t SerialManager_Read(serial_read_handle_t readHandle, uint8_t *buffer, uint32_t length)
1262 {
1263     serial_manager_read_handle_t *serialReadHandle;
1264     serial_manager_handle_t *serHandle;
1265 
1266     assert(readHandle);
1267     assert(buffer);
1268     assert(length);
1269 
1270     serialReadHandle = (serial_manager_read_handle_t *)readHandle;
1271     serHandle        = serialReadHandle->serialManagerHandle;
1272 
1273     assert(serHandle);
1274 
1275     return SerialManager_StartReading(serHandle, serialReadHandle, buffer, length);
1276 }
1277 #endif
1278 
1279 serial_manager_status_t SerialManager_Init(serial_handle_t serialHandle, const serial_manager_config_t *serialConfig)
1280 {
1281     serial_manager_handle_t *serHandle;
1282     serial_manager_status_t status = kStatus_SerialManager_Error;
1283 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1284 #if (defined(OSA_USED) && !(defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)))
1285     osa_task_def_t serTaskConfig;
1286 #endif
1287 #endif
1288     assert(NULL != serialConfig);
1289 
1290     assert(NULL != serialHandle);
1291     assert(SERIAL_MANAGER_HANDLE_SIZE >= sizeof(serial_manager_handle_t));
1292 
1293     serHandle = (serial_manager_handle_t *)serialHandle;
1294 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1295 
1296     assert(NULL != serialConfig->ringBuffer);
1297     assert(serialConfig->ringBufferSize > 0U);
1298     (void)memset(serHandle, 0, SERIAL_MANAGER_HANDLE_SIZE);
1299     serHandle->handleType = serialConfig->blockType;
1300 #else
1301     (void)memset(serHandle, 0, SERIAL_MANAGER_HANDLE_SIZE);
1302 #endif
1303     serHandle->serialPortType = serialConfig->type;
1304 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1305     serHandle->ringBuffer.ringBuffer     = serialConfig->ringBuffer;
1306     serHandle->ringBuffer.ringBufferSize = serialConfig->ringBufferSize;
1307 #endif
1308 
1309 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1310 #if defined(OSA_USED)
1311 
1312 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
1313 
1314     COMMON_TASK_init();
1315 
1316 #else
1317     if (KOSA_StatusSuccess != OSA_SemaphoreCreate((osa_semaphore_handle_t)serHandle->serSemaphore, 1U))
1318     {
1319         return kStatus_SerialManager_Error;
1320     }
1321     (void)memcpy(&serTaskConfig, OSA_TASK(SerialManager_Task), sizeof(osa_task_def_t));
1322     if (serialConfig->serialTaskConfig != NULL)
1323     {
1324         (void)memcpy(&serTaskConfig, serialConfig->serialTaskConfig, sizeof(osa_task_def_t));
1325         serTaskConfig.pthread = (OSA_TASK(SerialManager_Task))->pthread;
1326         serTaskConfig.tname = (OSA_TASK(SerialManager_Task))->tname;
1327     }
1328     if (KOSA_StatusSuccess != OSA_TaskCreate((osa_task_handle_t)serHandle->taskId,(const osa_task_def_t *)&serTaskConfig, serHandle))
1329     {
1330         return kStatus_SerialManager_Error;
1331     }
1332 #endif
1333 #endif
1334 
1335 #endif
1336 
1337     switch (serialConfig->type)
1338     {
1339 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
1340         case kSerialPort_Uart:
1341             status = Serial_UartInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), serialConfig->portConfig);
1342 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1343             if ((serial_manager_status_t)kStatus_SerialManager_Success == status)
1344             {
1345                 (void)Serial_UartInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
1346                                                    SerialManager_TxCallback, serHandle);
1347 
1348                 (void)Serial_UartInstallRxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
1349                                                    SerialManager_RxCallback, serHandle);
1350             }
1351 #endif
1352             break;
1353 #endif
1354 #if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))
1355         case kSerialPort_UartDma:
1356             status = Serial_UartDmaInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), serialConfig->portConfig);
1357 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1358             if ((serial_manager_status_t)kStatus_SerialManager_Success == status)
1359             {
1360                 (void)Serial_UartDmaInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
1361                                                       SerialManager_TxCallback, serHandle);
1362 
1363                 (void)Serial_UartDmaInstallRxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
1364                                                       SerialManager_RxCallback, serHandle);
1365             }
1366 #endif
1367             break;
1368 #endif
1369 
1370 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
1371         case kSerialPort_UsbCdc:
1372             status = Serial_UsbCdcInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), serialConfig->portConfig);
1373 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1374 
1375             if (kStatus_SerialManager_Success == status)
1376             {
1377                 status = Serial_UsbCdcInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
1378                                                         SerialManager_TxCallback, serHandle);
1379                 if (kStatus_SerialManager_Success == status)
1380                 {
1381                     status = Serial_UsbCdcInstallRxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
1382                                                             SerialManager_RxCallback, serHandle);
1383                 }
1384             }
1385 #endif
1386             break;
1387 #endif
1388 #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
1389         case kSerialPort_Swo:
1390             status = Serial_SwoInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), serialConfig->portConfig);
1391 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1392             if (kStatus_SerialManager_Success == status)
1393             {
1394                 status = Serial_SwoInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
1395                                                      SerialManager_TxCallback, serHandle);
1396             }
1397 #endif
1398             break;
1399 #endif
1400 #if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
1401         case kSerialPort_Virtual:
1402             status =
1403                 Serial_PortVirtualInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), serialConfig->portConfig);
1404 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1405             if (kStatus_SerialManager_Success == status)
1406             {
1407                 status = Serial_PortVirtualInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
1408                                                              SerialManager_TxCallback, serHandle);
1409                 if (kStatus_SerialManager_Success == status)
1410                 {
1411                     status = Serial_PortVirtualInstallRxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
1412                                                                  SerialManager_RxCallback, serHandle);
1413                 }
1414             }
1415 #endif
1416             break;
1417 #endif
1418 #if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))
1419         case kSerialPort_Rpmsg:
1420             status = Serial_RpmsgInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), (void *)serialConfig);
1421 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1422             if (kStatus_SerialManager_Success == status)
1423             {
1424                 status = Serial_RpmsgInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
1425                                                        SerialManager_TxCallback, serHandle);
1426                 if (kStatus_SerialManager_Success == status)
1427                 {
1428                     status = Serial_RpmsgInstallRxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
1429                                                            SerialManager_RxCallback, serHandle);
1430                 }
1431             }
1432 #endif
1433             break;
1434 #endif
1435 #if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))
1436         case kSerialPort_SpiMaster:
1437             status =
1438                 Serial_SpiMasterInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), serialConfig->portConfig);
1439 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1440             if (kStatus_SerialManager_Success == status)
1441             {
1442                 status = Serial_SpiMasterInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
1443                                                            SerialManager_TxCallback, serHandle);
1444                 if (kStatus_SerialManager_Success == status)
1445                 {
1446                     status = Serial_SpiMasterInstallRxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
1447                                                                SerialManager_RxCallback, serHandle);
1448                 }
1449             }
1450 #endif
1451             break;
1452 #endif
1453 #if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))
1454         case kSerialPort_SpiSlave:
1455             status = Serial_SpiSlaveInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), serialConfig->portConfig);
1456 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1457             if (kStatus_SerialManager_Success == status)
1458             {
1459                 status = Serial_SpiSlaveInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
1460                                                           SerialManager_TxCallback, serHandle);
1461                 if (kStatus_SerialManager_Success == status)
1462                 {
1463                     status = Serial_SpiSlaveInstallRxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
1464                                                               SerialManager_RxCallback, serHandle);
1465                 }
1466             }
1467 #endif
1468             break;
1469 #endif
1470 #if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))
1471         case kSerialPort_BleWu:
1472             status =
1473                 Serial_PortBleWuInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), serialConfig->portConfig);
1474 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1475             if (kStatus_SerialManager_Success == status)
1476             {
1477                 status = Serial_PortBleWuInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
1478                                                            SerialManager_TxCallback, serHandle);
1479                 if (kStatus_SerialManager_Success == status)
1480                 {
1481                     status = Serial_PortBleWuInstallRxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),
1482                                                                SerialManager_RxCallback, serHandle);
1483                 }
1484             }
1485 #endif
1486             break;
1487 #endif
1488         default:
1489             /*MISRA rule 16.4*/
1490             break;
1491     }
1492 
1493     return status;
1494 }
1495 
1496 serial_manager_status_t SerialManager_Deinit(serial_handle_t serialHandle)
1497 {
1498     serial_manager_handle_t *serHandle;
1499 
1500     serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Success;
1501 
1502     assert(NULL != serialHandle);
1503 
1504     serHandle = (serial_manager_handle_t *)serialHandle;
1505 
1506     if ((NULL != serHandle->openedReadHandleHead) || (0U != serHandle->openedWriteHandleCount))
1507     {
1508         serialManagerStatus = kStatus_SerialManager_Busy; /*Serial Manager Busy*/
1509     }
1510     else
1511     {
1512         switch (serHandle->serialPortType) /*serial port type*/
1513         {
1514 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
1515             case kSerialPort_Uart:
1516                 (void)Serial_UartDeinit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
1517                 break;
1518 #endif
1519 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
1520             case kSerialPort_UsbCdc:
1521                 (void)Serial_UsbCdcDeinit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
1522                 break;
1523 #endif
1524 #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
1525             case kSerialPort_Swo:
1526                 (void)Serial_SwoDeinit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
1527                 break;
1528 #endif
1529 #if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
1530             case kSerialPort_Virtual:
1531                 (void)Serial_PortVirtualDeinit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
1532                 break;
1533 #endif
1534 #if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))
1535             case kSerialPort_Rpmsg:
1536                 (void)Serial_RpmsgDeinit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
1537                 break;
1538 #endif
1539 #if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))
1540             case kSerialPort_SpiSlave:
1541                 (void)Serial_SpiSlaveDeinit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
1542                 break;
1543 #endif
1544 #if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))
1545             case kSerialPort_SpiMaster:
1546                 (void)Serial_SpiMasterDeinit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
1547                 break;
1548 #endif
1549 #if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))
1550             case kSerialPort_BleWu:
1551                 (void)Serial_PortBleWuDeinit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
1552                 break;
1553 #endif
1554             default:
1555                 /*MISRA rule 16.4*/
1556                 break;
1557         }
1558 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1559 
1560 #if defined(OSA_USED)
1561 
1562 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
1563 #else
1564         (void)OSA_SemaphoreDestroy((osa_event_handle_t)serHandle->serSemaphore);
1565         (void)OSA_TaskDestroy((osa_task_handle_t)serHandle->taskId);
1566 #endif
1567 
1568 #endif
1569 
1570 #endif
1571     }
1572     return serialManagerStatus;
1573 }
1574 
1575 serial_manager_status_t SerialManager_OpenWriteHandle(serial_handle_t serialHandle, serial_write_handle_t writeHandle)
1576 {
1577     serial_manager_handle_t *serHandle;
1578     serial_manager_write_handle_t *serialWriteHandle;
1579     uint32_t primask;
1580 
1581     assert(NULL != serialHandle);
1582     assert(NULL != writeHandle);
1583     assert(SERIAL_MANAGER_WRITE_HANDLE_SIZE >= sizeof(serial_manager_write_handle_t));
1584 
1585     serHandle         = (serial_manager_handle_t *)serialHandle;
1586     serialWriteHandle = (serial_manager_write_handle_t *)writeHandle;
1587 
1588     primask = DisableGlobalIRQ();
1589     serHandle->openedWriteHandleCount++;
1590     EnableGlobalIRQ(primask);
1591 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1592     if (serHandle->handleType == kSerialManager_Blocking)
1593     {
1594         serialWriteHandle->serialManagerHandle = serHandle;
1595         return kStatus_SerialManager_Success;
1596     }
1597     else
1598 #endif
1599     {
1600         (void)memset(writeHandle, 0, SERIAL_MANAGER_WRITE_HANDLE_SIZE);
1601     }
1602 
1603     serialWriteHandle->serialManagerHandle = serHandle;
1604 
1605 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1606     serialWriteHandle->tag = SERIAL_MANAGER_WRITE_TAG;
1607 #endif
1608 
1609     return kStatus_SerialManager_Success;
1610 }
1611 
1612 serial_manager_status_t SerialManager_CloseWriteHandle(serial_write_handle_t writeHandle)
1613 {
1614     serial_manager_handle_t *serialHandle;
1615     serial_manager_write_handle_t *serialWriteHandle;
1616     uint32_t primask;
1617 
1618     assert(NULL != writeHandle);
1619 
1620     serialWriteHandle = (serial_manager_write_handle_t *)writeHandle;
1621     serialHandle      = (serial_manager_handle_t *)(void *)serialWriteHandle->serialManagerHandle;
1622 
1623     assert(NULL != serialHandle);
1624 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1625     assert(SERIAL_MANAGER_WRITE_TAG == serialWriteHandle->tag);
1626 #endif
1627 
1628 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1629     (void)SerialManager_CancelWriting(writeHandle);
1630 #endif
1631     primask = DisableGlobalIRQ();
1632     if (serialHandle->openedWriteHandleCount > 0U)
1633     {
1634         serialHandle->openedWriteHandleCount--;
1635     }
1636     EnableGlobalIRQ(primask);
1637 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1638     (void)memset(writeHandle, 0, SERIAL_MANAGER_WRITE_HANDLE_SIZE);
1639 #else
1640     (void)memset(writeHandle, 0, SERIAL_MANAGER_WRITE_BLOCK_HANDLE_SIZE);
1641 #endif
1642 
1643     return kStatus_SerialManager_Success;
1644 }
1645 
1646 serial_manager_status_t SerialManager_OpenReadHandle(serial_handle_t serialHandle, serial_read_handle_t readHandle)
1647 {
1648     serial_manager_handle_t *serHandle;
1649     serial_manager_read_handle_t *serialReadHandle; /* read handle structure */
1650     serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Success;
1651     uint32_t primask;
1652 
1653     assert(NULL != serialHandle);
1654     assert(NULL != readHandle);
1655     assert(SERIAL_MANAGER_READ_HANDLE_SIZE >= sizeof(serial_manager_read_handle_t));
1656 
1657     serHandle        = (serial_manager_handle_t *)serialHandle;
1658     serialReadHandle = (serial_manager_read_handle_t *)readHandle;
1659 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1660     if (serHandle->handleType == kSerialManager_Blocking)
1661     {
1662         serialReadHandle->serialManagerHandle = serHandle;
1663         return kStatus_SerialManager_Success;
1664     }
1665 #endif
1666     primask = DisableGlobalIRQ();
1667     if (serHandle->openedReadHandleHead != NULL)
1668     {
1669         serialManagerStatus = kStatus_SerialManager_Busy;
1670     }
1671     else
1672     {
1673         serHandle->openedReadHandleHead = serialReadHandle;
1674 
1675         (void)memset(readHandle, 0, SERIAL_MANAGER_READ_HANDLE_SIZE);
1676 
1677         serialReadHandle->serialManagerHandle = serHandle;
1678 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1679         serialReadHandle->tag = SERIAL_MANAGER_READ_TAG;
1680 #endif
1681     }
1682     EnableGlobalIRQ(primask);
1683     return serialManagerStatus;
1684 }
1685 
1686 serial_manager_status_t SerialManager_CloseReadHandle(serial_read_handle_t readHandle)
1687 {
1688     serial_manager_handle_t *serialHandle;
1689     serial_manager_read_handle_t *serialReadHandle;
1690     uint32_t primask;
1691 
1692     assert(NULL != readHandle);
1693 
1694     serialReadHandle = (serial_manager_read_handle_t *)readHandle;
1695     serialHandle     = (serial_manager_handle_t *)(void *)serialReadHandle->serialManagerHandle;
1696 
1697     assert((NULL != serialHandle) && (serialHandle->openedReadHandleHead == serialReadHandle));
1698 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1699     assert(SERIAL_MANAGER_READ_TAG == serialReadHandle->tag);
1700 #endif
1701 
1702 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1703     (void)SerialManager_CancelReading(readHandle);
1704 #endif
1705 
1706     primask                            = DisableGlobalIRQ();
1707     serialHandle->openedReadHandleHead = NULL;
1708     EnableGlobalIRQ(primask);
1709 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1710     (void)memset(readHandle, 0, SERIAL_MANAGER_READ_HANDLE_SIZE);
1711 #else
1712     (void)memset(readHandle, 0, SERIAL_MANAGER_READ_BLOCK_HANDLE_SIZE);
1713 #endif
1714 
1715     return kStatus_SerialManager_Success;
1716 }
1717 
1718 serial_manager_status_t SerialManager_WriteBlocking(serial_write_handle_t writeHandle, uint8_t *buffer, uint32_t length)
1719 {
1720 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1721     return SerialManager_Write(writeHandle, buffer, length, kSerialManager_TransmissionBlocking);
1722 #else
1723     return SerialManager_Write(writeHandle, buffer, length);
1724 #endif
1725 }
1726 
1727 serial_manager_status_t SerialManager_ReadBlocking(serial_read_handle_t readHandle, uint8_t *buffer, uint32_t length)
1728 {
1729 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1730     return SerialManager_Read(readHandle, buffer, length, kSerialManager_TransmissionBlocking, NULL);
1731 #else
1732     return SerialManager_Read(readHandle, buffer, length);
1733 #endif
1734 }
1735 
1736 #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))
1737 serial_manager_status_t SerialManager_WriteNonBlocking(serial_write_handle_t writeHandle,
1738                                                        uint8_t *buffer,
1739                                                        uint32_t length)
1740 {
1741     return SerialManager_Write(writeHandle, buffer, length, kSerialManager_TransmissionNonBlocking);
1742 }
1743 
1744 serial_manager_status_t SerialManager_ReadNonBlocking(serial_read_handle_t readHandle, uint8_t *buffer, uint32_t length)
1745 {
1746 #if ((defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U)) || \
1747      (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U)))
1748 
1749     serial_manager_read_handle_t *serialReadHandle;
1750     serialReadHandle = (serial_manager_read_handle_t *)readHandle;
1751 
1752     return (serial_manager_status_t)SerialManager_StartReading(serialReadHandle->serialManagerHandle, readHandle,
1753                                                                buffer, length);
1754 #else
1755     return SerialManager_Read(readHandle, buffer, length, kSerialManager_TransmissionNonBlocking, NULL);
1756 #endif
1757 }
1758 
1759 serial_manager_status_t SerialManager_CancelWriting(serial_write_handle_t writeHandle)
1760 {
1761     serial_manager_write_handle_t *serialWriteHandle;
1762     uint32_t primask;
1763     uint8_t isNotUsed        = 0U;
1764     uint8_t isNotNeed2Cancel = 0U;
1765 
1766     assert(NULL != writeHandle);
1767 
1768     serialWriteHandle = (serial_manager_write_handle_t *)writeHandle;
1769 
1770     assert(NULL != serialWriteHandle->serialManagerHandle);
1771     assert(SERIAL_MANAGER_WRITE_TAG == serialWriteHandle->tag);
1772 
1773     if ((NULL != serialWriteHandle->transfer.buffer) &&
1774         (kSerialManager_TransmissionBlocking == serialWriteHandle->transfer.mode))
1775     {
1776         return kStatus_SerialManager_Error;
1777     }
1778 
1779     primask = DisableGlobalIRQ();
1780     if (serialWriteHandle != (serial_manager_write_handle_t *)(void *)LIST_GetHead(
1781                                  &serialWriteHandle->serialManagerHandle->runningWriteHandleHead))
1782     {
1783         if (kLIST_Ok == LIST_RemoveElement(&serialWriteHandle->link))
1784         {
1785             isNotUsed = 1U;
1786         }
1787         else
1788         {
1789             isNotNeed2Cancel = 1U;
1790         }
1791     }
1792     EnableGlobalIRQ(primask);
1793 
1794     if (0U == isNotNeed2Cancel)
1795     {
1796         if (0U != isNotUsed)
1797         {
1798             serialWriteHandle->transfer.soFar  = 0;
1799             serialWriteHandle->transfer.status = kStatus_SerialManager_Canceled;
1800 
1801             SerialManager_AddTail(&serialWriteHandle->serialManagerHandle->completedWriteHandleHead, serialWriteHandle);
1802 #if defined(OSA_USED)
1803 
1804 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
1805             serialWriteHandle->serialManagerHandle->commontaskMsg.callback = SerialManager_Task;
1806             serialWriteHandle->serialManagerHandle->commontaskMsg.callbackParam =
1807                 serialWriteHandle->serialManagerHandle;
1808             COMMON_TASK_post_message(&serialWriteHandle->serialManagerHandle->commontaskMsg);
1809 #else
1810             primask = DisableGlobalIRQ();
1811             serialWriteHandle->serialManagerHandle->serialManagerState[SERIAL_EVENT_DATA_SENT]++;
1812             EnableGlobalIRQ(primask);
1813             (void)OSA_SemaphorePost((osa_semaphore_handle_t)serialWriteHandle->serialManagerHandle->serSemaphore);
1814 #endif
1815 
1816 #else
1817             SerialManager_Task(serialWriteHandle->serialManagerHandle);
1818 #endif
1819         }
1820         else
1821         {
1822             switch (serialWriteHandle->serialManagerHandle->serialPortType)
1823             {
1824 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
1825                 case kSerialPort_Uart:
1826                     (void)Serial_UartCancelWrite(
1827                         ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0]));
1828                     break;
1829 #endif
1830 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
1831                 case kSerialPort_UsbCdc:
1832                     (void)Serial_UsbCdcCancelWrite(
1833                         ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0]));
1834                     break;
1835 #endif
1836 #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
1837                 case kSerialPort_Swo:
1838                     (void)Serial_SwoCancelWrite(
1839                         ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0]));
1840                     break;
1841 #endif
1842 #if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
1843                 case kSerialPort_Virtual:
1844                     (void)Serial_PortVirtualCancelWrite(
1845                         ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0]));
1846                     break;
1847 #endif
1848 #if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))
1849                 case kSerialPort_SpiMaster:
1850                     (void)Serial_SpiMasterCancelWrite(
1851                         ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0]));
1852                     break;
1853 #endif
1854 #if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))
1855                 case kSerialPort_SpiSlave:
1856                     (void)Serial_SpiSlaveCancelWrite(
1857                         ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0]));
1858                     break;
1859 #endif
1860 #if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))
1861                 case kSerialPort_BleWu:
1862                     (void)Serial_PortBleWuCancelWrite(
1863                         ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0]));
1864                     break;
1865 #endif
1866                 default:
1867                     /*MISRA rule 16.4*/
1868                     break;
1869             }
1870         }
1871 
1872 #if (defined(OSA_USED) && defined(SERIAL_MANAGER_TASK_HANDLE_TX) && (SERIAL_MANAGER_TASK_HANDLE_TX == 1))
1873 #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))
1874         /* Need to support common_task. */
1875 #else  /* SERIAL_MANAGER_USE_COMMON_TASK */
1876         primask = DisableGlobalIRQ();
1877         serialWriteHandle->serialManagerHandle->serialManagerState[SERIAL_EVENT_DATA_START_SEND]++;
1878         EnableGlobalIRQ(primask);
1879         (void)OSA_SemaphorePost((osa_semaphore_handle_t)serialWriteHandle->serialManagerHandle->serSemaphore);
1880 
1881 #endif /* SERIAL_MANAGER_USE_COMMON_TASK */
1882 #else  /* OSA_USED && SERIAL_MANAGER_TASK_HANDLE_TX */
1883         (void)SerialManager_StartWriting(serialWriteHandle->serialManagerHandle);
1884 #endif /* OSA_USED && SERIAL_MANAGER_TASK_HANDLE_TX */
1885     }
1886 
1887     return kStatus_SerialManager_Success;
1888 }
1889 
1890 serial_manager_status_t SerialManager_CancelReading(serial_read_handle_t readHandle)
1891 {
1892     serial_manager_read_handle_t *serialReadHandle;
1893     serial_manager_callback_message_t serialMsg;
1894     uint8_t *buffer;
1895     uint32_t primask;
1896 
1897     assert(NULL != readHandle);
1898 
1899     serialReadHandle = (serial_manager_read_handle_t *)readHandle;
1900 
1901     assert(SERIAL_MANAGER_READ_TAG == serialReadHandle->tag);
1902 
1903     if ((NULL != serialReadHandle->transfer.buffer) &&
1904         (kSerialManager_TransmissionBlocking == serialReadHandle->transfer.mode))
1905     {
1906         return kStatus_SerialManager_Error;
1907     }
1908 
1909     primask                           = DisableGlobalIRQ();
1910     buffer                            = serialReadHandle->transfer.buffer;
1911     serialReadHandle->transfer.buffer = NULL;
1912     serialReadHandle->transfer.length = 0;
1913     serialMsg.buffer                  = buffer;
1914     serialMsg.length                  = serialReadHandle->transfer.soFar;
1915     EnableGlobalIRQ(primask);
1916 
1917     if (NULL != buffer)
1918     {
1919         if (NULL != serialReadHandle->callback)
1920         {
1921             serialReadHandle->callback(serialReadHandle->callbackParam, &serialMsg, kStatus_SerialManager_Canceled);
1922         }
1923     }
1924     return kStatus_SerialManager_Success;
1925 }
1926 
1927 serial_manager_status_t SerialManager_TryRead(serial_read_handle_t readHandle,
1928                                               uint8_t *buffer,
1929                                               uint32_t length,
1930                                               uint32_t *receivedLength)
1931 {
1932     assert(NULL != receivedLength);
1933 
1934     return SerialManager_Read(readHandle, buffer, length, kSerialManager_TransmissionBlocking, receivedLength);
1935 }
1936 
1937 serial_manager_status_t SerialManager_InstallTxCallback(serial_write_handle_t writeHandle,
1938                                                         serial_manager_callback_t callback,
1939                                                         void *callbackParam)
1940 {
1941     serial_manager_write_handle_t *serialWriteHandle;
1942 
1943     assert(NULL != writeHandle);
1944 
1945     serialWriteHandle = (serial_manager_write_handle_t *)writeHandle;
1946 
1947     assert(SERIAL_MANAGER_WRITE_TAG == serialWriteHandle->tag);
1948 
1949     serialWriteHandle->callbackParam = callbackParam;
1950     serialWriteHandle->callback      = callback;
1951 
1952     return kStatus_SerialManager_Success;
1953 }
1954 
1955 serial_manager_status_t SerialManager_InstallRxCallback(serial_read_handle_t readHandle,
1956                                                         serial_manager_callback_t callback,
1957                                                         void *callbackParam)
1958 {
1959     serial_manager_read_handle_t *serialReadHandle;
1960 
1961     assert(NULL != readHandle);
1962 
1963     serialReadHandle = (serial_manager_read_handle_t *)readHandle;
1964 
1965     assert(SERIAL_MANAGER_READ_TAG == serialReadHandle->tag);
1966 
1967     serialReadHandle->callbackParam = callbackParam;
1968     serialReadHandle->callback      = callback;
1969 
1970     return kStatus_SerialManager_Success;
1971 }
1972 #endif
1973 
1974 serial_manager_status_t SerialManager_EnterLowpower(serial_handle_t serialHandle)
1975 {
1976     serial_manager_handle_t *serHandle;
1977     serial_manager_status_t status = kStatus_SerialManager_Error;
1978 
1979     assert(NULL != serialHandle);
1980 
1981     serHandle = (serial_manager_handle_t *)serialHandle;
1982 
1983     switch (serHandle->serialPortType)
1984     {
1985 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
1986         case kSerialPort_Uart:
1987             status = Serial_UartEnterLowpower(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
1988             break;
1989 #endif
1990 #if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))
1991         case kSerialPort_UartDma:
1992             status = Serial_UartDmaEnterLowpower(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
1993             break;
1994 #endif
1995 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
1996         case kSerialPort_UsbCdc:
1997             break;
1998 #endif
1999 #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
2000         case kSerialPort_Swo:
2001             break;
2002 #endif
2003 #if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
2004         case kSerialPort_Virtual:
2005             break;
2006 #endif
2007 #if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
2008         case kSerialPort_Rpmsg:
2009             break;
2010 #endif
2011 #if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))
2012         case kSerialPort_SpiMaster:
2013             break;
2014 #endif
2015 #if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))
2016         case kSerialPort_SpiSlave:
2017             break;
2018 #endif
2019 #if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))
2020         case kSerialPort_BleWu:
2021             break;
2022 #endif
2023         default:
2024             /*MISRA rule 16.4*/
2025             break;
2026     }
2027     return status;
2028 }
2029 
2030 serial_manager_status_t SerialManager_ExitLowpower(serial_handle_t serialHandle)
2031 {
2032     serial_manager_handle_t *serHandle;
2033     serial_manager_status_t status = kStatus_SerialManager_Error;
2034 
2035     assert(NULL != serialHandle);
2036 
2037     serHandle = (serial_manager_handle_t *)serialHandle;
2038 
2039     switch (serHandle->serialPortType)
2040     {
2041 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
2042         case kSerialPort_Uart:
2043             status = Serial_UartExitLowpower(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
2044             break;
2045 #endif
2046 
2047 #if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))
2048         case kSerialPort_UartDma:
2049             status = Serial_UartDmaExitLowpower(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));
2050             break;
2051 #endif
2052 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
2053         case kSerialPort_UsbCdc:
2054             break;
2055 #endif
2056 #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
2057         case kSerialPort_Swo:
2058             break;
2059 #endif
2060 #if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
2061         case kSerialPort_Virtual:
2062             break;
2063 #endif
2064 #if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
2065         case kSerialPort_Rpmsg:
2066             break;
2067 #endif
2068 #if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))
2069         case kSerialPort_SpiMaster:
2070             break;
2071 #endif
2072 #if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))
2073         case kSerialPort_SpiSlave:
2074             break;
2075 #endif
2076 #if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))
2077         case kSerialPort_BleWu:
2078             break;
2079 #endif
2080         default:
2081             /*MISRA rule 16.4*/
2082             break;
2083     }
2084     return status;
2085 }
2086 /*!
2087  * @brief This function performs initialization of the callbacks structure used to disable lowpower
2088  *          when serial manager is active.
2089  *
2090  *
2091  * @param  pfCallback Pointer to the function structure used to allow/disable lowpower.
2092  *
2093  */
2094 void SerialManager_SetLowpowerCriticalCb(const serial_manager_lowpower_critical_CBs_t *pfCallback)
2095 {
2096     s_pfserialLowpowerCriticalCallbacks = pfCallback;
2097     (void)s_pfserialLowpowerCriticalCallbacks;
2098 }
2099