From 336fe3b9fd3efe9672c92e5ab9d4cdfc0c2bce6b Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 8 Nov 2017 08:19:15 +0100 Subject: bsp/imx: Better utilize UART transmit FIFO Update #3090. --- c/src/lib/libbsp/arm/imx/console/console-config.c | 25 ++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/c/src/lib/libbsp/arm/imx/console/console-config.c b/c/src/lib/libbsp/arm/imx/console/console-config.c index f7d7820136..5cceb9c8e9 100644 --- a/c/src/lib/libbsp/arm/imx/console/console-config.c +++ b/c/src/lib/libbsp/arm/imx/console/console-config.c @@ -12,6 +12,8 @@ * http://www.rtems.org/license/LICENSE. */ +#include + #include #include #include @@ -25,12 +27,14 @@ #include +#define IMX_UART_TX_FIFO_LEVEL 16 + typedef struct { rtems_termios_device_context base; volatile imx_uart *regs; #ifdef CONSOLE_USE_INTERRUPTS rtems_vector_number irq; - bool transmitting; + int tx_in_progress; #endif } imx_uart_context; @@ -177,8 +181,8 @@ static void imx_uart_interrupt(void *arg) usr2 = regs->usr2; } - if (ctx->transmitting && (regs->usr1 & IMX_UART_USR1_TRDY) != 0) { - rtems_termios_dequeue_characters(tty, 1); + if (ctx->tx_in_progress > 0 && (regs->usr1 & IMX_UART_USR1_TRDY) != 0) { + rtems_termios_dequeue_characters(tty, ctx->tx_in_progress); } } #endif @@ -218,7 +222,7 @@ static bool imx_uart_first_open( #ifdef CONSOLE_USE_INTERRUPTS ufcr = regs->ufcr; ufcr = IMX_UART_UFCR_RXTL_SET(ufcr, 16); - ufcr = IMX_UART_UFCR_TXTL_SET(ufcr, 16); + ufcr = IMX_UART_UFCR_TXTL_SET(ufcr, IMX_UART_TX_FIFO_LEVEL); regs->ufcr = ufcr; regs->ucr1 |= IMX_UART_UCR1_RRDYEN; regs->ucr2 |= IMX_UART_UCR2_ATEN; @@ -260,6 +264,7 @@ static void imx_uart_write( #ifdef CONSOLE_USE_INTERRUPTS imx_uart_context *ctx; volatile imx_uart *regs; + int n; uint32_t ucr1; ctx = (imx_uart_context *) base; @@ -267,15 +272,21 @@ static void imx_uart_write( ucr1 = regs->ucr1; if (len > 0) { - ctx->transmitting = true; - regs->utxd = IMX_UART_UTXD_TX_DATA(buf[0]); + int i; + + n = (int) MIN(len, IMX_UART_TX_FIFO_LEVEL); ucr1 |= IMX_UART_UCR1_TRDYEN; + + for (i = 0; i < n; ++i) { + regs->utxd = IMX_UART_UTXD_TX_DATA(buf[i]); + } } else { - ctx->transmitting = false; + n = 0; ucr1 &= ~IMX_UART_UCR1_TRDYEN; } regs->ucr1 = ucr1; + ctx->tx_in_progress = n; #else size_t i; -- cgit v1.2.3