/*! * Copyright (c) 2020-2024, Erich Styger * * SPDX-License-Identifier: BSD-3-Clause * \file * \brief \brief Implementation of the McuShellUart module. */ #include "McuShellUartconfig.h" #if McuShellUart_CONFIG_UART!=McuShellUart_CONFIG_UART_NONE #include "McuShellUart.h" #include "McuShell.h" #if McuShellUart_CONFIG_USE_FREERTOS #include "McuRTOS.h" #else #include "McuRB.h" #endif #if McuLib_CONFIG_CPU_IS_RPxxxx #include "hardware/uart.h" #include "hardware/irq.h" #include "hardware/gpio.h" #endif #include "McuLog.h" #if McuShellUart_CONFIG_USE_FREERTOS static QueueHandle_t uartRxQueue; #else static McuRB_Handle_t rxRingBuffer; #endif /*********************************************************************************************************/ /* Shell interface */ /*********************************************************************************************************/ static void McuShellUart_SendChar(unsigned char ch) { McuShellUart_CONFIG_UART_WRITE_BLOCKING(McuShellUart_CONFIG_UART_DEVICE, &ch, 1); } static void McuShellUart_ReadChar(uint8_t *c) { uint8_t ch; #if McuShellUart_CONFIG_USE_FREERTOS if (xQueueReceive(uartRxQueue, &ch, 0)==pdPASS ) { *c = ch; /* return received character */ } else { *c = '\0'; /* nothing received */ } #else if (McuRB_Get(rxRingBuffer, &ch)!=ERR_OK) { *c = '\0'; /* nothing received */ } else { *c = ch; /* return received character */ } #endif } static bool McuShellUart_CharPresent(void) { #if McuShellUart_CONFIG_USE_FREERTOS return uxQueueMessagesWaiting(uartRxQueue)!=0; #else return McuRB_NofElements(rxRingBuffer)!=0; #endif } McuShell_ConstStdIOType McuShellUart_stdio = { .stdIn = (McuShell_StdIO_In_FctType)McuShellUart_ReadChar, .stdOut = (McuShell_StdIO_OutErr_FctType)McuShellUart_SendChar, .stdErr = (McuShell_StdIO_OutErr_FctType)McuShellUart_SendChar, .keyPressed = McuShellUart_CharPresent, /* if input is not empty */ #if McuShell_CONFIG_ECHO_ENABLED .echoEnabled = false, #endif }; McuShell_ConstStdIOTypePtr McuShellUart_GetStdio(void) { return &McuShellUart_stdio; } uint8_t McuShellUart_DefaultShellBuffer[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; /* default buffer which can be used by the application */ /*********************************************************************************************************/ #if McuLib_CONFIG_CPU_IS_RPxxxx /* nothing needed */ #else void McuShellUart_CONFIG_UART_IRQ_HANDLER(void) { uint8_t data; uint32_t flags; #if McuShellUart_CONFIG_USE_FREERTOS BaseType_t xHigherPriorityTaskWoken = pdFALSE; #endif uint8_t count; flags = McuShellUart_CONFIG_UART_GET_FLAGS(McuShellUart_CONFIG_UART_DEVICE); #if McuShellUart_CONFIG_HAS_FIFO if (flags&kUART_RxFifoOverflowFlag) { count = 0; /* statement to allow debugger to set a breakpoint here */ } #endif /* If new data arrived. */ if (flags&McuShellUart_CONFIG_UART_HW_RX_READY_FLAGS) { #if McuShellUart_CONFIG_HAS_FIFO count = McuShellUart_CONFIG_UART_DEVICE->RCFIFO; #else count = 1; #endif while(count!=0) { data = McuShellUart_CONFIG_UART_READ_BYTE(McuShellUart_CONFIG_UART_DEVICE); #if McuShellUart_CONFIG_USE_FREERTOS (void)xQueueSendFromISR(uartRxQueue, &data, &xHigherPriorityTaskWoken); #else McuRB_Put(rxRingBuffer, &data); #endif count--; } } McuShellUART_CONFIG_CLEAR_STATUS_FLAGS(McuShellUart_CONFIG_UART_DEVICE, flags|McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS); #if McuShellUart_CONFIG_USE_FREERTOS if (xHigherPriorityTaskWoken != pdFALSE) { vPortYieldFromISR(); } #endif #if McuLib_CONFIG_CPU_IS_ARM_CORTEX_M && ((McuLib_CONFIG_CORTEX_M==4) || (McuLib_CONFIG_CORTEX_M==7)) /* ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping exception return operation might vector to incorrect interrupt. * For Cortex-M7, if core speed much faster than peripheral register write speed, the peripheral interrupt flags may be still set after exiting ISR, this results to * the same error similar with errata 83869. */ __DSB(); #endif } #endif void McuShellUart_MuxUartPins(int uart) { switch(uart) { #if McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K22FN case McuShellUart_CONFIG_UART_K22FN512_LPUART0_C3_C4: /* PTC3, PTC4 */ CLOCK_EnableClock(kCLOCK_PortC); /* PORTC3 (pin 46) is configured as LPUART0_RX */ PORT_SetPinMux(PORTC, 3U, kPORT_MuxAlt7); PORTC->PCR[3] = ((PORTC->PCR[3] & /* Mask bits to zero which are setting */ (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the * corresponding PE field is set. */ | (uint32_t)(kPORT_PullUp)); /* PORTC4 (pin 49) is configured as LPUART0_TX */ PORT_SetPinMux(PORTC, 4U, kPORT_MuxAlt7); PORTC->PCR[4] = ((PORTC->PCR[4] & /* Mask bits to zero which are setting */ (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the * corresponding PE field is set. */ | (uint32_t)(kPORT_PullUp)); break; case McuShellUart_CONFIG_UART_K22FN512_UART0_B16_B17: /* PTB16, PTB17 */ CLOCK_EnableClock(kCLOCK_PortB); /* PORTB16 (pin 39) is configured as UART0_RX */ PORT_SetPinMux(PORTB, 16, kPORT_MuxAlt3); PORTB->PCR[16] = ((PORTB->PCR[16] & /* Mask bits to zero which are setting */ (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the * corresponding PE field is set. */ | (uint32_t)(kPORT_PullUp)); /* PORTB17 (pin 40) is configured as UART0_TX */ PORT_SetPinMux(PORTB, 17, kPORT_MuxAlt3); PORTB->PCR[17] = ((PORTB->PCR[17] & /* Mask bits to zero which are setting */ (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the * corresponding PE field is set. */ | (uint32_t)(kPORT_PullUp)); #define SOPT5_UART0TXSRC_UART_TX 0x00u /*!<@brief UART 0 transmit data source select: UART0_TX pin */ SIM->SOPT5 = ((SIM->SOPT5 & /* Mask bits to zero which are setting */ (~(SIM_SOPT5_UART0TXSRC_MASK))) /* UART 0 transmit data source select: UART0_TX pin. */ | SIM_SOPT5_UART0TXSRC(SOPT5_UART0TXSRC_UART_TX)); break; case McuShellUart_CONFIG_UART_K22FN512_UART1_E1_E0: CLOCK_EnableClock(kCLOCK_PortE); /* PORTE0 (pin 1) is configured as UART1_TX */ PORT_SetPinMux(PORTE, 0U, kPORT_MuxAlt3); PORTE->PCR[0] = ((PORTE->PCR[0] & /* Mask bits to zero which are setting */ (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the * corresponding PE field is set. */ | (uint32_t)(kPORT_PullUp)); /* PORTE1 (pin 2) is configured as UART1_RX */ PORT_SetPinMux(PORTE, 1U, kPORT_MuxAlt3); PORTE->PCR[1] = ((PORTE->PCR[1] & /* Mask bits to zero which are setting */ (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the * corresponding PE field is set. */ | (uint32_t)(kPORT_PullUp)); #define SOPT5_UART1TXSRC_UART_TX 0x00u /*!<@brief UART 1 transmit data source select: UART1_TX pin */ SIM->SOPT5 = ((SIM->SOPT5 & /* Mask bits to zero which are setting */ (~(SIM_SOPT5_UART0TXSRC_MASK | SIM_SOPT5_UART1TXSRC_MASK))) /* UART 1 transmit data source select: UART1_TX pin. */ | SIM_SOPT5_UART1TXSRC(SOPT5_UART1TXSRC_UART_TX)); break; #elif McuLib_CONFIG_CPU_VARIANT==McuLib_CONFIG_CPU_VARIANT_NXP_K22FX #define SOPT5_UART0TXSRC_UART_TX 0x00u /*!<@brief UART 0 transmit data source select: UART0_TX pin */ #define SOPT5_UART1TXSRC_UART_TX 0x00u /*!<@brief UART 1 transmit data source select: UART1_TX pin */ case McuShellUart_CONFIG_UART_K22FX512_UART0_A1_A2: /* PORTA1 (pin 27) is configured as UART0_RX */ PORT_SetPinMux(PORTA, 1U, kPORT_MuxAlt2); /* PORTA2 (pin 28) is configured as UART0_TX */ PORT_SetPinMux(PORTA, 2U, kPORT_MuxAlt2); SIM->SOPT5 = ((SIM->SOPT5 & /* Mask bits to zero which are setting */ (~(SIM_SOPT5_UART0TXSRC_MASK | SIM_SOPT5_UART1TXSRC_MASK))) /* UART 0 transmit data source select: UART0_TX pin. */ | SIM_SOPT5_UART0TXSRC(SOPT5_UART0TXSRC_UART_TX)); break; case McuShellUart_CONFIG_UART_K22FX512_UART1_E1_E0: CLOCK_EnableClock(kCLOCK_PortE); /* PORTE0 (pin 1) is configured as UART1_TX */ PORT_SetPinMux(PORTE, 0U, kPORT_MuxAlt3); PORTE->PCR[0] = ((PORTE->PCR[0] & /* Mask bits to zero which are setting */ (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the * corresponding Port Pull Enable field is set. */ | (uint32_t)(kPORT_PullUp)); /* PORTE1 (pin 2) is configured as UART1_RX */ PORT_SetPinMux(PORTE, 1U, kPORT_MuxAlt3); PORTE->PCR[1] = ((PORTE->PCR[1] & /* Mask bits to zero which are setting */ (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the * corresponding Port Pull Enable field is set. */ | (uint32_t)(kPORT_PullUp)); SIM->SOPT5 = ((SIM->SOPT5 & /* Mask bits to zero which are setting */ (~(SIM_SOPT5_UART0TXSRC_MASK | SIM_SOPT5_UART1TXSRC_MASK))) /* UART 1 transmit data source select: UART1_TX pin. */ | SIM_SOPT5_UART1TXSRC(SOPT5_UART1TXSRC_UART_TX)); break; #elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K64FN1M_UART0_B16_B17 case McuShellUart_CONFIG_UART_K64FN1M_UART0_B16_B17: /* UART0 Rx and Tx */ /* PORTB16 (pin 62) is configured as UART0_RX */ PORT_SetPinMux(PORTB, 16U, kPORT_MuxAlt3); #define SOPT5_UART0TXSRC_UART_TX 0x00u /*!<@brief UART 0 transmit data source select: UART0_TX pin */ /* PORTB17 (pin 63) is configured as UART0_TX */ PORT_SetPinMux(PORTB, 1U, kPORT_MuxAlt3); SIM->SOPT5 = ((SIM->SOPT5 & /* Mask bits to zero which are setting */ (~(SIM_SOPT5_UART0TXSRC_MASK))) /* UART 0 transmit data source select: UART0_TX pin. */ | SIM_SOPT5_UART0TXSRC(SOPT5_UART0TXSRC_UART_TX)); break; #elif McuLib_CONFIG_CPU_IS_RPxxxx case McuShellUart_CONFIG_UART_RP2040_UART1_GPIO4_GPIO5: gpio_set_function(McuShellUart_CONFIG_UART_TX_PIN, GPIO_FUNC_UART); gpio_set_function(McuShellUart_CONFIG_UART_RX_PIN, GPIO_FUNC_UART); break; #endif /* McuLib_CONFIG_CPU_VARIANT_NXP_K22FN */ default: for(;;) { /* error */ } } /* switch */ } #if McuShellUart_CONFIG_DO_PIN_MUXING static void InitUartMuxing(void) { #if McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_LPC845_USART0 /* Enables clock for switch matrix.: enable */ CLOCK_EnableClock(kCLOCK_Swm); /* USART0_TXD connect to P0_25 */ SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_25); /* USART0_RXD connect to P0_24 */ SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_24); /* Disable clock for switch matrix. */ CLOCK_DisableClock(kCLOCK_Swm); #elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FX512_UART0 #define SOPT5_UART0TXSRC_UART_TX 0x00u /*!<@brief UART 0 transmit data source select: UART0_TX pin */ #define SOPT5_UART1TXSRC_UART_TX 0x00u /*!<@brief UART 1 transmit data source select: UART1_TX pin */ /* PORTA1 (pin 27) is configured as UART0_RX */ PORT_SetPinMux(PORTA, 1U, kPORT_MuxAlt2); /* PORTA2 (pin 28) is configured as UART0_TX */ PORT_SetPinMux(PORTA, 2U, kPORT_MuxAlt2); /* PORTE0 (pin 1) is configured as UART1_TX */ PORT_SetPinMux(PORTE, 0U, kPORT_MuxAlt3); PORTE->PCR[0] = ((PORTE->PCR[0] & /* Mask bits to zero which are setting */ (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the * corresponding Port Pull Enable field is set. */ | (uint32_t)(kPORT_PullUp)); /* PORTE1 (pin 2) is configured as UART1_RX */ PORT_SetPinMux(PORTE, 1U, kPORT_MuxAlt3); PORTE->PCR[1] = ((PORTE->PCR[1] & /* Mask bits to zero which are setting */ (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_ISF_MASK))) /* Pull Select: Internal pullup resistor is enabled on the corresponding pin, if the * corresponding Port Pull Enable field is set. */ | (uint32_t)(kPORT_PullUp)); SIM->SOPT5 = ((SIM->SOPT5 & /* Mask bits to zero which are setting */ (~(SIM_SOPT5_UART0TXSRC_MASK | SIM_SOPT5_UART1TXSRC_MASK))) /* UART 0 transmit data source select: UART0_TX pin. */ | SIM_SOPT5_UART0TXSRC(SOPT5_UART0TXSRC_UART_TX) /* UART 1 transmit data source select: UART1_TX pin. */ | SIM_SOPT5_UART1TXSRC(SOPT5_UART1TXSRC_UART_TX)); #elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FN512_LPUART0_C3_C4 McuShellUart_MuxUartPins(McuShellUart_CONFIG_UART_K22FN512_LPUART0_C3_C4); #elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FN512_UART0_B16_B17 McuShellUart_MuxUartPins(McuShellUart_CONFIG_UART_K22FN512_UART0_B16_B17); #elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FN512_UART1_E1_E0 McuShellUart_MuxUartPins(McuShellUart_CONFIG_UART_K22FN512_UART1_E1_E0); #elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K64FN1M_UART0_B16_B17 McuShellUart_MuxUartPins(McuShellUart_CONFIG_UART_K64FN1M_UART0_B16_B17); #elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_LPC55S16_USART0 #define IOCON_PIO_FUNC1 0x01u #define IOCON_PIO_INV_DI 0x00u #define IOCON_PIO_MODE_INACT 0x00u #define IOCON_PIO_SLEW_STANDARD 0x00u #define IOCON_PIO_OPENDRAIN_DI 0x00u #define IOCON_PIO_DIGITAL_EN 0x0100u #define PIO0_3_FUNC_ALT1 0x01u #define PIO0_3_DIGIMODE_DIGITAL 0x01u const uint32_t port0_pin29_config = (/* Pin is configured as FC0_RXD_SDA_MOSI_DATA */ IOCON_PIO_FUNC1 | /* No addition pin function */ IOCON_PIO_MODE_INACT | /* Standard mode, output slew rate control is enabled */ IOCON_PIO_SLEW_STANDARD | /* Input function is not inverted */ IOCON_PIO_INV_DI | /* Enables digital function */ IOCON_PIO_DIGITAL_EN | /* Open drain is disabled */ IOCON_PIO_OPENDRAIN_DI); /* PORT0 PIN29 (coords: 92) is configured as FC0_RXD_SDA_MOSI_DATA */ IOCON_PinMuxSet(IOCON, 0U, 29U, port0_pin29_config); IOCON->PIO[0][3] = ((IOCON->PIO[0][3] & /* Mask bits to zero which are setting */ (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) /* Selects pin function. * : PORT03 (pin 83) is configured as FC3_RXD_SDA_MOSI_DATA. */ | IOCON_PIO_FUNC(PIO0_3_FUNC_ALT1) /* Select Digital mode. * : Enable Digital mode. * Digital input is enabled. */ | IOCON_PIO_DIGIMODE(PIO0_3_DIGIMODE_DIGITAL)); const uint32_t port0_pin30_config = (/* Pin is configured as FC0_TXD_SCL_MISO_WS */ IOCON_PIO_FUNC1 | /* No addition pin function */ IOCON_PIO_MODE_INACT | /* Standard mode, output slew rate control is enabled */ IOCON_PIO_SLEW_STANDARD | /* Input function is not inverted */ IOCON_PIO_INV_DI | /* Enables digital function */ IOCON_PIO_DIGITAL_EN | /* Open drain is disabled */ IOCON_PIO_OPENDRAIN_DI); /* PORT0 PIN30 (coords: 94) is configured as FC0_TXD_SCL_MISO_WS */ IOCON_PinMuxSet(IOCON, 0U, 30U, port0_pin30_config); #elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_LPC55S16_USART2 #define PIO0_27_FUNC_ALT1 0x01u #define PIO1_24_FUNC_ALT1 0x01u #define PIO0_27_DIGIMODE_DIGITAL 0x01u #define PIO1_24_DIGIMODE_DIGITAL 0x01u IOCON->PIO[0][27] = ((IOCON->PIO[0][27] & /* Mask bits to zero which are setting */ (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) /* Selects pin function. * : PORT027 (pin 27) is configured as FC2_TXD_SCL_MISO_WS. */ | IOCON_PIO_FUNC(PIO0_27_FUNC_ALT1) /* Select Digital mode. * : Enable Digital mode. * Digital input is enabled. */ | IOCON_PIO_DIGIMODE(PIO0_27_DIGIMODE_DIGITAL)); IOCON->PIO[1][24] = ((IOCON->PIO[1][24] & /* Mask bits to zero which are setting */ (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) /* Selects pin function. * : PORT124 (pin 3) is configured as FC2_RXD_SDA_MOSI_DATA. */ | IOCON_PIO_FUNC(PIO1_24_FUNC_ALT1) /* Select Digital mode. * : Enable Digital mode. * Digital input is enabled. */ | IOCON_PIO_DIGIMODE(PIO1_24_DIGIMODE_DIGITAL)); #endif } #endif /* McuShellUart_CONFIG_DO_PIN_MUXING */ static void InitUart(void) { #if McuLib_CONFIG_CPU_IS_RPxxxx /* nothing needed */ #else McuShellUart_CONFIG_UART_CONFIG_STRUCT config; status_t status; #if McuShellUart_CONFIG_DO_PIN_MUXING InitUartMuxing(); /* NOTE: Clocking of the UART needs still to be done in the clocks tool for the MCUXpresso SDK! */ #endif McuShellUart_CONFIG_UART_SET_UART_CLOCK(); McuShellUart_CONFIG_UART_GET_DEFAULT_CONFIG(&config); config.baudRate_Bps = McuShellUart_CONFIG_UART_BAUDRATE; config.enableRx = true; config.enableTx = true; /* Initialize the USART with configuration. */ status = McuShellUart_CONFIG_UART_INIT(McuShellUart_CONFIG_UART_DEVICE, &config, CLOCK_GetFreq(McuShellUart_CONFIG_UART_GET_CLOCK_FREQ_SELECT)); if (status!=kStatus_Success) { McuLog_error("failed initializing UART"); for(;;) {/* error */} } McuShellUart_CONFIG_UART_ENABLE_INTERRUPTS(McuShellUart_CONFIG_UART_DEVICE, McuShellUart_CONFIG_UART_ENABLE_INTERRUPT_FLAGS); #if McuShellUart_CONFIG_USE_FREERTOS NVIC_SetPriority(McuShellUart_CONFIG_UART_IRQ_NUMBER, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY); #endif EnableIRQ(McuShellUart_CONFIG_UART_IRQ_NUMBER); #endif } int McuShellUart_PollChar(void) { uint8_t ch = McuShellUart_CONFIG_UART_READ_BYTE(McuShellUart_CONFIG_UART_DEVICE); return ch; } void McuShellUart_Deinit(void) { #if McuShellUart_CONFIG_USE_FREERTOS vQueueDelete(uartRxQueue); uartRxQueue = NULL; #else McuRB_DeinitRB(rxRingBuffer); rxRingBuffer = NULL; #endif } void McuShellUart_Init(void) { #if McuShellUart_CONFIG_USE_FREERTOS uartRxQueue = xQueueCreate(McuShellUart_CONFIG_UART_RX_QUEUE_LENGTH, sizeof(uint8_t)); if (uartRxQueue==NULL) { for(;;){} /* out of memory? */ } vQueueAddToRegistry(uartRxQueue, "UartRxQueue"); #else McuRB_Config_t config; McuRB_GetDefaultconfig(&config); config.elementSize = sizeof(uint8_t); config.nofElements = McuShellUart_CONFIG_UART_RX_QUEUE_LENGTH; rxRingBuffer = McuRB_InitRB(&config); if (rxRingBuffer==NULL) { for(;;) {/* error */} } #endif InitUart(); } #endif /* McuShellUart_CONFIG_UART!=McuShellUart_CONFIG_UART_NONE*/