1 /*
2 * This is a modified version of the file printf.c, which was distributed
3 * by Motorola as part of the M5407C3BOOT.zip package used to initialize
4 * the M5407C3 evaluation board.
5 *
6 * Copyright:
7 * 1999-2000 MOTOROLA, INC. All Rights Reserved.
8 * You are hereby granted a copyright license to use, modify, and
9 * distribute the SOFTWARE so long as this entire notice is
10 * retained without alteration in any modified and/or redistributed
11 * versions, and that such modified versions are clearly identified
12 * as such. No licenses are granted by implication, estoppel or
13 * otherwise under any patents or trademarks of Motorola, Inc. This
14 * software is provided on an "AS IS" basis and without warranty.
15 *
16 * To the maximum extent permitted by applicable law, MOTOROLA
17 * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
18 * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
19 * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
20 * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
21 * ACCOMPANYING WRITTEN MATERIALS.
22 *
23 * To the maximum extent permitted by applicable law, IN NO EVENT
24 * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
25 * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
26 * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
27 * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
28 *
29 * Motorola assumes no responsibility for the maintenance and support
30 * of this software
31
32 * Copyright (c) 2015, Freescale Semiconductor, Inc.
33 * Copyright 2016-2020, 2023 NXP
34 *
35 * SPDX-License-Identifier: BSD-3-Clause
36 */
37
38 #include <stdarg.h>
39 #include <stdlib.h>
40 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
41 #include <stdio.h>
42 #endif
43
44 #include "fsl_debug_console_conf.h"
45 #include "fsl_str.h"
46
47 #include "fsl_common.h"
48 #include "fsl_component_serial_manager.h"
49
50 #include "fsl_debug_console.h"
51
52 #ifdef SDK_OS_FREE_RTOS
53 #include "FreeRTOS.h"
54 #include "semphr.h"
55 #include "task.h"
56 #endif
57
58 /*******************************************************************************
59 * Definitions
60 ******************************************************************************/
61 #ifndef NDEBUG
62 #if (defined(DEBUG_CONSOLE_ASSERT_DISABLE) && (DEBUG_CONSOLE_ASSERT_DISABLE > 0U))
63 #undef assert
64 #define assert(n)
65 #else
66 /* MISRA C-2012 Rule 17.2 */
67 #undef assert
68 #define assert(n) \
69 while (!(n)) \
70 { \
71 ; \
72 }
73 #endif
74 #endif
75
76 #if (defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK))
77 #define DEBUG_CONSOLE_FUNCTION_PREFIX
78 #else
79 #define DEBUG_CONSOLE_FUNCTION_PREFIX static
80 #endif
81
82 /*! @brief character backspace ASCII value */
83 #define DEBUG_CONSOLE_BACKSPACE 127U
84
85 /* lock definition */
86 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
87
88 static SemaphoreHandle_t s_debugConsoleReadSemaphore;
89 #if configSUPPORT_STATIC_ALLOCATION
90 static StaticSemaphore_t s_debugConsoleReadSemaphoreStatic;
91 #endif
92 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
93 static SemaphoreHandle_t s_debugConsoleReadWaitSemaphore;
94 #if configSUPPORT_STATIC_ALLOCATION
95 static StaticSemaphore_t s_debugConsoleReadWaitSemaphoreStatic;
96 #endif
97 #endif
98
99 #elif (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_BM)
100
101 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
102 static volatile bool s_debugConsoleReadWaitSemaphore;
103 #endif
104
105 #else
106
107 #endif /* DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS */
108
109 /*! @brief get current runing environment is ISR or not */
110 #ifdef __CA7_REV
111 #define IS_RUNNING_IN_ISR() SystemGetIRQNestingLevel()
112 #else
113 #define IS_RUNNING_IN_ISR() __get_IPSR()
114 #endif /* __CA7_REV */
115
116 /* semaphore definition */
117 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
118
119 /* mutex semaphore */
120 /* clang-format off */
121 #if configSUPPORT_STATIC_ALLOCATION
122 #define DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(mutex, stack) ((mutex) = xSemaphoreCreateMutexStatic(stack))
123 #else
124 #define DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(mutex) ((mutex) = xSemaphoreCreateMutex())
125 #endif
126 #define DEBUG_CONSOLE_DESTROY_MUTEX_SEMAPHORE(mutex) \
127 do \
128 { \
129 if(NULL != (mutex)) \
130 { \
131 vSemaphoreDelete(mutex); \
132 (mutex) = NULL; \
133 } \
134 } while(false)
135
136 #define DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(mutex) \
137 { \
138 if (IS_RUNNING_IN_ISR() == 0U) \
139 { \
140 (void)xSemaphoreGive(mutex); \
141 } \
142 }
143
144 #define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(mutex) \
145 { \
146 if (IS_RUNNING_IN_ISR() == 0U) \
147 { \
148 (void)xSemaphoreTake(mutex, portMAX_DELAY); \
149 } \
150 }
151
152 #define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_NONBLOCKING(mutex, result) \
153 { \
154 if (IS_RUNNING_IN_ISR() == 0U) \
155 { \
156 result = xSemaphoreTake(mutex, 0U); \
157 } \
158 else \
159 { \
160 result = 1U; \
161 } \
162 }
163
164 /* Binary semaphore */
165 #if configSUPPORT_STATIC_ALLOCATION
166 #define DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(binary,stack) ((binary) = xSemaphoreCreateBinaryStatic(stack))
167 #else
168 #define DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(binary) ((binary) = xSemaphoreCreateBinary())
169 #endif
170 #define DEBUG_CONSOLE_DESTROY_BINARY_SEMAPHORE(binary) \
171 do \
172 { \
173 if(NULL != (binary)) \
174 { \
175 vSemaphoreDelete((binary)); \
176 (binary) = NULL; \
177 } \
178 } while(false)
179 #define DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(binary) ((void)xSemaphoreTake((binary), portMAX_DELAY))
180 #define DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(binary) ((void)xSemaphoreGiveFromISR((binary), NULL))
181
182 #elif (DEBUG_CONSOLE_SYNCHRONIZATION_BM == DEBUG_CONSOLE_SYNCHRONIZATION_MODE)
183
184 #define DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(mutex) (void)(mutex)
185 #define DEBUG_CONSOLE_DESTROY_MUTEX_SEMAPHORE(mutex) (void)(mutex)
186 #define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(mutex) (void)(mutex)
187 #define DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(mutex) (void)(mutex)
188 #define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_NONBLOCKING(mutex, result) (result = 1U)
189
190 #define DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(binary) (void)(binary)
191 #define DEBUG_CONSOLE_DESTROY_BINARY_SEMAPHORE(binary) (void)(binary)
192 #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
193 #define DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(binary) \
194 { \
195 while (!(binary)) \
196 { \
197 } \
198 (binary) = false; \
199 }
200 #define DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(binary) \
201 do \
202 { \
203 (binary) = true; \
204 } while(false)
205 #else
206 #define DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(binary) (void)(binary)
207 #define DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(binary) (void)(binary)
208 #endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */
209 /* clang-format on */
210
211 /* add other implementation here
212 *such as :
213 * #elif(DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DDEBUG_CONSOLE_SYNCHRONIZATION_xxx)
214 */
215
216 #else
217
218 #error RTOS type is not defined by DEBUG_CONSOLE_SYNCHRONIZATION_MODE.
219
220 #endif /* DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS */
221
222 #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
223 /* receive state structure */
224 typedef struct _debug_console_write_ring_buffer
225 {
226 uint32_t ringBufferSize;
227 volatile uint32_t ringHead;
228 volatile uint32_t ringTail;
229 uint8_t ringBuffer[DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN];
230 } debug_console_write_ring_buffer_t;
231 #endif
232
233 typedef struct _debug_console_state_struct
234 {
235 serial_handle_t serialHandle; /*!< serial manager handle */
236 #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
237 SERIAL_MANAGER_HANDLE_DEFINE(serialHandleBuffer);
238 debug_console_write_ring_buffer_t writeRingBuffer;
239 uint8_t readRingBuffer[DEBUG_CONSOLE_RECEIVE_BUFFER_LEN];
240 SERIAL_MANAGER_WRITE_HANDLE_DEFINE(serialWriteHandleBuffer);
241 SERIAL_MANAGER_WRITE_HANDLE_DEFINE(serialWriteHandleBuffer2);
242 SERIAL_MANAGER_READ_HANDLE_DEFINE(serialReadHandleBuffer);
243 #else
244 SERIAL_MANAGER_BLOCK_HANDLE_DEFINE(serialHandleBuffer);
245 SERIAL_MANAGER_WRITE_BLOCK_HANDLE_DEFINE(serialWriteHandleBuffer);
246 SERIAL_MANAGER_READ_BLOCK_HANDLE_DEFINE(serialReadHandleBuffer);
247 #endif
248 } debug_console_state_struct_t;
249
250 /*******************************************************************************
251 * Variables
252 ******************************************************************************/
253
254 /*! @brief Debug console state information. */
255 #if (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE > 0))
256 AT_NONCACHEABLE_SECTION(static debug_console_state_struct_t s_debugConsoleState);
257 #else
258 static debug_console_state_struct_t s_debugConsoleState;
259 #endif
260 serial_handle_t g_serialHandle; /*!< serial manager handle */
261
262 /*******************************************************************************
263 * Prototypes
264 ******************************************************************************/
265 /*!
266 * @brief This is a printf call back function which is used to relocate the log to buffer
267 * or print the log immediately when the local buffer is full.
268 *
269 * @param[in] buf Buffer to store log.
270 * @param[in] indicator Buffer index.
271 * @param[in] val Target character to store.
272 * @param[in] len length of the character
273 *
274 */
275 #if (defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK))
276 static void DbgConsole_PrintCallback(char *buf, int32_t *indicator, char dbgVal, int len);
277 #endif
278
279 status_t DbgConsole_ReadOneCharacter(uint8_t *ch);
280 int DbgConsole_SendData(uint8_t *ch, size_t size);
281 int DbgConsole_SendDataReliable(uint8_t *ch, size_t size);
282 int DbgConsole_ReadLine(uint8_t *buf, size_t size);
283 int DbgConsole_ReadCharacter(uint8_t *ch);
284
285 #if ((SDK_DEBUGCONSOLE != DEBUGCONSOLE_REDIRECT_TO_SDK) && defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && \
286 (defined(DEBUG_CONSOLE_TX_RELIABLE_ENABLE) && (DEBUG_CONSOLE_TX_RELIABLE_ENABLE > 0U)))
287 DEBUG_CONSOLE_FUNCTION_PREFIX status_t DbgConsole_Flush(void);
288 #endif
289 /*******************************************************************************
290 * Code
291 ******************************************************************************/
292
293 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
294
DbgConsole_SerialManagerPerformTransfer(debug_console_state_struct_t * ioState)295 static status_t DbgConsole_SerialManagerPerformTransfer(debug_console_state_struct_t *ioState)
296 {
297 serial_manager_status_t ret = kStatus_SerialManager_Error;
298 uint32_t sendDataLength;
299 uint32_t startIndex;
300 uint32_t regPrimask;
301
302 regPrimask = DisableGlobalIRQ();
303 if (ioState->writeRingBuffer.ringTail != ioState->writeRingBuffer.ringHead)
304 {
305 if (ioState->writeRingBuffer.ringHead > ioState->writeRingBuffer.ringTail)
306 {
307 sendDataLength = ioState->writeRingBuffer.ringHead - ioState->writeRingBuffer.ringTail;
308 startIndex = ioState->writeRingBuffer.ringTail;
309 }
310 else
311 {
312 sendDataLength = ioState->writeRingBuffer.ringBufferSize - ioState->writeRingBuffer.ringTail;
313 startIndex = ioState->writeRingBuffer.ringTail;
314 if (0U != ioState->writeRingBuffer.ringHead)
315 {
316 ret = SerialManager_WriteNonBlocking(((serial_write_handle_t)&ioState->serialWriteHandleBuffer2[0]),
317 &ioState->writeRingBuffer.ringBuffer[startIndex], sendDataLength);
318 sendDataLength = ioState->writeRingBuffer.ringHead - 0U;
319 startIndex = 0U;
320 }
321 }
322 ret = SerialManager_WriteNonBlocking(((serial_write_handle_t)&ioState->serialWriteHandleBuffer[0]),
323 &ioState->writeRingBuffer.ringBuffer[startIndex], sendDataLength);
324 }
325 EnableGlobalIRQ(regPrimask);
326 return (status_t)ret;
327 }
328
DbgConsole_SerialManagerTxCallback(void * callbackParam,serial_manager_callback_message_t * message,serial_manager_status_t serialManagerStatus)329 static void DbgConsole_SerialManagerTxCallback(void *callbackParam,
330 serial_manager_callback_message_t *message,
331 serial_manager_status_t serialManagerStatus)
332 {
333 debug_console_state_struct_t *ioState;
334
335 if ((NULL == callbackParam) || (NULL == message))
336 {
337 return;
338 }
339
340 ioState = (debug_console_state_struct_t *)callbackParam;
341
342 ioState->writeRingBuffer.ringTail += message->length;
343 if (ioState->writeRingBuffer.ringTail >= ioState->writeRingBuffer.ringBufferSize)
344 {
345 ioState->writeRingBuffer.ringTail = 0U;
346 }
347
348 if (kStatus_SerialManager_Success == serialManagerStatus)
349 {
350 (void)DbgConsole_SerialManagerPerformTransfer(ioState);
351 }
352 else if (kStatus_SerialManager_Canceled == serialManagerStatus)
353 {
354 ioState->writeRingBuffer.ringTail = 0U;
355 ioState->writeRingBuffer.ringHead = 0U;
356 }
357 else
358 {
359 /*MISRA rule 16.4*/
360 }
361 }
362
DbgConsole_SerialManagerTx2Callback(void * callbackParam,serial_manager_callback_message_t * message,serial_manager_status_t serialManagerStatus)363 static void DbgConsole_SerialManagerTx2Callback(void *callbackParam,
364 serial_manager_callback_message_t *message,
365 serial_manager_status_t serialManagerStatus)
366 {
367 debug_console_state_struct_t *ioState;
368
369 if ((NULL == callbackParam) || (NULL == message))
370 {
371 return;
372 }
373
374 ioState = (debug_console_state_struct_t *)callbackParam;
375
376 ioState->writeRingBuffer.ringTail += message->length;
377 if (ioState->writeRingBuffer.ringTail >= ioState->writeRingBuffer.ringBufferSize)
378 {
379 ioState->writeRingBuffer.ringTail = 0U;
380 }
381
382 if (kStatus_SerialManager_Success == serialManagerStatus)
383 {
384 /* Empty block*/
385 }
386 else if (kStatus_SerialManager_Canceled == serialManagerStatus)
387 {
388 /* Empty block*/
389 }
390 else
391 {
392 /*MISRA rule 16.4*/
393 }
394 }
395
396 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
397
DbgConsole_SerialManagerRxCallback(void * callbackParam,serial_manager_callback_message_t * message,serial_manager_status_t serialManagerStatus)398 static void DbgConsole_SerialManagerRxCallback(void *callbackParam,
399 serial_manager_callback_message_t *message,
400 serial_manager_status_t serialManagerStatus)
401 {
402 if ((NULL == callbackParam) || (NULL == message))
403 {
404 return;
405 }
406
407 if (kStatus_SerialManager_Notify == serialManagerStatus)
408 {
409 }
410 else if (kStatus_SerialManager_Success == serialManagerStatus)
411 {
412 /* release s_debugConsoleReadWaitSemaphore from RX callback */
413 DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(s_debugConsoleReadWaitSemaphore);
414 }
415 else
416 {
417 /*MISRA rule 16.4*/
418 }
419 }
420 #endif
421
422 #endif
423
DbgConsole_ReadOneCharacter(uint8_t * ch)424 status_t DbgConsole_ReadOneCharacter(uint8_t *ch)
425 {
426 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
427
428 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && \
429 (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_BM) && defined(OSA_USED)
430 return (status_t)kStatus_Fail;
431 #else /*defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == \
432 DEBUG_CONSOLE_SYNCHRONIZATION_BM) && defined(OSA_USED)*/
433 serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Error;
434
435 /* recieve one char every time */
436 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
437 serialManagerStatus =
438 SerialManager_ReadNonBlocking(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]), ch, 1);
439 #else /*defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)*/
440 serialManagerStatus =
441 SerialManager_ReadBlocking(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]), ch, 1);
442 #endif /*defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)*/
443 if (kStatus_SerialManager_Success != serialManagerStatus)
444 {
445 serialManagerStatus = (serial_manager_status_t)kStatus_Fail;
446 }
447 else
448 {
449 /* wait s_debugConsoleReadWaitSemaphore from RX callback */
450 DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(s_debugConsoleReadWaitSemaphore);
451 serialManagerStatus = (serial_manager_status_t)kStatus_Success;
452 }
453 return (status_t)serialManagerStatus;
454 #endif /*defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == \
455 DEBUG_CONSOLE_SYNCHRONIZATION_BM) && defined(OSA_USED)*/
456
457 #else /*(defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))*/
458
459 return (status_t)kStatus_Fail;
460
461 #endif /*(defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))*/
462 }
463
464 #if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION
DbgConsole_EchoCharacter(uint8_t * ch,bool isGetChar,int * index)465 static status_t DbgConsole_EchoCharacter(uint8_t *ch, bool isGetChar, int *index)
466 {
467 /* Due to scanf take \n and \r as end of string,should not echo */
468 if (((*ch != (uint8_t)'\r') && (*ch != (uint8_t)'\n')) || (isGetChar))
469 {
470 /* recieve one char every time */
471 if (1 != DbgConsole_SendDataReliable(ch, 1U))
472 {
473 return (status_t)kStatus_Fail;
474 }
475 }
476
477 if ((!isGetChar) && (index != NULL))
478 {
479 if (DEBUG_CONSOLE_BACKSPACE == *ch)
480 {
481 if ((*index >= 2))
482 {
483 *index -= 2;
484 }
485 else
486 {
487 *index = 0;
488 }
489 }
490 }
491
492 return (status_t)kStatus_Success;
493 }
494 #endif
495
DbgConsole_SendData(uint8_t * ch,size_t size)496 int DbgConsole_SendData(uint8_t *ch, size_t size)
497 {
498 status_t dbgConsoleStatus;
499 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
500 uint32_t sendDataLength;
501 int txBusy = 0;
502 #endif
503 assert(NULL != ch);
504 assert(0U != size);
505
506 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
507 uint32_t regPrimask = DisableGlobalIRQ();
508 if (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail)
509 {
510 txBusy = 1;
511 sendDataLength =
512 (s_debugConsoleState.writeRingBuffer.ringHead + s_debugConsoleState.writeRingBuffer.ringBufferSize -
513 s_debugConsoleState.writeRingBuffer.ringTail) %
514 s_debugConsoleState.writeRingBuffer.ringBufferSize;
515 }
516 else
517 {
518 sendDataLength = 0U;
519 }
520 sendDataLength = s_debugConsoleState.writeRingBuffer.ringBufferSize - sendDataLength - 1U;
521 if (sendDataLength < size)
522 {
523 EnableGlobalIRQ(regPrimask);
524 return -1;
525 }
526 for (int i = 0; i < (int)size; i++)
527 {
528 s_debugConsoleState.writeRingBuffer.ringBuffer[s_debugConsoleState.writeRingBuffer.ringHead++] = ch[i];
529 if (s_debugConsoleState.writeRingBuffer.ringHead >= s_debugConsoleState.writeRingBuffer.ringBufferSize)
530 {
531 s_debugConsoleState.writeRingBuffer.ringHead = 0U;
532 }
533 }
534
535 dbgConsoleStatus = (status_t)kStatus_SerialManager_Success;
536
537 if (txBusy == 0)
538 {
539 dbgConsoleStatus = DbgConsole_SerialManagerPerformTransfer(&s_debugConsoleState);
540 }
541 EnableGlobalIRQ(regPrimask);
542 #else
543 dbgConsoleStatus = (status_t)SerialManager_WriteBlocking(
544 ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]), ch, size);
545 #endif
546 return (((status_t)kStatus_Success == dbgConsoleStatus) ? (int)size : -1);
547 }
548
DbgConsole_SendDataReliable(uint8_t * ch,size_t size)549 int DbgConsole_SendDataReliable(uint8_t *ch, size_t size)
550 {
551 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
552 #if (defined(DEBUG_CONSOLE_TX_RELIABLE_ENABLE) && (DEBUG_CONSOLE_TX_RELIABLE_ENABLE > 0U))
553 serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Error;
554 uint32_t sendDataLength;
555 uint32_t totalLength = size;
556 int sentLength;
557 #endif /* DEBUG_CONSOLE_TX_RELIABLE_ENABLE */
558 #else /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */
559 serial_manager_status_t serialManagerStatus;
560 #endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */
561
562 assert(NULL != ch);
563
564 if (0U == size)
565 {
566 return 0;
567 }
568
569 if (NULL == g_serialHandle)
570 {
571 return 0;
572 }
573
574 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
575
576 #if (defined(DEBUG_CONSOLE_TX_RELIABLE_ENABLE) && (DEBUG_CONSOLE_TX_RELIABLE_ENABLE > 0U))
577 do
578 {
579 uint32_t regPrimask = DisableGlobalIRQ();
580 if (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail)
581 {
582 sendDataLength =
583 (s_debugConsoleState.writeRingBuffer.ringHead + s_debugConsoleState.writeRingBuffer.ringBufferSize -
584 s_debugConsoleState.writeRingBuffer.ringTail) %
585 s_debugConsoleState.writeRingBuffer.ringBufferSize;
586 }
587 else
588 {
589 sendDataLength = 0U;
590 }
591 sendDataLength = s_debugConsoleState.writeRingBuffer.ringBufferSize - sendDataLength - 1U;
592
593 if ((sendDataLength > 0U) && ((sendDataLength >= totalLength) ||
594 (totalLength >= (s_debugConsoleState.writeRingBuffer.ringBufferSize - 1U))))
595 {
596 if (sendDataLength > totalLength)
597 {
598 sendDataLength = totalLength;
599 }
600
601 sentLength = DbgConsole_SendData(&ch[size - totalLength], (size_t)sendDataLength);
602 if (sentLength > 0)
603 {
604 totalLength = totalLength - (uint32_t)sentLength;
605 }
606 }
607 EnableGlobalIRQ(regPrimask);
608
609 if (totalLength != 0U)
610 {
611 serialManagerStatus = (serial_manager_status_t)DbgConsole_Flush();
612 if (kStatus_SerialManager_Success != serialManagerStatus)
613 {
614 break;
615 }
616 }
617 } while (totalLength != 0U);
618 return ((int)size - (int)totalLength);
619 #else /* DEBUG_CONSOLE_TX_RELIABLE_ENABLE */
620 return DbgConsole_SendData(ch, size);
621 #endif /* DEBUG_CONSOLE_TX_RELIABLE_ENABLE */
622
623 #else /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */
624 serialManagerStatus =
625 SerialManager_WriteBlocking(((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]), ch, size);
626 return ((kStatus_SerialManager_Success == serialManagerStatus) ? (int)size : -1);
627 #endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */
628 }
629
DbgConsole_ReadLine(uint8_t * buf,size_t size)630 int DbgConsole_ReadLine(uint8_t *buf, size_t size)
631 {
632 int i = 0;
633
634 assert(buf != NULL);
635
636 if (NULL == g_serialHandle)
637 {
638 return -1;
639 }
640
641 /* take mutex lock function */
642 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
643 DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(s_debugConsoleReadSemaphore);
644 #endif
645
646 do
647 {
648 /* recieve one char every time */
649 if ((status_t)kStatus_Success != DbgConsole_ReadOneCharacter(&buf[i]))
650 {
651 /* release mutex lock function */
652 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
653 DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);
654 #endif
655 i = -1;
656 break;
657 }
658 #if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION
659 (void)DbgConsole_EchoCharacter(&buf[i], false, &i);
660 #endif
661 /* analysis data */
662 if (((uint8_t)'\r' == buf[i]) || ((uint8_t)'\n' == buf[i]))
663 {
664 /* End of Line. */
665 if (0 == i)
666 {
667 buf[i] = (uint8_t)'\0';
668 continue;
669 }
670 else
671 {
672 break;
673 }
674 }
675 i++;
676 } while (i < (int)size);
677
678 /* get char should not add '\0'*/
679 if (i == (int)size)
680 {
681 buf[i] = (uint8_t)'\0';
682 }
683 else
684 {
685 buf[i + 1] = (uint8_t)'\0';
686 }
687
688 /* release mutex lock function */
689 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
690 DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);
691 #endif
692
693 return i;
694 }
695
DbgConsole_ReadCharacter(uint8_t * ch)696 int DbgConsole_ReadCharacter(uint8_t *ch)
697 {
698 int ret;
699
700 assert(ch);
701
702 if (NULL == g_serialHandle)
703 {
704 return -1;
705 }
706
707 /* take mutex lock function */
708 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
709 DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(s_debugConsoleReadSemaphore);
710 #endif
711 /* read one character */
712 if ((status_t)kStatus_Success == DbgConsole_ReadOneCharacter(ch))
713 {
714 ret = 1;
715 #if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION
716 (void)DbgConsole_EchoCharacter(ch, true, NULL);
717 #endif
718 }
719 else
720 {
721 ret = -1;
722 }
723
724 /* release mutex lock function */
725 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
726 DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);
727 #endif
728
729 return ret;
730 }
731
732 #if (defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK))
DbgConsole_PrintCallback(char * buf,int32_t * indicator,char dbgVal,int len)733 static void DbgConsole_PrintCallback(char *buf, int32_t *indicator, char dbgVal, int len)
734 {
735 int i = 0;
736
737 for (i = 0; i < len; i++)
738 {
739 if (((uint32_t)*indicator + 1UL) >= (uint32_t)DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN)
740 {
741 (void)DbgConsole_SendDataReliable((uint8_t *)buf, (size_t)(*indicator));
742 *indicator = 0;
743 }
744
745 buf[*indicator] = dbgVal;
746 (*indicator)++;
747 }
748 }
749 #endif
750
751 /*************Code for DbgConsole Init, Deinit, Printf, Scanf *******************************/
752 #if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART))
753 #if (defined(SERIAL_USE_CONFIGURE_STRUCTURE) && (SERIAL_USE_CONFIGURE_STRUCTURE > 0U))
754 #include "board.h"
755 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
756 static const serial_port_uart_config_t uartConfig = {.instance = BOARD_DEBUG_UART_INSTANCE,
757 .clockRate = BOARD_DEBUG_UART_CLK_FREQ,
758 .baudRate = BOARD_DEBUG_UART_BAUDRATE,
759 .parityMode = kSerialManager_UartParityDisabled,
760 .stopBitCount = kSerialManager_UartOneStopBit,
761 .enableRx = 1U,
762 .enableTx = 1U,
763 .enableRxRTS = 0U,
764 .enableTxCTS = 0U,
765 #if (defined(HAL_UART_ADAPTER_FIFO) && (HAL_UART_ADAPTER_FIFO > 0u))
766 .txFifoWatermark = 0U,
767 .rxFifoWatermark = 0U
768 #endif
769 };
770 #endif
771 #endif
772 /* See fsl_debug_console.h for documentation of this function. */
DbgConsole_Init(uint8_t instance,uint32_t baudRate,serial_port_type_t device,uint32_t clkSrcFreq)773 status_t DbgConsole_Init(uint8_t instance, uint32_t baudRate, serial_port_type_t device, uint32_t clkSrcFreq)
774 {
775 serial_manager_config_t serialConfig;
776 serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Success;
777
778 #if (defined(SERIAL_USE_CONFIGURE_STRUCTURE) && (SERIAL_USE_CONFIGURE_STRUCTURE == 0U))
779 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
780 serial_port_uart_config_t uartConfig = {
781 .instance = instance,
782 .clockRate = clkSrcFreq,
783 .baudRate = baudRate,
784 .parityMode = kSerialManager_UartParityDisabled,
785 .stopBitCount = kSerialManager_UartOneStopBit,
786 .enableRx = 1,
787 .enableTx = 1,
788 .enableRxRTS = 0U,
789 .enableTxCTS = 0U,
790 #if (defined(HAL_UART_ADAPTER_FIFO) && (HAL_UART_ADAPTER_FIFO > 0u))
791 .txFifoWatermark = 0U,
792 .rxFifoWatermark = 0U
793 #endif
794 };
795 #endif
796 #endif
797 (void)memset(&serialConfig, 0x0, sizeof(serial_manager_config_t));
798 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
799 serial_port_usb_cdc_config_t usbCdcConfig = {
800 .controllerIndex = (serial_port_usb_cdc_controller_index_t)instance,
801 };
802 #endif
803
804 #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
805 serial_port_swo_config_t swoConfig = {
806 .clockRate = clkSrcFreq,
807 .baudRate = baudRate,
808 .port = instance,
809 .protocol = kSerialManager_SwoProtocolNrz,
810 };
811 #endif
812
813 #if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
814 serial_port_virtual_config_t serialPortVirtualConfig = {
815 .controllerIndex = (serial_port_virtual_controller_index_t)instance,
816 };
817 #endif
818
819 serialConfig.type = device;
820 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
821 serialConfig.ringBuffer = &s_debugConsoleState.readRingBuffer[0];
822 serialConfig.ringBufferSize = DEBUG_CONSOLE_RECEIVE_BUFFER_LEN;
823 serialConfig.blockType = kSerialManager_NonBlocking;
824 #else
825 serialConfig.blockType = kSerialManager_Blocking;
826 #endif
827
828 if (kSerialPort_Uart == device)
829 {
830 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
831 #if (defined(SERIAL_USE_CONFIGURE_STRUCTURE) && (SERIAL_USE_CONFIGURE_STRUCTURE > 0U))
832 serialConfig.portConfig = (void *)&uartConfig;
833 #else
834 serialConfig.portConfig = &uartConfig;
835 #endif
836 #else
837 serialManagerStatus = kStatus_SerialManager_Error;
838 #endif
839 }
840 else if (kSerialPort_UsbCdc == device)
841 {
842 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
843 serialConfig.portConfig = &usbCdcConfig;
844 #else
845 serialManagerStatus = kStatus_SerialManager_Error;
846 #endif
847 }
848 else if (kSerialPort_Swo == device)
849 {
850 #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
851 serialConfig.portConfig = &swoConfig;
852 #else
853 serialManagerStatus = kStatus_SerialManager_Error;
854 #endif
855 }
856 else if (kSerialPort_Virtual == device)
857 {
858 #if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))
859 serialConfig.portConfig = &serialPortVirtualConfig;
860 #else
861 serialManagerStatus = kStatus_SerialManager_Error;
862 #endif
863 }
864 else if (kSerialPort_BleWu == device)
865 {
866 #if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))
867 serialConfig.portConfig = NULL;
868 #else
869 serialManagerStatus = kStatus_SerialManager_Error;
870 #endif
871 }
872 else
873 {
874 serialManagerStatus = kStatus_SerialManager_Error;
875 }
876
877 if (kStatus_SerialManager_Error != serialManagerStatus)
878 {
879 (void)memset(&s_debugConsoleState, 0, sizeof(s_debugConsoleState));
880
881 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
882 s_debugConsoleState.writeRingBuffer.ringBufferSize = DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN;
883 #endif
884
885 s_debugConsoleState.serialHandle = (serial_handle_t)&s_debugConsoleState.serialHandleBuffer[0];
886 serialManagerStatus = SerialManager_Init(s_debugConsoleState.serialHandle, &serialConfig);
887
888 assert(kStatus_SerialManager_Success == serialManagerStatus);
889
890 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
891 #if configSUPPORT_STATIC_ALLOCATION
892 DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore, &s_debugConsoleReadSemaphoreStatic);
893 #else
894 DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);
895 #endif
896 #endif
897 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
898 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS) && configSUPPORT_STATIC_ALLOCATION
899 DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(s_debugConsoleReadWaitSemaphore, &s_debugConsoleReadWaitSemaphoreStatic);
900 #else
901 DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(s_debugConsoleReadWaitSemaphore);
902 #endif
903 #endif
904
905 {
906 serialManagerStatus =
907 SerialManager_OpenWriteHandle(s_debugConsoleState.serialHandle,
908 ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]));
909 assert(kStatus_SerialManager_Success == serialManagerStatus);
910 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
911 (void)SerialManager_InstallTxCallback(
912 ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]),
913 DbgConsole_SerialManagerTxCallback, &s_debugConsoleState);
914 serialManagerStatus = SerialManager_OpenWriteHandle(
915 s_debugConsoleState.serialHandle,
916 ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer2[0]));
917 assert(kStatus_SerialManager_Success == serialManagerStatus);
918 (void)SerialManager_InstallTxCallback(
919 ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer2[0]),
920 DbgConsole_SerialManagerTx2Callback, &s_debugConsoleState);
921 #endif
922 }
923
924 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
925 {
926 serialManagerStatus =
927 SerialManager_OpenReadHandle(s_debugConsoleState.serialHandle,
928 ((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]));
929 assert(kStatus_SerialManager_Success == serialManagerStatus);
930 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
931 (void)SerialManager_InstallRxCallback(
932 ((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]),
933 DbgConsole_SerialManagerRxCallback, &s_debugConsoleState);
934 #endif
935 }
936 #endif
937
938 g_serialHandle = s_debugConsoleState.serialHandle;
939 }
940 return (status_t)serialManagerStatus;
941 }
942
943 /* See fsl_debug_console.h for documentation of this function. */
DbgConsole_EnterLowpower(void)944 status_t DbgConsole_EnterLowpower(void)
945 {
946 serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Error;
947 if (s_debugConsoleState.serialHandle != NULL)
948 {
949 serialManagerStatus = SerialManager_EnterLowpower(s_debugConsoleState.serialHandle);
950 }
951 return (status_t)serialManagerStatus;
952 }
953
954 /* See fsl_debug_console.h for documentation of this function. */
DbgConsole_ExitLowpower(void)955 status_t DbgConsole_ExitLowpower(void)
956 {
957 serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Error;
958
959 if (s_debugConsoleState.serialHandle != NULL)
960 {
961 serialManagerStatus = SerialManager_ExitLowpower(s_debugConsoleState.serialHandle);
962 }
963 return (status_t)serialManagerStatus;
964 }
965 /* See fsl_debug_console.h for documentation of this function. */
DbgConsole_Deinit(void)966 status_t DbgConsole_Deinit(void)
967 {
968 {
969 if (s_debugConsoleState.serialHandle != NULL)
970 {
971 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
972 (void)SerialManager_CloseWriteHandle(
973 ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer2[0]));
974 #endif
975 (void)SerialManager_CloseWriteHandle(
976 ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]));
977 }
978 }
979 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
980 {
981 if (s_debugConsoleState.serialHandle != NULL)
982 {
983 (void)SerialManager_CloseReadHandle(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]));
984 }
985 }
986 #endif
987 if (NULL != s_debugConsoleState.serialHandle)
988 {
989 if (kStatus_SerialManager_Success == SerialManager_Deinit(s_debugConsoleState.serialHandle))
990 {
991 s_debugConsoleState.serialHandle = NULL;
992 g_serialHandle = NULL;
993 }
994 }
995 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
996 DEBUG_CONSOLE_DESTROY_BINARY_SEMAPHORE(s_debugConsoleReadWaitSemaphore);
997 #endif
998 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
999 DEBUG_CONSOLE_DESTROY_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);
1000 #endif
1001
1002 return (status_t)kStatus_Success;
1003 }
1004 #endif /* ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) */
1005
1006 #if (((defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK))) || \
1007 ((SDK_DEBUGCONSOLE != DEBUGCONSOLE_REDIRECT_TO_SDK) && defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && \
1008 (defined(DEBUG_CONSOLE_TX_RELIABLE_ENABLE) && (DEBUG_CONSOLE_TX_RELIABLE_ENABLE > 0U))))
DbgConsole_Flush(void)1009 DEBUG_CONSOLE_FUNCTION_PREFIX status_t DbgConsole_Flush(void)
1010 {
1011 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
1012
1013 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_BM) && defined(OSA_USED)
1014
1015 if (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail)
1016 {
1017 return (status_t)kStatus_Fail;
1018 }
1019
1020 #else
1021
1022 while (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail)
1023 {
1024 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
1025 if (0U == IS_RUNNING_IN_ISR())
1026 {
1027 if (taskSCHEDULER_RUNNING == xTaskGetSchedulerState())
1028 {
1029 vTaskDelay(1);
1030 }
1031 }
1032 else
1033 {
1034 return (status_t)kStatus_Fail;
1035 }
1036 #endif
1037 }
1038
1039 #endif
1040
1041 #endif
1042 return (status_t)kStatus_Success;
1043 }
1044 #endif
1045
1046 #if (defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK))
1047 /* See fsl_debug_console.h for documentation of this function. */
DbgConsole_Printf(const char * fmt_s,...)1048 int DbgConsole_Printf(const char *fmt_s, ...)
1049 {
1050 va_list ap;
1051 int result = 0;
1052
1053 va_start(ap, fmt_s);
1054 result = DbgConsole_Vprintf(fmt_s, ap);
1055 va_end(ap);
1056
1057 return result;
1058 }
1059
1060 /* See fsl_debug_console.h for documentation of this function. */
DbgConsole_Vprintf(const char * fmt_s,va_list formatStringArg)1061 int DbgConsole_Vprintf(const char *fmt_s, va_list formatStringArg)
1062 {
1063 int logLength = 0, result = 0;
1064 char printBuf[DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN] = {'\0'};
1065
1066 if (NULL != g_serialHandle)
1067 {
1068 /* format print log first */
1069 logLength = StrFormatPrintf(fmt_s, formatStringArg, printBuf, DbgConsole_PrintCallback);
1070 /* print log */
1071 result = DbgConsole_SendDataReliable((uint8_t *)printBuf, (size_t)logLength);
1072 }
1073 return result;
1074 }
1075
1076 /* See fsl_debug_console.h for documentation of this function. */
DbgConsole_Putchar(int ch)1077 int DbgConsole_Putchar(int ch)
1078 {
1079 /* print char */
1080 return DbgConsole_SendDataReliable((uint8_t *)&ch, 1U);
1081 }
1082
1083 /* See fsl_debug_console.h for documentation of this function. */
DbgConsole_Scanf(char * fmt_s,...)1084 int DbgConsole_Scanf(char *fmt_s, ...)
1085 {
1086 va_list ap;
1087 int formatResult;
1088 char scanfBuf[DEBUG_CONSOLE_SCANF_MAX_LOG_LEN + 1U] = {'\0'};
1089
1090 /* scanf log */
1091 (void)DbgConsole_ReadLine((uint8_t *)scanfBuf, DEBUG_CONSOLE_SCANF_MAX_LOG_LEN);
1092 /* get va_list */
1093 va_start(ap, fmt_s);
1094 /* format scanf log */
1095 formatResult = StrFormatScanf(scanfBuf, fmt_s, ap);
1096
1097 va_end(ap);
1098
1099 return formatResult;
1100 }
1101
1102 /* See fsl_debug_console.h for documentation of this function. */
DbgConsole_BlockingPrintf(const char * fmt_s,...)1103 int DbgConsole_BlockingPrintf(const char *fmt_s, ...)
1104 {
1105 va_list ap;
1106 int result = 0;
1107
1108 va_start(ap, fmt_s);
1109 result = DbgConsole_BlockingVprintf(fmt_s, ap);
1110 va_end(ap);
1111
1112 return result;
1113 }
1114
1115 /* See fsl_debug_console.h for documentation of this function. */
DbgConsole_BlockingVprintf(const char * fmt_s,va_list formatStringArg)1116 int DbgConsole_BlockingVprintf(const char *fmt_s, va_list formatStringArg)
1117 {
1118 status_t dbgConsoleStatus;
1119 int logLength = 0, result = 0;
1120 char printBuf[DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN] = {'\0'};
1121
1122 if (NULL == g_serialHandle)
1123 {
1124 return 0;
1125 }
1126
1127 /* format print log first */
1128 logLength = StrFormatPrintf(fmt_s, formatStringArg, printBuf, DbgConsole_PrintCallback);
1129
1130 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
1131 (void)SerialManager_CancelWriting(((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]));
1132 #endif
1133 /* print log */
1134 dbgConsoleStatus =
1135 (status_t)SerialManager_WriteBlocking(((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]),
1136 (uint8_t *)printBuf, (size_t)logLength);
1137 result = (((status_t)kStatus_Success == dbgConsoleStatus) ? (int)logLength : -1);
1138
1139 return result;
1140 }
1141
1142 #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
DbgConsole_TryGetchar(char * ch)1143 status_t DbgConsole_TryGetchar(char *ch)
1144 {
1145 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
1146 uint32_t length = 0;
1147 status_t dbgConsoleStatus = (status_t)kStatus_Fail;
1148
1149 assert(ch);
1150
1151 if (NULL == g_serialHandle)
1152 {
1153 return kStatus_Fail;
1154 }
1155
1156 /* take mutex lock function */
1157 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
1158 DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(s_debugConsoleReadSemaphore);
1159 #endif
1160
1161 if (kStatus_SerialManager_Success ==
1162 SerialManager_TryRead(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]), (uint8_t *)ch, 1,
1163 &length))
1164 {
1165 if (length != 0U)
1166 {
1167 #if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION
1168 (void)DbgConsole_EchoCharacter((uint8_t *)ch, true, NULL);
1169 #endif
1170 dbgConsoleStatus = (status_t)kStatus_Success;
1171 }
1172 }
1173 /* release mutex lock function */
1174 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
1175 DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);
1176 #endif
1177 return dbgConsoleStatus;
1178 #else
1179 return (status_t)kStatus_Fail;
1180 #endif
1181 }
1182 #endif
1183
1184 /* See fsl_debug_console.h for documentation of this function. */
DbgConsole_Getchar(void)1185 int DbgConsole_Getchar(void)
1186 {
1187 int ret = -1;
1188 uint8_t ch = 0U;
1189
1190 /* Get char */
1191 if (DbgConsole_ReadCharacter(&ch) > 0)
1192 {
1193 ret = (int)ch;
1194 }
1195
1196 return ret;
1197 }
1198
1199 #endif /* SDK_DEBUGCONSOLE */
1200
1201 /*************Code to support toolchain's printf, scanf *******************************/
1202 /* These function __write and __read is used to support IAR toolchain to printf and scanf*/
1203 #if (defined(__ICCARM__))
1204 #if defined(SDK_DEBUGCONSOLE_UART)
1205 #pragma weak __write
1206 size_t __write(int handle, const unsigned char *buffer, size_t size);
__write(int handle,const unsigned char * buffer,size_t size)1207 size_t __write(int handle, const unsigned char *buffer, size_t size)
1208 {
1209 size_t ret;
1210 if (NULL == buffer)
1211 {
1212 /*
1213 * This means that we should flush internal buffers. Since we don't we just return.
1214 * (Remember, "handle" == -1 means that all handles should be flushed.)
1215 */
1216 ret = 0U;
1217 }
1218 else if ((handle != 1) && (handle != 2))
1219 {
1220 /* This function only writes to "standard out" and "standard err" for all other file handles it returns failure.
1221 */
1222 ret = (size_t)-1;
1223 }
1224 else
1225 {
1226 /* Send data. */
1227 uint8_t buff[512];
1228 (void)memcpy(buff, buffer, size);
1229 (void)DbgConsole_SendDataReliable((uint8_t *)buff, size);
1230
1231 ret = size;
1232 }
1233 return ret;
1234 }
1235
1236 #pragma weak __read
1237 size_t __read(int handle, unsigned char *buffer, size_t size);
__read(int handle,unsigned char * buffer,size_t size)1238 size_t __read(int handle, unsigned char *buffer, size_t size)
1239 {
1240 uint8_t ch = 0U;
1241 int actualSize = 0;
1242
1243 /* This function only reads from "standard in", for all other file handles it returns failure. */
1244 if (0 != handle)
1245 {
1246 actualSize = -1;
1247 }
1248 else
1249 {
1250 /* Receive data.*/
1251 for (; size > 0U; size--)
1252 {
1253 (void)DbgConsole_ReadCharacter(&ch);
1254 if (0U == ch)
1255 {
1256 break;
1257 }
1258
1259 *buffer++ = ch;
1260 actualSize++;
1261 }
1262 }
1263 return (size_t)actualSize;
1264 }
1265 #endif /* SDK_DEBUGCONSOLE_UART */
1266
1267 /* support LPC Xpresso with RedLib */
1268 #elif (defined(__REDLIB__))
1269
1270 #if (defined(SDK_DEBUGCONSOLE_UART))
__sys_write(int handle,char * buffer,int size)1271 int __attribute__((weak)) __sys_write(int handle, char *buffer, int size)
1272 {
1273 if (NULL == buffer)
1274 {
1275 /* return -1 if error. */
1276 return -1;
1277 }
1278
1279 /* This function only writes to "standard out" and "standard err" for all other file handles it returns failure. */
1280 if ((handle != 1) && (handle != 2))
1281 {
1282 return -1;
1283 }
1284
1285 /* Send data. */
1286 DbgConsole_SendDataReliable((uint8_t *)buffer, size);
1287
1288 return 0;
1289 }
1290
__sys_readc(void)1291 int __attribute__((weak)) __sys_readc(void)
1292 {
1293 char tmp;
1294
1295 /* Receive data. */
1296 DbgConsole_ReadCharacter((uint8_t *)&tmp);
1297
1298 return tmp;
1299 }
1300 #endif /* SDK_DEBUGCONSOLE_UART */
1301
1302 /* These function fputc and fgetc is used to support KEIL toolchain to printf and scanf*/
1303 #elif defined(__CC_ARM) || defined(__ARMCC_VERSION)
1304 #if defined(SDK_DEBUGCONSOLE_UART)
1305 #if defined(__CC_ARM)
1306 struct __FILE
1307 {
1308 int handle;
1309 /*
1310 * Whatever you require here. If the only file you are using is standard output using printf() for debugging,
1311 * no file handling is required.
1312 */
1313 };
1314 #endif
1315
1316 /* FILE is typedef in stdio.h. */
1317 #pragma weak __stdout
1318 #pragma weak __stdin
1319 FILE __stdout;
1320 FILE __stdin;
1321
1322 #pragma weak fputc
fputc(int ch,FILE * f)1323 int fputc(int ch, FILE *f)
1324 {
1325 /* Send data. */
1326 return DbgConsole_SendDataReliable((uint8_t *)(&ch), 1);
1327 }
1328
1329 #pragma weak fgetc
fgetc(FILE * f)1330 int fgetc(FILE *f)
1331 {
1332 char ch;
1333
1334 /* Receive data. */
1335 DbgConsole_ReadCharacter((uint8_t *)&ch);
1336
1337 return ch;
1338 }
1339
1340 /*
1341 * Terminate the program, passing a return code back to the user.
1342 * This function may not return.
1343 */
_sys_exit(int returncode)1344 void _sys_exit(int returncode)
1345 {
1346 while (1)
1347 {
1348 }
1349 }
1350
1351 /*
1352 * Writes a character to the output channel. This function is used
1353 * for last-resort error message output.
1354 */
_ttywrch(int ch)1355 void _ttywrch(int ch)
1356 {
1357 char ench = ch;
1358 DbgConsole_SendDataReliable((uint8_t *)(&ench), 1);
1359 }
1360
_sys_command_string(char * cmd,int len)1361 char *_sys_command_string(char *cmd, int len)
1362 {
1363 return (cmd);
1364 }
1365 #endif /* SDK_DEBUGCONSOLE_UART */
1366
1367 /* These function __write and __read is used to support ARM_GCC, KDS, Atollic toolchains to printf and scanf*/
1368 #elif (defined(__GNUC__))
1369
1370 #if ((defined(__GNUC__) && (!defined(__MCUXPRESSO)) && (defined(SDK_DEBUGCONSOLE_UART))) || \
1371 (defined(__MCUXPRESSO) && (defined(SDK_DEBUGCONSOLE_UART))))
1372 int __attribute__((weak)) _write(int handle, char *buffer, int size);
_write(int handle,char * buffer,int size)1373 int __attribute__((weak)) _write(int handle, char *buffer, int size)
1374 {
1375 if (NULL == buffer)
1376 {
1377 /* return -1 if error. */
1378 return -1;
1379 }
1380
1381 /* This function only writes to "standard out" and "standard err" for all other file handles it returns failure. */
1382 if ((handle != 1) && (handle != 2))
1383 {
1384 return -1;
1385 }
1386
1387 /* Send data. */
1388 (void)DbgConsole_SendDataReliable((uint8_t *)buffer, (size_t)size);
1389
1390 return size;
1391 }
1392
1393 int __attribute__((weak)) _read(int handle, char *buffer, int size);
_read(int handle,char * buffer,int size)1394 int __attribute__((weak)) _read(int handle, char *buffer, int size)
1395 {
1396 uint8_t ch = 0U;
1397 int actualSize = 0;
1398
1399 /* This function only reads from "standard in", for all other file handles it returns failure. */
1400 if (handle != 0)
1401 {
1402 return -1;
1403 }
1404
1405 /* Receive data. */
1406 for (; size > 0; size--)
1407 {
1408 if (DbgConsole_ReadCharacter(&ch) < 0)
1409 {
1410 break;
1411 }
1412
1413 *buffer++ = (char)ch;
1414 actualSize++;
1415
1416 if ((ch == 0U) || (ch == (uint8_t)'\n') || (ch == (uint8_t)'\r'))
1417 {
1418 break;
1419 }
1420 }
1421
1422 return (actualSize > 0) ? actualSize : -1;
1423 }
1424 #endif
1425
1426 #endif /* __ICCARM__ */
1427