2 * This is a modified version of the file printf.c, which was distributed
\r
3 * by Motorola as part of the M5407C3BOOT.zip package used to initialize
\r
4 * the M5407C3 evaluation board.
\r
7 * 1999-2000 MOTOROLA, INC. All Rights Reserved.
\r
8 * You are hereby granted a copyright license to use, modify, and
\r
9 * distribute the SOFTWARE so long as this entire notice is
\r
10 * retained without alteration in any modified and/or redistributed
\r
11 * versions, and that such modified versions are clearly identified
\r
12 * as such. No licenses are granted by implication, estoppel or
\r
13 * otherwise under any patents or trademarks of Motorola, Inc. This
\r
14 * software is provided on an "AS IS" basis and without warranty.
\r
16 * To the maximum extent permitted by applicable law, MOTOROLA
\r
17 * DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
\r
18 * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
\r
19 * PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
\r
20 * SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
\r
21 * ACCOMPANYING WRITTEN MATERIALS.
\r
23 * To the maximum extent permitted by applicable law, IN NO EVENT
\r
24 * SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
\r
25 * WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
\r
26 * INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
\r
27 * LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
\r
29 * Motorola assumes no responsibility for the maintenance and support
\r
32 * Copyright (c) 2015, Freescale Semiconductor, Inc.
\r
33 * Copyright 2016-2018 NXP
\r
35 * SPDX-License-Identifier: BSD-3-Clause
\r
40 #if defined(__CC_ARM) || defined(__ARMCC_VERSION)
\r
44 #ifdef FSL_RTOS_FREE_RTOS
\r
45 #include "FreeRTOS.h"
\r
50 #include "fsl_debug_console_conf.h"
\r
51 #include "fsl_str.h"
\r
53 #include "fsl_common.h"
\r
54 #include "serial_manager.h"
\r
56 #include "fsl_debug_console.h"
\r
58 /*******************************************************************************
\r
60 ******************************************************************************/
\r
62 #if (defined(DEBUG_CONSOLE_ASSERT_DISABLE) && (DEBUG_CONSOLE_ASSERT_DISABLE > 0U))
\r
68 /*! @brief character backspace ASCII value */
\r
69 #define DEBUG_CONSOLE_BACKSPACE 127
\r
71 /* lock definition */
\r
72 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
\r
74 static SemaphoreHandle_t s_debugConsoleReadSemaphore;
\r
75 static SemaphoreHandle_t s_debugConsoleReadWaitSemaphore;
\r
77 #elif(DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DDEBUG_CONSOLE_SYNCHRONIZATION_BM)
\r
79 static volatile uint8_t s_debugConsoleReadWaitSemaphore;
\r
83 #endif /* DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS */
\r
85 /*! @brief get current runing environment is ISR or not */
\r
87 #define IS_RUNNING_IN_ISR() SystemGetIRQNestingLevel()
\r
89 #define IS_RUNNING_IN_ISR() __get_IPSR()
\r
90 #endif /* __CA7_REV */
\r
92 /* semaphore definition */
\r
93 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
\r
95 /* mutex semaphore */
\r
96 #define DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(mutex) (mutex = xSemaphoreCreateMutex())
\r
98 /* clang-format off */
\r
99 #define DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(mutex) \
\r
101 if (IS_RUNNING_IN_ISR() == 0U) \
\r
103 xSemaphoreGive(mutex); \
\r
107 #define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(mutex) \
\r
109 if (IS_RUNNING_IN_ISR() == 0U) \
\r
111 xSemaphoreTake(mutex, portMAX_DELAY); \
\r
115 #define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_NONBLOCKING(mutex, result) \
\r
117 if (IS_RUNNING_IN_ISR() == 0U) \
\r
119 result = xSemaphoreTake(mutex, 0U); \
\r
126 /* clang-format on */
\r
128 /* Binary semaphore */
\r
129 #define DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(binary) (binary = xSemaphoreCreateBinary())
\r
130 #define DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(binary) (xSemaphoreTake(binary, portMAX_DELAY))
\r
131 #define DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(binary) (xSemaphoreGiveFromISR(binary, NULL))
\r
133 #elif(DEBUG_CONSOLE_SYNCHRONIZATION_BM == DEBUG_CONSOLE_SYNCHRONIZATION_MODE)
\r
135 #define DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(mutex)
\r
136 #define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(mutex)
\r
137 #define DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(mutex)
\r
138 #define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_NONBLOCKING(mutex, result) (result = 1U)
\r
140 #define DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(binary)
\r
141 #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
\r
142 #define DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(binary) \
\r
149 #define DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(binary) (binary = true)
\r
151 #define DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(binary)
\r
152 #define DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(binary)
\r
153 #endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */
\r
155 /* add other implementation here
\r
157 * #elif(DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DDEBUG_CONSOLE_SYNCHRONIZATION_xxx)
\r
162 #error RTOS type is not defined by DEBUG_CONSOLE_SYNCHRONIZATION_MODE.
\r
164 #endif /* DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS */
\r
166 #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
\r
167 /* receive state structure */
\r
168 typedef struct _debug_console_write_ring_buffer
\r
170 uint32_t ringBufferSize;
\r
171 volatile uint32_t ringHead;
\r
172 volatile uint32_t ringTail;
\r
173 uint8_t ringBuffer[DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN];
\r
174 } debug_console_write_ring_buffer_t;
\r
177 typedef struct _debug_console_state_struct
\r
179 uint8_t serialHandleBuffer[SERIAL_MANAGER_HANDLE_SIZE];
\r
180 serial_handle_t serialHandle; /*!< serial manager handle */
\r
181 #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
\r
182 debug_console_write_ring_buffer_t writeRingBuffer;
\r
183 uint8_t readRingBuffer[DEBUG_CONSOLE_RECEIVE_BUFFER_LEN];
\r
185 uint8_t serialWriteHandleBuffer[SERIAL_MANAGER_WRITE_HANDLE_SIZE];
\r
186 uint8_t serialReadHandleBuffer[SERIAL_MANAGER_READ_HANDLE_SIZE];
\r
187 } debug_console_state_struct_t;
\r
189 /*******************************************************************************
\r
191 ******************************************************************************/
\r
193 /*! @brief Debug console state information. */
\r
194 static debug_console_state_struct_t s_debugConsoleState;
\r
195 serial_handle_t g_serialHandle; /*!< serial manager handle */
\r
197 /*******************************************************************************
\r
199 ******************************************************************************/
\r
201 * @brief This is a printf call back function which is used to relocate the log to buffer
\r
202 * or print the log immediately when the local buffer is full.
\r
204 * @param[in] buf Buffer to store log.
\r
205 * @param[in] indicator Buffer index.
\r
206 * @param[in] val Target character to store.
\r
207 * @param[in] len length of the character
\r
210 #if SDK_DEBUGCONSOLE
\r
211 static void DbgConsole_PrintCallback(char *buf, int32_t *indicator, char val, int len);
\r
214 int DbgConsole_SendData(uint8_t *ch, size_t size);
\r
216 /*******************************************************************************
\r
218 ******************************************************************************/
\r
220 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
222 static void DbgConsole_SerialManagerTxCallback(void *callbackParam,
\r
223 serial_manager_callback_message_t *message,
\r
224 serial_manager_status_t status)
\r
226 debug_console_state_struct_t *ioState;
\r
227 uint32_t sendDataLength;
\r
229 if ((NULL == callbackParam) || (NULL == message))
\r
234 ioState = (debug_console_state_struct_t *)callbackParam;
\r
236 ioState->writeRingBuffer.ringTail += message->length;
\r
237 if (ioState->writeRingBuffer.ringTail >= ioState->writeRingBuffer.ringBufferSize)
\r
239 ioState->writeRingBuffer.ringTail = 0U;
\r
242 if (kStatus_SerialManager_Success == status)
\r
244 if (ioState->writeRingBuffer.ringTail != ioState->writeRingBuffer.ringHead)
\r
246 if (ioState->writeRingBuffer.ringHead > ioState->writeRingBuffer.ringTail)
\r
248 sendDataLength = ioState->writeRingBuffer.ringHead - ioState->writeRingBuffer.ringTail;
\r
252 sendDataLength = ioState->writeRingBuffer.ringBufferSize - ioState->writeRingBuffer.ringTail;
\r
255 SerialManager_WriteNonBlocking(((serial_write_handle_t)&ioState->serialWriteHandleBuffer[0]),
\r
256 &ioState->writeRingBuffer.ringBuffer[ioState->writeRingBuffer.ringTail],
\r
265 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
\r
267 static void DbgConsole_SerialManagerRxCallback(void *callbackParam,
\r
268 serial_manager_callback_message_t *message,
\r
269 serial_manager_status_t status)
\r
271 if ((NULL == callbackParam) || (NULL == message))
\r
276 if (kStatus_SerialManager_Notify == status)
\r
279 else if (kStatus_SerialManager_Success == status)
\r
281 /* release s_debugConsoleReadWaitSemaphore from RX callback */
\r
282 DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(s_debugConsoleReadWaitSemaphore);
\r
292 status_t DbgConsole_ReadOneCharacter(uint8_t *ch)
\r
294 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
\r
296 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && \
\r
297 (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DDEBUG_CONSOLE_SYNCHRONIZATION_BM) && defined(OSA_USED)
\r
298 return kStatus_Fail;
\r
300 status_t status = kStatus_SerialManager_Error;
\r
302 /* recieve one char every time */
\r
303 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
305 SerialManager_ReadNonBlocking(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]), ch, 1);
\r
307 status = SerialManager_ReadBlocking(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]), ch, 1);
\r
309 if (kStatus_SerialManager_Success != status)
\r
311 return kStatus_Fail;
\r
313 /* wait s_debugConsoleReadWaitSemaphore from RX callback */
\r
314 DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(s_debugConsoleReadWaitSemaphore);
\r
316 return kStatus_Success;
\r
321 return kStatus_Fail;
\r
326 #if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION
\r
327 static status_t DbgConsole_EchoCharacter(uint8_t *ch, bool isGetChar, int *index)
\r
329 /* Due to scanf take \n and \r as end of string,should not echo */
\r
330 if (((*ch != '\r') && (*ch != '\n')) || (isGetChar))
\r
332 /* recieve one char every time */
\r
333 if (1 != DbgConsole_SendData(ch, 1U))
\r
335 return kStatus_Fail;
\r
339 if ((!isGetChar) && (index))
\r
341 if (DEBUG_CONSOLE_BACKSPACE == *ch)
\r
354 return kStatus_Success;
\r
358 int DbgConsole_SendData(uint8_t *ch, size_t size)
\r
360 status_t status = kStatus_SerialManager_Error;
\r
361 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
362 uint32_t sendDataLength;
\r
365 assert(NULL != ch);
\r
368 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
369 uint32_t regPrimask = DisableGlobalIRQ();
\r
370 if (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail)
\r
374 (s_debugConsoleState.writeRingBuffer.ringHead + s_debugConsoleState.writeRingBuffer.ringBufferSize -
\r
375 s_debugConsoleState.writeRingBuffer.ringTail) %
\r
376 s_debugConsoleState.writeRingBuffer.ringBufferSize;
\r
380 sendDataLength = 0U;
\r
382 sendDataLength = s_debugConsoleState.writeRingBuffer.ringBufferSize - sendDataLength;
\r
383 if (sendDataLength <= size)
\r
385 EnableGlobalIRQ(regPrimask);
\r
388 for (int i = 0; i < size; i++)
\r
390 s_debugConsoleState.writeRingBuffer.ringBuffer[s_debugConsoleState.writeRingBuffer.ringHead++] = ch[i];
\r
391 if (s_debugConsoleState.writeRingBuffer.ringHead >= s_debugConsoleState.writeRingBuffer.ringBufferSize)
\r
393 s_debugConsoleState.writeRingBuffer.ringHead = 0U;
\r
397 status = kStatus_SerialManager_Success;
\r
401 if (s_debugConsoleState.writeRingBuffer.ringHead > s_debugConsoleState.writeRingBuffer.ringTail)
\r
404 s_debugConsoleState.writeRingBuffer.ringHead - s_debugConsoleState.writeRingBuffer.ringTail;
\r
409 s_debugConsoleState.writeRingBuffer.ringBufferSize - s_debugConsoleState.writeRingBuffer.ringTail;
\r
412 status = (status_t)SerialManager_WriteNonBlocking(
\r
413 ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]),
\r
414 &s_debugConsoleState.writeRingBuffer.ringBuffer[s_debugConsoleState.writeRingBuffer.ringTail],
\r
417 EnableGlobalIRQ(regPrimask);
\r
419 status = (status_t)SerialManager_WriteBlocking(
\r
420 ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]), ch, size);
\r
422 return ((kStatus_Success == status) ? (int)size : -1);
\r
425 int DbgConsole_ReadLine(uint8_t *buf, size_t size)
\r
429 assert(buf != NULL);
\r
431 /* take mutex lock function */
\r
432 DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(s_debugConsoleReadSemaphore);
\r
434 for (i = 0; i < size; i++)
\r
436 /* recieve one char every time */
\r
437 if (kStatus_Success != DbgConsole_ReadOneCharacter(&buf[i]))
\r
439 /* release mutex lock function */
\r
440 DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);
\r
443 #if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION
\r
444 DbgConsole_EchoCharacter(&buf[i], false, &i);
\r
446 /* analysis data */
\r
447 if (('\r' == buf[i]) || ('\n' == buf[i]))
\r
462 /* release mutex lock function */
\r
463 DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);
\r
468 int DbgConsole_ReadCharacter(uint8_t *ch)
\r
474 /* take mutex lock function */
\r
475 DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(s_debugConsoleReadSemaphore);
\r
476 /* read one character */
\r
477 if (kStatus_Success == DbgConsole_ReadOneCharacter(ch))
\r
480 #if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION
\r
481 DbgConsole_EchoCharacter(ch, true, NULL);
\r
489 /* release mutex lock function */
\r
490 DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);
\r
495 #if SDK_DEBUGCONSOLE
\r
496 static void DbgConsole_PrintCallback(char *buf, int32_t *indicator, char val, int len)
\r
500 for (i = 0; i < len; i++)
\r
502 if ((*indicator + 1) >= DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN)
\r
504 DbgConsole_SendData((uint8_t *)buf, *indicator);
\r
508 buf[*indicator] = val;
\r
514 /*************Code for DbgConsole Init, Deinit, Printf, Scanf *******************************/
\r
516 /* See fsl_debug_console.h for documentation of this function. */
\r
517 status_t DbgConsole_Init(uint8_t instance, uint32_t baudRate, serial_port_type_t device, uint32_t clkSrcFreq)
\r
519 serial_manager_config_t serialConfig;
\r
520 status_t status = kStatus_SerialManager_Error;
\r
522 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
\r
523 serial_port_uart_config_t uartConfig = {
\r
524 .instance = instance,
\r
525 .clockRate = clkSrcFreq,
\r
526 .baudRate = baudRate,
\r
527 .parityMode = kSerialManager_UartParityDisabled,
\r
528 .stopBitCount = kSerialManager_UartOneStopBit,
\r
534 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
\r
535 serial_port_usb_cdc_config_t usbCdcConfig = {
\r
536 .controllerIndex = (serial_port_usb_cdc_controller_index_t)instance,
\r
540 #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
\r
541 serial_port_swo_config_t swoConfig = {
\r
542 .clockRate = clkSrcFreq, .baudRate = baudRate, .port = instance, .protocol = kSerialManager_SwoProtocolNrz,
\r
546 serialConfig.type = device;
\r
547 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
548 serialConfig.ringBuffer = &s_debugConsoleState.readRingBuffer[0];
\r
549 serialConfig.ringBufferSize = DEBUG_CONSOLE_RECEIVE_BUFFER_LEN;
\r
552 if (kSerialPort_Uart == device)
\r
554 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
\r
555 serialConfig.portConfig = &uartConfig;
\r
560 else if (kSerialPort_UsbCdc == device)
\r
562 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
\r
563 serialConfig.portConfig = &usbCdcConfig;
\r
568 else if (kSerialPort_Swo == device)
\r
570 #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
\r
571 serialConfig.portConfig = &swoConfig;
\r
581 memset(&s_debugConsoleState, 0U, sizeof(s_debugConsoleState));
\r
583 s_debugConsoleState.serialHandle = (serial_handle_t)&s_debugConsoleState.serialHandleBuffer[0];
\r
584 g_serialHandle = s_debugConsoleState.serialHandle;
\r
585 status = SerialManager_Init(s_debugConsoleState.serialHandle, &serialConfig);
\r
587 assert(kStatus_SerialManager_Success == status);
\r
589 DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);
\r
590 DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(s_debugConsoleReadWaitSemaphore);
\r
592 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
593 s_debugConsoleState.writeRingBuffer.ringBufferSize = DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN;
\r
597 status = SerialManager_OpenWriteHandle(
\r
598 s_debugConsoleState.serialHandle, ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]));
\r
599 assert(kStatus_SerialManager_Success == status);
\r
600 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
601 SerialManager_InstallTxCallback(((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]),
\r
602 DbgConsole_SerialManagerTxCallback, &s_debugConsoleState);
\r
606 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
\r
608 status = SerialManager_OpenReadHandle(s_debugConsoleState.serialHandle,
\r
609 ((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]));
\r
610 assert(kStatus_SerialManager_Success == status);
\r
611 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
612 SerialManager_InstallRxCallback(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]),
\r
613 DbgConsole_SerialManagerRxCallback, &s_debugConsoleState);
\r
617 return kStatus_Success;
\r
620 /* See fsl_debug_console.h for documentation of this function. */
\r
621 status_t DbgConsole_Deinit(void)
\r
624 SerialManager_CloseWriteHandle(((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]));
\r
626 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
\r
628 SerialManager_CloseReadHandle(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]));
\r
632 return kStatus_Success;
\r
635 status_t DbgConsole_Flush(void)
\r
637 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
639 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DDEBUG_CONSOLE_SYNCHRONIZATION_BM) && defined(OSA_USED)
\r
641 if (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail)
\r
643 return kStatus_Fail;
\r
648 while (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail)
\r
650 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
\r
651 if (IS_RUNNING_IN_ISR() == 0U)
\r
657 return kStatus_Fail;
\r
665 return kStatus_Success;
\r
668 #if SDK_DEBUGCONSOLE
\r
669 /* See fsl_debug_console.h for documentation of this function. */
\r
670 int DbgConsole_Printf(const char *formatString, ...)
\r
673 int logLength = 0U, result = 0U;
\r
674 char printBuf[DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN] = {0U};
\r
676 if (NULL == g_serialHandle)
\r
681 va_start(ap, formatString);
\r
682 /* format print log first */
\r
683 logLength = StrFormatPrintf(formatString, ap, printBuf, DbgConsole_PrintCallback);
\r
685 result = DbgConsole_SendData((uint8_t *)printBuf, logLength);
\r
692 /* See fsl_debug_console.h for documentation of this function. */
\r
693 int DbgConsole_Putchar(int ch)
\r
696 return DbgConsole_SendData((uint8_t *)&ch, 1U);
\r
699 /* See fsl_debug_console.h for documentation of this function. */
\r
700 int DbgConsole_Scanf(char *formatString, ...)
\r
704 char scanfBuf[DEBUG_CONSOLE_SCANF_MAX_LOG_LEN + 1U] = {0U};
\r
707 DbgConsole_ReadLine((uint8_t *)scanfBuf, DEBUG_CONSOLE_SCANF_MAX_LOG_LEN);
\r
709 va_start(ap, formatString);
\r
710 /* format scanf log */
\r
711 result = StrFormatScanf(scanfBuf, formatString, ap);
\r
718 #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
\r
719 status_t DbgConsole_TryGetchar(char *ch)
\r
721 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
\r
722 uint32_t length = 0;
\r
723 status_t status = kStatus_Fail;
\r
727 /* take mutex lock function */
\r
728 DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(s_debugConsoleReadSemaphore);
\r
730 if (kStatus_SerialManager_Success ==
\r
731 SerialManager_TryRead(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]), (uint8_t *)ch, 1,
\r
736 #if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION
\r
737 DbgConsole_EchoCharacter(ch, true, NULL);
\r
739 status = kStatus_Success;
\r
742 /* release mutex lock function */
\r
743 DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);
\r
746 return kStatus_Fail;
\r
751 /* See fsl_debug_console.h for documentation of this function. */
\r
752 int DbgConsole_Getchar(void)
\r
757 DbgConsole_ReadCharacter(&ch);
\r
762 #endif /* SDK_DEBUGCONSOLE */
\r
764 /*************Code to support toolchain's printf, scanf *******************************/
\r
765 /* These function __write and __read is used to support IAR toolchain to printf and scanf*/
\r
766 #if (defined(__ICCARM__))
\r
767 #if defined(SDK_DEBUGCONSOLE_UART)
\r
768 #pragma weak __write
\r
769 size_t __write(int handle, const unsigned char *buffer, size_t size)
\r
774 * This means that we should flush internal buffers. Since we don't we just return.
\r
775 * (Remember, "handle" == -1 means that all handles should be flushed.)
\r
780 /* This function only writes to "standard out" and "standard err" for all other file handles it returns failure. */
\r
781 if ((handle != 1) && (handle != 2))
\r
783 return ((size_t)-1);
\r
787 DbgConsole_SendData((uint8_t *)buffer, size);
\r
792 #pragma weak __read
\r
793 size_t __read(int handle, unsigned char *buffer, size_t size)
\r
796 size_t actualSize = 0U;
\r
797 /* This function only reads from "standard in", for all other file handles it returns failure. */
\r
800 return ((size_t)-1);
\r
804 for (; size > 0; size--)
\r
806 DbgConsole_ReadCharacter(&ch);
\r
818 #endif /* SDK_DEBUGCONSOLE_UART */
\r
820 /* support LPC Xpresso with RedLib */
\r
821 #elif(defined(__REDLIB__))
\r
823 #if (!SDK_DEBUGCONSOLE) && (defined(SDK_DEBUGCONSOLE_UART))
\r
824 int __attribute__((weak)) __sys_write(int handle, char *buffer, int size)
\r
828 /* return -1 if error. */
\r
832 /* This function only writes to "standard out" and "standard err" for all other file handles it returns failure. */
\r
833 if ((handle != 1) && (handle != 2))
\r
839 DbgConsole_SendData((uint8_t *)buffer, size);
\r
844 int __attribute__((weak)) __sys_readc(void)
\r
848 /* Receive data. */
\r
849 DbgConsole_ReadCharacter((uint8_t *)&tmp);
\r
855 /* These function fputc and fgetc is used to support KEIL toolchain to printf and scanf*/
\r
856 #elif defined(__CC_ARM) || defined(__ARMCC_VERSION)
\r
857 #if defined(SDK_DEBUGCONSOLE_UART)
\r
858 #if defined(__CC_ARM)
\r
863 * Whatever you require here. If the only file you are using is standard output using printf() for debugging,
\r
864 * no file handling is required.
\r
869 /* FILE is typedef in stdio.h. */
\r
870 #pragma weak __stdout
\r
871 #pragma weak __stdin
\r
876 int fputc(int ch, FILE *f)
\r
879 return DbgConsole_SendData((uint8_t *)(&ch), 1);
\r
887 /* Receive data. */
\r
888 DbgConsole_ReadCharacter((uint8_t *)&ch);
\r
894 * Terminate the program, passing a return code back to the user.
\r
895 * This function may not return.
\r
897 void _sys_exit(int returncode)
\r
905 * Writes a character to the output channel. This function is used
\r
906 * for last-resort error message output.
\r
908 void _ttywrch(int ch)
\r
911 DbgConsole_SendData((uint8_t *)(&ench), 1);
\r
914 char *_sys_command_string(char *cmd, int len)
\r
918 #endif /* SDK_DEBUGCONSOLE_UART */
\r
919 /* These function __write and __read is used to support ARM_GCC, KDS, Atollic toolchains to printf and scanf*/
\r
920 #elif(defined(__GNUC__))
\r
922 #if ((defined(__GNUC__) && (!defined(__MCUXPRESSO)) && (defined(SDK_DEBUGCONSOLE_UART))) || \
\r
923 (defined(__MCUXPRESSO) && (!SDK_DEBUGCONSOLE) && (defined(SDK_DEBUGCONSOLE_UART))))
\r
925 int __attribute__((weak)) _write(int handle, char *buffer, int size)
\r
929 /* return -1 if error. */
\r
933 /* This function only writes to "standard out" and "standard err" for all other file handles it returns failure. */
\r
934 if ((handle != 1) && (handle != 2))
\r
940 DbgConsole_SendData((uint8_t *)buffer, size);
\r
945 int __attribute__((weak)) _read(int handle, char *buffer, int size)
\r
948 int actualSize = 0U;
\r
950 /* This function only reads from "standard in", for all other file handles it returns failure. */
\r
956 for (; size > 0; size--)
\r
958 DbgConsole_ReadCharacter(&ch);
\r
963 if ((ch == 0) || (ch == '\n') || (ch == '\r'))
\r
972 #endif /* __ICCARM__ */
\r