diff --git a/os/arch/arm/src/amebad/amebad_serial.c b/os/arch/arm/src/amebad/amebad_serial.c index 47cf1ed699..f546977b7a 100644 --- a/os/arch/arm/src/amebad/amebad_serial.c +++ b/os/arch/arm/src/amebad/amebad_serial.c @@ -481,7 +481,7 @@ void rtl8721d_uart_irq(uint32_t id, SerialIrq event) } if (event == TxIrq) { priv->tx_level = TX_FIFO_MAX; - uart_xmitchars(dev); + (void)uart_xmitchars(dev); priv->tx_level = 0; } } diff --git a/os/arch/arm/src/amebalite/amebalite_serial.c b/os/arch/arm/src/amebalite/amebalite_serial.c index 1ff79cf910..c40af0e6e2 100644 --- a/os/arch/arm/src/amebalite/amebalite_serial.c +++ b/os/arch/arm/src/amebalite/amebalite_serial.c @@ -748,7 +748,7 @@ static void rtl8720e_log_up_txint(struct uart_dev_s *dev, bool enable) priv->txint_enable = enable; if (enable) - uart_xmitchars(dev); + (void)uart_xmitchars(dev); //LOGUART_RxCmd(LOGUART_DEV, ENABLE); //else //LOGUART_RxCmd(LOGUART_DEV, DISABLE); @@ -891,7 +891,7 @@ void rtl8720e_uart_irq(uint32_t id, SerialIrq event) } if (event == TxIrq) { priv->tx_level = TX_FIFO_MAX; - uart_xmitchars(dev); + (void)uart_xmitchars(dev); priv->tx_level = 0; } } diff --git a/os/arch/arm/src/amebasmart/amebasmart_serial.c b/os/arch/arm/src/amebasmart/amebasmart_serial.c index 33b0b0b81e..9e4106d2c2 100644 --- a/os/arch/arm/src/amebasmart/amebasmart_serial.c +++ b/os/arch/arm/src/amebasmart/amebasmart_serial.c @@ -512,6 +512,9 @@ static uart_dev_t g_uart4port = { }; #endif +#ifdef CONFIG_UART4_SERIAL_CONSOLE +static bool g_log_flush_running; +#endif /**************************************************************************** * Private Functions ****************************************************************************/ @@ -573,7 +576,7 @@ static int rtl8730e_log_uart_irq(void *Data) u32 txempty_en = LOGUART_GET_ETPFEI(IrqEn); if ((txempty_en == 0x4 && (reg_lsr & LOGUART_BIT_TP4F_EMPTY)) || (reg_lsr & LOGUART_BIT_TP4F_NOT_FULL)) { - uart_xmitchars(&CONSOLE_DEV); + (void)uart_xmitchars(&CONSOLE_DEV); } return 0; } @@ -921,7 +924,7 @@ void rtl8730e_uart_irq(uint32_t id, SerialIrq event) } if (event == TxIrq) { priv->tx_level = TX_FIFO_MAX; - uart_xmitchars(dev); + (void)uart_xmitchars(dev); priv->tx_level = 0; } } @@ -1377,6 +1380,44 @@ int up_getc(void) return ch; } +/**************************************************************************** + * Name: up_flush_console + * + * Description: + * This function is used to ensure that all characters in the UART buffer + * are transmitted. + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ +void up_flush_console(void) +{ +#ifdef CONFIG_UART4_SERIAL_CONSOLE + uint16_t nbyte; + irqstate_t flags = enter_critical_section(); + + /* To avoid duplicated calling up_flush_console(). */ + if (g_log_flush_running) { + leave_critical_section(flags); + return; + } + g_log_flush_running = true; + + do { + while (!LOGUART_Ready()); + nbyte = uart_xmitchars(&CONSOLE_DEV); + } while (nbyte); + + g_log_flush_running = false; + + leave_critical_section(flags); +#endif +} + #else /* USE_SERIALDRIVER */ /**************************************************************************** * Name: up_putc diff --git a/os/arch/arm/src/armv7-a/arm_assert.c b/os/arch/arm/src/armv7-a/arm_assert.c index f41582599c..0247bdcb56 100644 --- a/os/arch/arm/src/armv7-a/arm_assert.c +++ b/os/arch/arm/src/armv7-a/arm_assert.c @@ -549,6 +549,21 @@ static inline void print_assert_detail(const uint8_t *filename, int lineno, stru } +/**************************************************************************** + * Name: flush_console + ****************************************************************************/ + +static inline void flush_console(void) +{ + if (!IS_SECURE_STATE()) { + lldbg_noarg("\n===========================================================\n"); + lldbg_noarg("Flush console log\n"); + lldbg_noarg("===========================================================\n\n"); + up_flush_console(); + lldbg_noarg("\n"); + } +} + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -612,6 +627,8 @@ void up_assert(const uint8_t *filename, int lineno) /* Heap corruption check */ check_heap_corrupt(fault_tcb); + flush_console(); + /* Closing log line */ lldbg_noarg("##########################################################################################################################################\n"); diff --git a/os/arch/arm/src/imx6/imx_serial.c b/os/arch/arm/src/imx6/imx_serial.c index 3812dd2561..4715092fae 100644 --- a/os/arch/arm/src/imx6/imx_serial.c +++ b/os/arch/arm/src/imx6/imx_serial.c @@ -687,7 +687,7 @@ static int imx_interrupt(int irq, void *context, void *arg) if (usr1 & UART_USR1_TRDY && (imx_serialin(priv, UART_UCR1_OFFSET) & UART_UCR1_TXEMPTYEN) != 0) { - uart_xmitchars(dev); + (void)uart_xmitchars(dev); } /* Keep track of how many times we do this in case there diff --git a/os/arch/arm/src/s5j/s5j_serial.c b/os/arch/arm/src/s5j/s5j_serial.c index 3ffc53b08a..82a60c6e49 100644 --- a/os/arch/arm/src/s5j/s5j_serial.c +++ b/os/arch/arm/src/s5j/s5j_serial.c @@ -281,7 +281,7 @@ static int up_interrupt(int irq, void *context, void *arg) uint32_t uintp = uart_getreg32(dev->priv, S5J_UART_UINTP_OFFSET); if (uintp & UART_UINTP_TXD) { - uart_xmitchars(dev); + (void)uart_xmitchars(dev); } if (uintp & UART_UINTP_RXD) { diff --git a/os/arch/arm/src/stm32/stm32_serial.c b/os/arch/arm/src/stm32/stm32_serial.c index e76bf8a150..d94bf05a5e 100644 --- a/os/arch/arm/src/stm32/stm32_serial.c +++ b/os/arch/arm/src/stm32/stm32_serial.c @@ -1761,7 +1761,7 @@ static int up_interrupt_common(struct up_dev_s *priv) if ((priv->sr & USART_SR_TXE) != 0 && (priv->ie & USART_CR1_TXEIE) != 0) { /* Transmit data register empty ... process outgoing bytes */ - uart_xmitchars(&priv->dev); + (void)uart_xmitchars(&priv->dev); handled = true; } } @@ -2260,7 +2260,7 @@ static void up_txint(struct uart_dev_s *dev, bool enable) * interrupts disabled (note this may recurse). */ - uart_xmitchars(dev); + (void)uart_xmitchars(dev); #endif } else { /* Disable the TX interrupt */ diff --git a/os/arch/arm/src/stm32l4/stm32l4_serial.c b/os/arch/arm/src/stm32l4/stm32l4_serial.c index 5135bc5ac6..a46e4d0c43 100644 --- a/os/arch/arm/src/stm32l4/stm32l4_serial.c +++ b/os/arch/arm/src/stm32l4/stm32l4_serial.c @@ -1733,7 +1733,7 @@ static int up_interrupt(int irq, FAR void *context, FAR void *arg) { /* Transmit data register empty ... process outgoing bytes */ - uart_xmitchars(&priv->dev); + (void)uart_xmitchars(&priv->dev); handled = true; } } @@ -2581,7 +2581,7 @@ static void stm32l4serial_txint(FAR struct uart_dev_s *dev, bool enable) * interrupts disabled (note this may recurse). */ - uart_xmitchars(dev); + (void)uart_xmitchars(dev); #endif } else diff --git a/os/arch/arm/src/tiva/tiva_serial.c b/os/arch/arm/src/tiva/tiva_serial.c index 71ebca2447..c7519098ce 100644 --- a/os/arch/arm/src/tiva/tiva_serial.c +++ b/os/arch/arm/src/tiva/tiva_serial.c @@ -998,7 +998,7 @@ static int up_interrupt(int irq, void *context, FAR void *arg) if ((mis & UART_MIS_TXMIS) != 0) { /* Tx FIFO not full ... process outgoing bytes */ - uart_xmitchars(dev); + (void)uart_xmitchars(dev); handled = true; } } @@ -1147,7 +1147,7 @@ static void up_txint(struct uart_dev_s *dev, bool enable) * the TX interrupt. */ - uart_xmitchars(dev); + (void)uart_xmitchars(dev); #endif } else { /* Disable the TX interrupt */ diff --git a/os/arch/xtensa/src/esp32/esp32_serial.c b/os/arch/xtensa/src/esp32/esp32_serial.c index ee90222edb..ee4cf83674 100644 --- a/os/arch/xtensa/src/esp32/esp32_serial.c +++ b/os/arch/xtensa/src/esp32/esp32_serial.c @@ -758,7 +758,7 @@ static int esp32_interrupt(int cpuint, void *context, FAR void *arg) if (nfifo < 0x7f) { /* The TXFIFO is not full ... process outgoing bytes */ - uart_xmitchars(dev); + (void)uart_xmitchars(dev); handled = true; } } @@ -1062,7 +1062,7 @@ static void esp32_txint(struct uart_dev_s *dev, bool enable) * interrupts disabled (note this may recurse). */ - uart_xmitchars(dev); + (void)uart_xmitchars(dev); #endif } else { /* Disable the TX interrupt */ diff --git a/os/drivers/serial/serialirq.c b/os/drivers/serial/serialirq.c index 7189728d5e..fe006482e9 100644 --- a/os/drivers/serial/serialirq.c +++ b/os/drivers/serial/serialirq.c @@ -100,7 +100,7 @@ * ************************************************************************************/ -void uart_xmitchars(FAR uart_dev_t *dev) +uint16_t uart_xmitchars(FAR uart_dev_t *dev) { uint16_t nbytes = 0; @@ -146,6 +146,8 @@ void uart_xmitchars(FAR uart_dev_t *dev) #ifdef CONFIG_SMP leave_critical_section(flags); #endif + + return nbytes; } /************************************************************************************ diff --git a/os/drivers/serial/uart_16550.c b/os/drivers/serial/uart_16550.c index ed177fc622..37ebb316fe 100644 --- a/os/drivers/serial/uart_16550.c +++ b/os/drivers/serial/uart_16550.c @@ -787,7 +787,7 @@ static int u16550_interrupt(int irq, void *context, void *arg) /* Handle outgoing, transmit bytes */ case UART_IIR_INTID_THRE: { - uart_xmitchars(dev); + (void)uart_xmitchars(dev); break; } @@ -967,7 +967,7 @@ static void u16550_txint(struct uart_dev_s *dev, bool enable) * interrupts disabled (note this may recurse). */ - uart_xmitchars(dev); + (void)uart_xmitchars(dev); } else { priv->ier &= ~UART_IER_ETBEI; u16550_serialout(priv, UART_IER_OFFSET, priv->ier); diff --git a/os/include/tinyara/arch.h b/os/include/tinyara/arch.h index ded6e5d630..1cf2cf001f 100644 --- a/os/include/tinyara/arch.h +++ b/os/include/tinyara/arch.h @@ -2530,6 +2530,16 @@ int up_getc(void); void up_puts(FAR const char *str); +/**************************************************************************** + * Name: up_flush_console + * + * Description: + * This function is used to ensure that all characters in the UART buffer + * are transmitted. + * + ****************************************************************************/ +void up_flush_console(void); + #ifdef CONFIG_WATCHDOG_FOR_IRQ /**************************************************************************** * Name: up_wdog_init diff --git a/os/include/tinyara/serial/serial.h b/os/include/tinyara/serial/serial.h index 0c47335353..a2025bfc72 100644 --- a/os/include/tinyara/serial/serial.h +++ b/os/include/tinyara/serial/serial.h @@ -348,7 +348,7 @@ int uart_register(FAR const char *path, FAR uart_dev_t *dev); * ************************************************************************************/ -void uart_xmitchars(FAR uart_dev_t *dev); +uint16_t uart_xmitchars(FAR uart_dev_t *dev); /************************************************************************************ * Name: uart_receivechars