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-2019 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 #if SDK_DEBUGCONSOLE
\r
69 #define DEBUG_CONSOLE_FUNCTION_PREFIX
\r
71 #define DEBUG_CONSOLE_FUNCTION_PREFIX static
\r
74 /*! @brief character backspace ASCII value */
\r
75 #define DEBUG_CONSOLE_BACKSPACE 127U
\r
77 /* lock definition */
\r
78 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
\r
80 static SemaphoreHandle_t s_debugConsoleReadSemaphore;
\r
81 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
\r
82 static SemaphoreHandle_t s_debugConsoleReadWaitSemaphore;
\r
85 #elif (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_BM)
\r
87 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
\r
88 static volatile uint8_t s_debugConsoleReadWaitSemaphore;
\r
93 #endif /* DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS */
\r
95 /*! @brief get current runing environment is ISR or not */
\r
97 #define IS_RUNNING_IN_ISR() SystemGetIRQNestingLevel()
\r
99 #define IS_RUNNING_IN_ISR() __get_IPSR()
\r
100 #endif /* __CA7_REV */
\r
102 /* semaphore definition */
\r
103 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
\r
105 /* mutex semaphore */
\r
106 /* clang-format off */
\r
107 #define DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(mutex) ((mutex) = xSemaphoreCreateMutex())
\r
108 #define DEBUG_CONSOLE_DESTROY_MUTEX_SEMAPHORE(mutex) \
\r
111 if(NULL != mutex) \
\r
113 vSemaphoreDelete(mutex); \
\r
118 #define DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(mutex) \
\r
120 if (IS_RUNNING_IN_ISR() == 0U) \
\r
122 (void)xSemaphoreGive(mutex); \
\r
126 #define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(mutex) \
\r
128 if (IS_RUNNING_IN_ISR() == 0U) \
\r
130 (void)xSemaphoreTake(mutex, portMAX_DELAY); \
\r
134 #define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_NONBLOCKING(mutex, result) \
\r
136 if (IS_RUNNING_IN_ISR() == 0U) \
\r
138 result = xSemaphoreTake(mutex, 0U); \
\r
146 /* Binary semaphore */
\r
147 #define DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(binary) ((binary) = xSemaphoreCreateBinary())
\r
148 #define DEBUG_CONSOLE_DESTROY_BINARY_SEMAPHORE(binary) \
\r
151 if(NULL != binary) \
\r
153 vSemaphoreDelete(binary); \
\r
157 #define DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(binary) ((void)xSemaphoreTake(binary, portMAX_DELAY))
\r
158 #define DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(binary) ((void)xSemaphoreGiveFromISR(binary, NULL))
\r
160 #elif (DEBUG_CONSOLE_SYNCHRONIZATION_BM == DEBUG_CONSOLE_SYNCHRONIZATION_MODE)
\r
162 #define DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(mutex)
\r
163 #define DEBUG_CONSOLE_DESTROY_MUTEX_SEMAPHORE(mutex)
\r
164 #define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(mutex)
\r
165 #define DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(mutex)
\r
166 #define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_NONBLOCKING(mutex, result) (result = 1U)
\r
168 #define DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(binary)
\r
169 #define DEBUG_CONSOLE_DESTROY_BINARY_SEMAPHORE(binary)
\r
170 #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
\r
171 #define DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(binary) \
\r
178 #define DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(binary) (binary = true)
\r
180 #define DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(binary)
\r
181 #define DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(binary)
\r
182 #endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */
\r
183 /* clang-format on */
\r
185 /* add other implementation here
\r
187 * #elif(DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DDEBUG_CONSOLE_SYNCHRONIZATION_xxx)
\r
192 #error RTOS type is not defined by DEBUG_CONSOLE_SYNCHRONIZATION_MODE.
\r
194 #endif /* DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS */
\r
196 #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
\r
197 /* receive state structure */
\r
198 typedef struct _debug_console_write_ring_buffer
\r
200 uint32_t ringBufferSize;
\r
201 volatile uint32_t ringHead;
\r
202 volatile uint32_t ringTail;
\r
203 uint8_t ringBuffer[DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN];
\r
204 } debug_console_write_ring_buffer_t;
\r
207 typedef struct _debug_console_state_struct
\r
209 uint8_t serialHandleBuffer[SERIAL_MANAGER_HANDLE_SIZE];
\r
210 serial_handle_t serialHandle; /*!< serial manager handle */
\r
211 #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
\r
212 debug_console_write_ring_buffer_t writeRingBuffer;
\r
213 uint8_t readRingBuffer[DEBUG_CONSOLE_RECEIVE_BUFFER_LEN];
\r
215 uint8_t serialWriteHandleBuffer[SERIAL_MANAGER_WRITE_HANDLE_SIZE];
\r
216 uint8_t serialReadHandleBuffer[SERIAL_MANAGER_READ_HANDLE_SIZE];
\r
217 } debug_console_state_struct_t;
\r
219 /*******************************************************************************
\r
221 ******************************************************************************/
\r
223 /*! @brief Debug console state information. */
\r
224 #if (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE > 0))
\r
225 AT_NONCACHEABLE_SECTION(static debug_console_state_struct_t s_debugConsoleState);
\r
227 static debug_console_state_struct_t s_debugConsoleState;
\r
229 serial_handle_t g_serialHandle; /*!< serial manager handle */
\r
231 /*******************************************************************************
\r
233 ******************************************************************************/
\r
235 * @brief This is a printf call back function which is used to relocate the log to buffer
\r
236 * or print the log immediately when the local buffer is full.
\r
238 * @param[in] buf Buffer to store log.
\r
239 * @param[in] indicator Buffer index.
\r
240 * @param[in] val Target character to store.
\r
241 * @param[in] len length of the character
\r
244 #if SDK_DEBUGCONSOLE
\r
245 static void DbgConsole_PrintCallback(char *buf, int32_t *indicator, char dbgVal, int len);
\r
248 status_t DbgConsole_ReadOneCharacter(uint8_t *ch);
\r
249 int DbgConsole_SendData(uint8_t *ch, size_t size);
\r
250 int DbgConsole_SendDataReliable(uint8_t *ch, size_t size);
\r
251 int DbgConsole_ReadLine(uint8_t *buf, size_t size);
\r
252 int DbgConsole_ReadCharacter(uint8_t *ch);
\r
254 #if ((SDK_DEBUGCONSOLE > 0U) || \
\r
255 ((SDK_DEBUGCONSOLE == 0U) && defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && \
\r
256 (defined(DEBUG_CONSOLE_TX_RELIABLE_ENABLE) && (DEBUG_CONSOLE_TX_RELIABLE_ENABLE > 0U))))
\r
257 DEBUG_CONSOLE_FUNCTION_PREFIX status_t DbgConsole_Flush(void);
\r
259 /*******************************************************************************
\r
261 ******************************************************************************/
\r
263 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
265 static void DbgConsole_SerialManagerTxCallback(void *callbackParam,
\r
266 serial_manager_callback_message_t *message,
\r
267 serial_manager_status_t status)
\r
269 debug_console_state_struct_t *ioState;
\r
270 uint32_t sendDataLength;
\r
272 if ((NULL == callbackParam) || (NULL == message))
\r
277 ioState = (debug_console_state_struct_t *)callbackParam;
\r
279 ioState->writeRingBuffer.ringTail += message->length;
\r
280 if (ioState->writeRingBuffer.ringTail >= ioState->writeRingBuffer.ringBufferSize)
\r
282 ioState->writeRingBuffer.ringTail = 0U;
\r
285 if (kStatus_SerialManager_Success == status)
\r
287 if (ioState->writeRingBuffer.ringTail != ioState->writeRingBuffer.ringHead)
\r
289 if (ioState->writeRingBuffer.ringHead > ioState->writeRingBuffer.ringTail)
\r
291 sendDataLength = ioState->writeRingBuffer.ringHead - ioState->writeRingBuffer.ringTail;
\r
295 sendDataLength = ioState->writeRingBuffer.ringBufferSize - ioState->writeRingBuffer.ringTail;
\r
298 (void)SerialManager_WriteNonBlocking(
\r
299 ((serial_write_handle_t)&ioState->serialWriteHandleBuffer[0]),
\r
300 &ioState->writeRingBuffer.ringBuffer[ioState->writeRingBuffer.ringTail], sendDataLength);
\r
303 else if (kStatus_SerialManager_Canceled == status)
\r
305 ioState->writeRingBuffer.ringTail = 0U;
\r
306 ioState->writeRingBuffer.ringHead = 0U;
\r
310 /*MISRA rule 16.4*/
\r
314 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
\r
316 static void DbgConsole_SerialManagerRxCallback(void *callbackParam,
\r
317 serial_manager_callback_message_t *message,
\r
318 serial_manager_status_t status)
\r
320 if ((NULL == callbackParam) || (NULL == message))
\r
325 if (kStatus_SerialManager_Notify == status)
\r
328 else if (kStatus_SerialManager_Success == status)
\r
330 /* release s_debugConsoleReadWaitSemaphore from RX callback */
\r
331 DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(s_debugConsoleReadWaitSemaphore);
\r
335 /*MISRA rule 16.4*/
\r
342 status_t DbgConsole_ReadOneCharacter(uint8_t *ch)
\r
344 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
\r
346 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && \
\r
347 (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_BM) && defined(OSA_USED)
\r
348 return kStatus_Fail;
\r
350 status_t status = (status_t)kStatus_SerialManager_Error;
\r
352 /* recieve one char every time */
\r
353 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
354 status = (status_t)SerialManager_ReadNonBlocking(
\r
355 ((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]), ch, 1);
\r
357 status = (status_t)SerialManager_ReadBlocking(
\r
358 ((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]), ch, 1);
\r
360 if ((status_t)kStatus_SerialManager_Success != status)
\r
362 return (status_t)kStatus_Fail;
\r
364 /* wait s_debugConsoleReadWaitSemaphore from RX callback */
\r
365 DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(s_debugConsoleReadWaitSemaphore);
\r
367 return (status_t)kStatus_Success;
\r
372 return (status_t)kStatus_Fail;
\r
377 #if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION
\r
378 static status_t DbgConsole_EchoCharacter(uint8_t *ch, bool isGetChar, int *index)
\r
380 /* Due to scanf take \n and \r as end of string,should not echo */
\r
381 if (((*ch != (uint8_t)'\r') && (*ch != (uint8_t)'\n')) || (isGetChar))
\r
383 /* recieve one char every time */
\r
384 if (1 != DbgConsole_SendDataReliable(ch, 1U))
\r
386 return (status_t)kStatus_Fail;
\r
390 if ((!isGetChar) && (index != NULL))
\r
392 if (DEBUG_CONSOLE_BACKSPACE == *ch)
\r
405 return (status_t)kStatus_Success;
\r
409 int DbgConsole_SendData(uint8_t *ch, size_t size)
\r
411 status_t status = (status_t)kStatus_SerialManager_Error;
\r
412 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
413 uint32_t sendDataLength;
\r
416 assert(NULL != ch);
\r
419 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
420 uint32_t regPrimask = DisableGlobalIRQ();
\r
421 if (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail)
\r
425 (s_debugConsoleState.writeRingBuffer.ringHead + s_debugConsoleState.writeRingBuffer.ringBufferSize -
\r
426 s_debugConsoleState.writeRingBuffer.ringTail) %
\r
427 s_debugConsoleState.writeRingBuffer.ringBufferSize;
\r
431 sendDataLength = 0U;
\r
433 sendDataLength = s_debugConsoleState.writeRingBuffer.ringBufferSize - sendDataLength - 1;
\r
434 if (sendDataLength < size)
\r
436 EnableGlobalIRQ(regPrimask);
\r
439 for (int i = 0; i < (int)size; i++)
\r
441 s_debugConsoleState.writeRingBuffer.ringBuffer[s_debugConsoleState.writeRingBuffer.ringHead++] = ch[i];
\r
442 if (s_debugConsoleState.writeRingBuffer.ringHead >= s_debugConsoleState.writeRingBuffer.ringBufferSize)
\r
444 s_debugConsoleState.writeRingBuffer.ringHead = 0U;
\r
448 status = (status_t)kStatus_SerialManager_Success;
\r
452 if (s_debugConsoleState.writeRingBuffer.ringHead > s_debugConsoleState.writeRingBuffer.ringTail)
\r
455 s_debugConsoleState.writeRingBuffer.ringHead - s_debugConsoleState.writeRingBuffer.ringTail;
\r
460 s_debugConsoleState.writeRingBuffer.ringBufferSize - s_debugConsoleState.writeRingBuffer.ringTail;
\r
463 status = (status_t)SerialManager_WriteNonBlocking(
\r
464 ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]),
\r
465 &s_debugConsoleState.writeRingBuffer.ringBuffer[s_debugConsoleState.writeRingBuffer.ringTail],
\r
468 EnableGlobalIRQ(regPrimask);
\r
470 status = (status_t)SerialManager_WriteBlocking(
\r
471 ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]), ch, size);
\r
473 return (((status_t)kStatus_Success == status) ? (int)size : -1);
\r
476 int DbgConsole_SendDataReliable(uint8_t *ch, size_t size)
\r
478 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
479 #if (defined(DEBUG_CONSOLE_TX_RELIABLE_ENABLE) && (DEBUG_CONSOLE_TX_RELIABLE_ENABLE > 0U))
\r
480 status_t status = kStatus_SerialManager_Error;
\r
481 uint32_t sendDataLength;
\r
482 uint32_t totalLength = size;
\r
484 #endif /* DEBUG_CONSOLE_TX_RELIABLE_ENABLE */
\r
486 status_t status = kStatus_SerialManager_Error;
\r
487 #endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */
\r
489 assert(NULL != ch);
\r
492 if (NULL == g_serialHandle)
\r
497 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
499 #if (defined(DEBUG_CONSOLE_TX_RELIABLE_ENABLE) && (DEBUG_CONSOLE_TX_RELIABLE_ENABLE > 0U))
\r
502 uint32_t regPrimask = DisableGlobalIRQ();
\r
503 if (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail)
\r
506 (s_debugConsoleState.writeRingBuffer.ringHead + s_debugConsoleState.writeRingBuffer.ringBufferSize -
\r
507 s_debugConsoleState.writeRingBuffer.ringTail) %
\r
508 s_debugConsoleState.writeRingBuffer.ringBufferSize;
\r
512 sendDataLength = 0U;
\r
514 sendDataLength = s_debugConsoleState.writeRingBuffer.ringBufferSize - sendDataLength - 1U;
\r
516 if (sendDataLength > 0U)
\r
518 if (sendDataLength > totalLength)
\r
520 sendDataLength = totalLength;
\r
523 sentLength = DbgConsole_SendData(&ch[size - totalLength], sendDataLength);
\r
524 if (sentLength > 0)
\r
526 totalLength = totalLength - (uint32_t)sentLength;
\r
529 EnableGlobalIRQ(regPrimask);
\r
531 if (totalLength != 0U)
\r
533 status = DbgConsole_Flush();
\r
534 if ((status_t)kStatus_Success != status)
\r
539 } while (totalLength != 0U);
\r
540 return (status_t)(uint32_t)((uint32_t)size - totalLength);
\r
542 return DbgConsole_SendData(ch, size);
\r
543 #endif /* DEBUG_CONSOLE_TX_RELIABLE_ENABLE */
\r
546 status = (status_t)SerialManager_WriteBlocking(
\r
547 ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]), ch, size);
\r
548 return (((status_t)kStatus_Success == status) ? (int)size : -1);
\r
549 #endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */
\r
552 int DbgConsole_ReadLine(uint8_t *buf, size_t size)
\r
556 assert(buf != NULL);
\r
558 if (NULL == g_serialHandle)
\r
563 /* take mutex lock function */
\r
564 DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(s_debugConsoleReadSemaphore);
\r
568 /* recieve one char every time */
\r
569 if ((status_t)kStatus_Success != DbgConsole_ReadOneCharacter(&buf[i]))
\r
571 /* release mutex lock function */
\r
572 DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);
\r
576 #if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION
\r
577 (void)DbgConsole_EchoCharacter(&buf[i], false, &i);
\r
579 /* analysis data */
\r
580 if (((uint8_t)'\r' == buf[i]) || ((uint8_t)'\n' == buf[i]))
\r
585 buf[i] = (uint8_t)'\0';
\r
594 } while (i < (int)size);
\r
596 /* get char should not add '\0'*/
\r
597 if (i == (int)size)
\r
599 buf[i] = (uint8_t)'\0';
\r
603 buf[i + 1] = (uint8_t)'\0';
\r
606 /* release mutex lock function */
\r
607 DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);
\r
612 int DbgConsole_ReadCharacter(uint8_t *ch)
\r
618 if (NULL == g_serialHandle)
\r
623 /* take mutex lock function */
\r
624 DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(s_debugConsoleReadSemaphore);
\r
625 /* read one character */
\r
626 if ((status_t)kStatus_Success == DbgConsole_ReadOneCharacter(ch))
\r
629 #if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION
\r
630 (void)DbgConsole_EchoCharacter(ch, true, NULL);
\r
638 /* release mutex lock function */
\r
639 DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);
\r
644 #if SDK_DEBUGCONSOLE
\r
645 static void DbgConsole_PrintCallback(char *buf, int32_t *indicator, char dbgVal, int len)
\r
649 for (i = 0; i < len; i++)
\r
651 if (((uint32_t)*indicator + 1UL) >= DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN)
\r
653 (void)DbgConsole_SendDataReliable((uint8_t *)buf, (uint32_t)(*indicator));
\r
657 buf[*indicator] = dbgVal;
\r
663 /*************Code for DbgConsole Init, Deinit, Printf, Scanf *******************************/
\r
665 #if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART))
\r
666 /* See fsl_debug_console.h for documentation of this function. */
\r
667 status_t DbgConsole_Init(uint8_t instance, uint32_t baudRate, serial_port_type_t device, uint32_t clkSrcFreq)
\r
669 serial_manager_config_t serialConfig;
\r
670 status_t status = (status_t)kStatus_SerialManager_Error;
\r
672 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
\r
673 serial_port_uart_config_t uartConfig = {
\r
674 .instance = instance,
\r
675 .clockRate = clkSrcFreq,
\r
676 .baudRate = baudRate,
\r
677 .parityMode = kSerialManager_UartParityDisabled,
\r
678 .stopBitCount = kSerialManager_UartOneStopBit,
\r
684 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
\r
685 serial_port_usb_cdc_config_t usbCdcConfig = {
\r
686 .controllerIndex = (serial_port_usb_cdc_controller_index_t)instance,
\r
690 #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
\r
691 serial_port_swo_config_t swoConfig = {
\r
692 .clockRate = clkSrcFreq,
\r
693 .baudRate = baudRate,
\r
695 .protocol = kSerialManager_SwoProtocolNrz,
\r
699 #if (defined(SERIAL_PORT_TYPE_USBCDC_VIRTUAL) && (SERIAL_PORT_TYPE_USBCDC_VIRTUAL > 0U))
\r
700 serial_port_usb_cdc_virtual_config_t usbCdcVirtualConfig = {
\r
701 .controllerIndex = (serial_port_usb_cdc_virtual_controller_index_t)instance,
\r
704 serialConfig.type = device;
\r
705 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
706 serialConfig.ringBuffer = &s_debugConsoleState.readRingBuffer[0];
\r
707 serialConfig.ringBufferSize = DEBUG_CONSOLE_RECEIVE_BUFFER_LEN;
\r
710 if (kSerialPort_Uart == device)
\r
712 #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))
\r
713 serialConfig.portConfig = &uartConfig;
\r
718 else if (kSerialPort_UsbCdc == device)
\r
720 #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))
\r
721 serialConfig.portConfig = &usbCdcConfig;
\r
726 else if (kSerialPort_Swo == device)
\r
728 #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))
\r
729 serialConfig.portConfig = &swoConfig;
\r
734 else if (kSerialPort_UsbCdcVirtual == device)
\r
736 #if (defined(SERIAL_PORT_TYPE_USBCDC_VIRTUAL) && (SERIAL_PORT_TYPE_USBCDC_VIRTUAL > 0U))
\r
737 serialConfig.portConfig = &usbCdcVirtualConfig;
\r
747 (void)memset(&s_debugConsoleState, 0, sizeof(s_debugConsoleState));
\r
749 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
750 s_debugConsoleState.writeRingBuffer.ringBufferSize = DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN;
\r
753 s_debugConsoleState.serialHandle = (serial_handle_t)&s_debugConsoleState.serialHandleBuffer[0];
\r
754 status = (status_t)SerialManager_Init(s_debugConsoleState.serialHandle, &serialConfig);
\r
756 assert(kStatus_SerialManager_Success == status);
\r
758 DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);
\r
759 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
\r
760 DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(s_debugConsoleReadWaitSemaphore);
\r
764 status = (status_t)SerialManager_OpenWriteHandle(
\r
765 s_debugConsoleState.serialHandle, ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]));
\r
766 assert(kStatus_SerialManager_Success == status);
\r
767 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
768 (void)SerialManager_InstallTxCallback(((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]),
\r
769 DbgConsole_SerialManagerTxCallback, &s_debugConsoleState);
\r
773 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
\r
775 status = (status_t)SerialManager_OpenReadHandle(
\r
776 s_debugConsoleState.serialHandle, ((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]));
\r
777 assert(kStatus_SerialManager_Success == status);
\r
778 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
779 (void)SerialManager_InstallRxCallback(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]),
\r
780 DbgConsole_SerialManagerRxCallback, &s_debugConsoleState);
\r
785 g_serialHandle = s_debugConsoleState.serialHandle;
\r
787 return kStatus_Success;
\r
790 /* See fsl_debug_console.h for documentation of this function. */
\r
791 status_t DbgConsole_Deinit(void)
\r
794 if (s_debugConsoleState.serialHandle != NULL)
\r
796 (void)SerialManager_CloseWriteHandle(
\r
797 ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]));
\r
800 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
\r
802 if (s_debugConsoleState.serialHandle != NULL)
\r
804 (void)SerialManager_CloseReadHandle(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]));
\r
808 if (s_debugConsoleState.serialHandle)
\r
810 if (kStatus_SerialManager_Success == SerialManager_Deinit(s_debugConsoleState.serialHandle))
\r
812 s_debugConsoleState.serialHandle = NULL;
\r
813 g_serialHandle = NULL;
\r
816 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
\r
817 DEBUG_CONSOLE_DESTROY_BINARY_SEMAPHORE(s_debugConsoleReadWaitSemaphore);
\r
819 DEBUG_CONSOLE_DESTROY_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);
\r
821 return (status_t)kStatus_Success;
\r
823 #endif /* ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) */
\r
825 #if ((SDK_DEBUGCONSOLE > 0U) || \
\r
826 ((SDK_DEBUGCONSOLE == 0U) && defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && \
\r
827 (defined(DEBUG_CONSOLE_TX_RELIABLE_ENABLE) && (DEBUG_CONSOLE_TX_RELIABLE_ENABLE > 0U))))
\r
828 DEBUG_CONSOLE_FUNCTION_PREFIX status_t DbgConsole_Flush(void)
\r
830 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
832 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_BM) && defined(OSA_USED)
\r
834 if (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail)
\r
836 return (status_t)kStatus_Fail;
\r
841 while (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail)
\r
843 #if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)
\r
844 if (0U == IS_RUNNING_IN_ISR())
\r
846 if (taskSCHEDULER_RUNNING == xTaskGetSchedulerState())
\r
853 return (status_t)kStatus_Fail;
\r
861 return (status_t)kStatus_Success;
\r
865 #if SDK_DEBUGCONSOLE
\r
866 /* See fsl_debug_console.h for documentation of this function. */
\r
867 int DbgConsole_Printf(const char *formatString, ...)
\r
870 int logLength = 0, dbgResult = 0;
\r
871 char printBuf[DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN] = {'\0'};
\r
873 if (NULL == g_serialHandle)
\r
878 va_start(ap, formatString);
\r
879 /* format print log first */
\r
880 logLength = StrFormatPrintf(formatString, ap, printBuf, DbgConsole_PrintCallback);
\r
882 dbgResult = DbgConsole_SendDataReliable((uint8_t *)printBuf, (size_t)logLength);
\r
889 /* See fsl_debug_console.h for documentation of this function. */
\r
890 int DbgConsole_Putchar(int ch)
\r
893 return DbgConsole_SendDataReliable((uint8_t *)&ch, 1U);
\r
896 /* See fsl_debug_console.h for documentation of this function. */
\r
897 int DbgConsole_Scanf(char *formatString, ...)
\r
901 char scanfBuf[DEBUG_CONSOLE_SCANF_MAX_LOG_LEN + 1U] = {'\0'};
\r
904 (void)DbgConsole_ReadLine((uint8_t *)scanfBuf, DEBUG_CONSOLE_SCANF_MAX_LOG_LEN);
\r
906 va_start(ap, formatString);
\r
907 /* format scanf log */
\r
908 formatResult = StrFormatScanf(scanfBuf, formatString, ap);
\r
912 return formatResult;
\r
914 /* See fsl_debug_console.h for documentation of this function. */
\r
915 int DbgConsole_BlockingPrintf(const char *formatString, ...)
\r
918 status_t status = (status_t)kStatus_SerialManager_Error;
\r
919 int logLength = 0, dbgResult = 0;
\r
920 char printBuf[DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN] = {'\0'};
\r
922 if (NULL == g_serialHandle)
\r
927 va_start(ap, formatString);
\r
928 /* format print log first */
\r
929 logLength = StrFormatPrintf(formatString, ap, printBuf, DbgConsole_PrintCallback);
\r
931 #if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)
\r
932 SerialManager_CancelWriting(((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]));
\r
936 (status_t)SerialManager_WriteBlocking(((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]),
\r
937 (uint8_t *)printBuf, (size_t)logLength);
\r
938 dbgResult = (((status_t)kStatus_Success == status) ? (int)logLength : -1);
\r
944 #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
\r
945 status_t DbgConsole_TryGetchar(char *ch)
\r
947 #if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))
\r
948 uint32_t length = 0;
\r
949 status_t status = (status_t)kStatus_Fail;
\r
953 if (NULL == g_serialHandle)
\r
955 return kStatus_Fail;
\r
958 /* take mutex lock function */
\r
959 DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(s_debugConsoleReadSemaphore);
\r
961 if (kStatus_SerialManager_Success ==
\r
962 SerialManager_TryRead(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]), (uint8_t *)ch, 1,
\r
967 #if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION
\r
968 (void)DbgConsole_EchoCharacter((uint8_t *)ch, true, NULL);
\r
970 status = (status_t)kStatus_Success;
\r
973 /* release mutex lock function */
\r
974 DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);
\r
977 return (status_t)kStatus_Fail;
\r
982 /* See fsl_debug_console.h for documentation of this function. */
\r
983 int DbgConsole_Getchar(void)
\r
988 (void)DbgConsole_ReadCharacter(&ch);
\r
993 #endif /* SDK_DEBUGCONSOLE */
\r
995 /*************Code to support toolchain's printf, scanf *******************************/
\r
996 /* These function __write and __read is used to support IAR toolchain to printf and scanf*/
\r
997 #if (defined(__ICCARM__))
\r
998 #if defined(SDK_DEBUGCONSOLE_UART)
\r
999 #pragma weak __write
\r
1000 size_t __write(int handle, const unsigned char *buffer, size_t size)
\r
1005 * This means that we should flush internal buffers. Since we don't we just return.
\r
1006 * (Remember, "handle" == -1 means that all handles should be flushed.)
\r
1011 /* This function only writes to "standard out" and "standard err" for all other file handles it returns failure. */
\r
1012 if ((handle != 1) && (handle != 2))
\r
1014 return ((size_t)-1);
\r
1018 DbgConsole_SendDataReliable((uint8_t *)buffer, size);
\r
1023 #pragma weak __read
\r
1024 size_t __read(int handle, unsigned char *buffer, size_t size)
\r
1027 int actualSize = 0U;
\r
1029 /* This function only reads from "standard in", for all other file handles it returns failure. */
\r
1032 return ((size_t)-1);
\r
1035 /* Receive data.*/
\r
1036 for (; size > 0; size--)
\r
1038 DbgConsole_ReadCharacter(&ch);
\r
1048 return actualSize;
\r
1050 #endif /* SDK_DEBUGCONSOLE_UART */
\r
1052 /* support LPC Xpresso with RedLib */
\r
1053 #elif (defined(__REDLIB__))
\r
1055 #if (defined(SDK_DEBUGCONSOLE_UART))
\r
1056 int __attribute__((weak)) __sys_write(int handle, char *buffer, int size)
\r
1060 /* return -1 if error. */
\r
1064 /* This function only writes to "standard out" and "standard err" for all other file handles it returns failure. */
\r
1065 if ((handle != 1) && (handle != 2))
\r
1071 DbgConsole_SendDataReliable((uint8_t *)buffer, size);
\r
1076 int __attribute__((weak)) __sys_readc(void)
\r
1080 /* Receive data. */
\r
1081 DbgConsole_ReadCharacter((uint8_t *)&tmp);
\r
1087 /* These function fputc and fgetc is used to support KEIL toolchain to printf and scanf*/
\r
1088 #elif defined(__CC_ARM) || defined(__ARMCC_VERSION)
\r
1089 #if defined(SDK_DEBUGCONSOLE_UART)
\r
1090 #if defined(__CC_ARM)
\r
1095 * Whatever you require here. If the only file you are using is standard output using printf() for debugging,
\r
1096 * no file handling is required.
\r
1101 /* FILE is typedef in stdio.h. */
\r
1102 #pragma weak __stdout
\r
1103 #pragma weak __stdin
\r
1107 #pragma weak fputc
\r
1108 int fputc(int ch, FILE *f)
\r
1111 return DbgConsole_SendDataReliable((uint8_t *)(&ch), 1);
\r
1114 #pragma weak fgetc
\r
1115 int fgetc(FILE *f)
\r
1119 /* Receive data. */
\r
1120 DbgConsole_ReadCharacter((uint8_t *)&ch);
\r
1126 * Terminate the program, passing a return code back to the user.
\r
1127 * This function may not return.
\r
1129 void _sys_exit(int returncode)
\r
1137 * Writes a character to the output channel. This function is used
\r
1138 * for last-resort error message output.
\r
1140 void _ttywrch(int ch)
\r
1143 DbgConsole_SendDataReliable((uint8_t *)(&ench), 1);
\r
1146 char *_sys_command_string(char *cmd, int len)
\r
1150 #endif /* SDK_DEBUGCONSOLE_UART */
\r
1152 /* These function __write and __read is used to support ARM_GCC, KDS, Atollic toolchains to printf and scanf*/
\r
1153 #elif (defined(__GNUC__))
\r
1155 #if ((defined(__GNUC__) && (!defined(__MCUXPRESSO)) && (defined(SDK_DEBUGCONSOLE_UART))) || \
\r
1156 (defined(__MCUXPRESSO) && (defined(SDK_DEBUGCONSOLE_UART))))
\r
1157 int __attribute__((weak)) _write(int handle, char *buffer, int size);
\r
1158 int __attribute__((weak)) _write(int handle, char *buffer, int size)
\r
1160 if (buffer == NULL)
\r
1162 /* return -1 if error. */
\r
1166 /* This function only writes to "standard out" and "standard err" for all other file handles it returns failure. */
\r
1167 if ((handle != 1) && (handle != 2))
\r
1173 (void)DbgConsole_SendDataReliable((uint8_t *)buffer, (size_t)size);
\r
1178 int __attribute__((weak)) _read(int handle, char *buffer, int size);
\r
1179 int __attribute__((weak)) _read(int handle, char *buffer, int size)
\r
1182 int actualSize = 0;
\r
1184 /* This function only reads from "standard in", for all other file handles it returns failure. */
\r
1190 /* Receive data. */
\r
1191 for (; size > 0; size--)
\r
1193 if (DbgConsole_ReadCharacter(&ch) < 0)
\r
1198 *buffer++ = (char)ch;
\r
1201 if ((ch == 0U) || (ch == (uint8_t)'\n') || (ch == (uint8_t)'\r'))
\r
1207 return (actualSize > 0) ? actualSize : -1;
\r
1211 #endif /* __ICCARM__ */
\r