diff --git a/McuLib/config/McuShellUartconfig.h b/McuLib/config/McuShellUartconfig.h index 7fd89c0..5ce56f4 100644 --- a/McuLib/config/McuShellUartconfig.h +++ b/McuLib/config/McuShellUartconfig.h @@ -15,9 +15,9 @@ #define McuShellUart_CONFIG_UART_K22FX512_UART0_A1_A2 (2) /* Rx on PTA1 (pin 27), Tx on PTA2 (pin 28) */ #define McuShellUart_CONFIG_UART_K22FX512_UART1_E1_E0 (3) /* Rx on PTE1 (pin 2), Tx on PTE2 (pin 1) */ /* Kinetis K22FN */ -#define McuShellUart_CONFIG_UART_K22FN512_LPUART0_C3_C4 (4) /* PTC3: Rx, (pin 46), PTC4: Tx (pin 49) */ +#define McuShellUart_CONFIG_UART_K22FN512_LPUART0_C3_C4 (4) /* PTC3: Rx, (pin 46), PTC4: Tx (pin 49) (OpenSDA UART on tinyK22) */ #define McuShellUart_CONFIG_UART_K22FN512_UART0_B16_B17 (5) /* PTB16 (Rx), PTB17 (Tx) */ -#define McuShellUart_CONFIG_UART_K22FN512_UART1_E1_E0 (6) /* PTE1 (Rx), PTE0 (Tx) */ +#define McuShellUart_CONFIG_UART_K22FN512_UART1_E1_E0 (6) /* PTE1 (Rx), PTE0 (Tx) (OpenSDA UART on FRDM-K22F) */ /* LPC55S16 */ #define McuShellUart_CONFIG_UART_LPC55S16_USART0 (7) /* FlexComm0, pin 92 (Rx) and pin 94 (Tx) */ #define McuShellUart_CONFIG_UART_LPC55S16_USART2 (8) /* FlexComm2, pin 3 (Rx) and pin 27 (Tx) */ @@ -55,6 +55,8 @@ #endif #define McuShellUart_CONFIG_UART_IRQ_HANDLER USART0_IRQHandler #define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS USART_ClearStatusFlags + #define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (0) /* no extra flags to clear */ + #define McuShellUart_CONFIG_HAS_FIFO (0) #elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_LPC55S16_USART0 #include "fsl_usart.h" #include "fsl_iocon.h" @@ -75,6 +77,8 @@ #endif #define McuShellUart_CONFIG_UART_IRQ_HANDLER FLEXCOMM0_IRQHandler #define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS USART_ClearStatusFlags + #define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (0) /* no extra flags to clear */ + #define McuShellUart_CONFIG_HAS_FIFO (0) /* not sure? */ #elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_LPC55S16_USART2 #include "fsl_usart.h" #include "fsl_iocon.h" @@ -96,6 +100,8 @@ #endif #define McuShellUart_CONFIG_UART_IRQ_HANDLER FLEXCOMM2_IRQHandler #define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS USART_ClearStatusFlags + #define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (0) /* no extra flags to clear */ + #define McuShellUart_CONFIG_HAS_FIFO (0) /* not sure? */ #elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FX512_UART0_A1_A2 /* UART0 on K22FX512 */ #include "fsl_uart.h" @@ -117,6 +123,8 @@ #endif #define McuShellUart_CONFIG_UART_IRQ_HANDLER UART0_RX_TX_IRQHandler #define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS UART_ClearStatusFlags + #define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (kUART_RxOverrunFlag|kUART_RxFifoOverflowFlag) + #define McuShellUart_CONFIG_HAS_FIFO (1) #elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FN512_UART0_B16_B17 #include "fsl_uart.h" #include "fsl_port.h" @@ -137,6 +145,8 @@ #endif #define McuShellUart_CONFIG_UART_IRQ_HANDLER UART0_RX_TX_IRQHandler #define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS UART_ClearStatusFlags + #define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (kUART_RxOverrunFlag|kUART_RxFifoOverflowFlag) + #define McuShellUart_CONFIG_HAS_FIFO (1) #elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FN512_UART1_E1_E0 /* UART1 on K22FN512. Mux the pins using the pins muxing tool */ #include "fsl_uart.h" @@ -158,6 +168,8 @@ #endif #define McuShellUart_CONFIG_UART_IRQ_HANDLER UART1_RX_TX_IRQHandler #define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS UART_ClearStatusFlags + #define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (kUART_RxOverrunFlag|kUART_RxFifoOverflowFlag) + #define McuShellUart_CONFIG_HAS_FIFO (1) #elif McuShellUart_CONFIG_UART==McuShellUart_CONFIG_UART_K22FN512_LPUART0_C3_C4 /* LPUART on K22FN512 */ #include "fsl_lpuart.h" @@ -185,8 +197,10 @@ #endif #define McuShellUart_CONFIG_UART_IRQ_HANDLER LPUART0_IRQHandler #define McuShellUART_CONFIG_CLEAR_STATUS_FLAGS LPUART_ClearStatusFlags + #define McuShellUART_CONFIG_CLEAR_EXTRA_STATUS_FLAGS (0) /* no extra flags to clear */ + #define McuShellUart_CONFIG_HAS_FIFO (0) #else - /* you have to put your config here */ + /* you have to put your configuration here */ #endif #ifndef McuShellUart_CONFIG_UART_RX_QUEUE_LENGTH @@ -197,4 +211,9 @@ #define McuShellUart_CONFIG_UART_BAUDRATE 115200 #endif +#ifndef McuShellUart_CONFIG_USE_FREERTOS + #define McuShellUart_CONFIG_USE_FREERTOS (McuLib_CONFIG_SDK_USE_FREERTOS) + /*!< If FreeRTOS (Queues) shall be used or not */ +#endif + #endif /* MCUSHELLUARTCONFIG_H_ */ diff --git a/McuLib/src/McuShellUart.c b/McuLib/src/McuShellUart.c index fe4df79..593728f 100644 --- a/McuLib/src/McuShellUart.c +++ b/McuLib/src/McuShellUart.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Erich Styger + * Copyright (c) 2020-2022, Erich Styger * * SPDX-License-Identifier: BSD-3-Clause */ @@ -8,13 +8,13 @@ #if McuShellUart_CONFIG_UART!=McuShellUart_CONFIG_UART_NONE #include "McuShellUart.h" #include "McuShell.h" -#if McuLib_CONFIG_SDK_USE_FREERTOS +#if McuShellUart_CONFIG_USE_FREERTOS #include "McuRTOS.h" #else #include "McuRB.h" #endif -#if McuLib_CONFIG_SDK_USE_FREERTOS +#if McuShellUart_CONFIG_USE_FREERTOS static QueueHandle_t uartRxQueue; #else static McuRB_Handle_t rxRingBuffer; @@ -30,7 +30,7 @@ static void McuShellUart_SendChar(unsigned char ch) { static void McuShellUart_ReadChar(uint8_t *c) { uint8_t ch; -#if McuLib_CONFIG_SDK_USE_FREERTOS +#if McuShellUart_CONFIG_USE_FREERTOS if (xQueueReceive(uartRxQueue, &ch, 0)==pdPASS ) { *c = ch; /* return received character */ } else { @@ -46,7 +46,7 @@ static void McuShellUart_ReadChar(uint8_t *c) { } static bool McuShellUart_CharPresent(void) { -#if McuLib_CONFIG_SDK_USE_FREERTOS +#if McuShellUart_CONFIG_USE_FREERTOS return uxQueueMessagesWaiting(uartRxQueue)!=0; #else return McuRB_NofElements(rxRingBuffer)!=0; @@ -61,31 +61,47 @@ McuShell_ConstStdIOType McuShellUart_stdio = { #if McuShell_CONFIG_ECHO_ENABLED .echoEnabled = false, #endif - }; +}; uint8_t McuShellUart_DefaultShellBuffer[McuShell_DEFAULT_SHELL_BUFFER_SIZE]; /* default buffer which can be used by the application */ /*********************************************************************************************************/ void McuShellUart_CONFIG_UART_IRQ_HANDLER(void) { uint8_t data; uint32_t flags; -#if McuLib_CONFIG_SDK_USE_FREERTOS - BaseType_t xHigherPriorityTaskWoken; +#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) { - data = McuShellUart_CONFIG_UART_READ_BYTE(McuShellUart_CONFIG_UART_DEVICE); -#if McuLib_CONFIG_SDK_USE_FREERTOS - (void)xQueueSendFromISR(uartRxQueue, &data, &xHigherPriorityTaskWoken); - if (xHigherPriorityTaskWoken != pdFALSE) { - vPortYieldFromISR(); + #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--; } -#else - McuRB_Put(rxRingBuffer, &data); -#endif } - McuShellUART_CONFIG_CLEAR_STATUS_FLAGS(McuShellUart_CONFIG_UART_DEVICE, flags); + 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 @@ -393,14 +409,14 @@ static void InitUart(void) { for(;;) {/* error */} } McuShellUart_CONFIG_UART_ENABLE_INTERRUPTS(McuShellUart_CONFIG_UART_DEVICE, McuShellUart_CONFIG_UART_ENABLE_INTERRUPT_FLAGS); -#if McuLib_CONFIG_SDK_USE_FREERTOS +#if McuShellUart_CONFIG_USE_FREERTOS NVIC_SetPriority(McuShellUart_CONFIG_UART_IRQ_NUMBER, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY); #endif EnableIRQ(McuShellUart_CONFIG_UART_IRQ_NUMBER); } void McuShellUart_Deinit(void) { -#if McuLib_CONFIG_SDK_USE_FREERTOS +#if McuShellUart_CONFIG_USE_FREERTOS vQueueDelete(uartRxQueue); uartRxQueue = NULL; #else @@ -410,7 +426,7 @@ void McuShellUart_Deinit(void) { } void McuShellUart_Init(void) { -#if McuLib_CONFIG_SDK_USE_FREERTOS +#if McuShellUart_CONFIG_USE_FREERTOS uartRxQueue = xQueueCreate(McuShellUart_CONFIG_UART_RX_QUEUE_LENGTH, sizeof(uint8_t)); if (uartRxQueue==NULL) { for(;;){} /* out of memory? */