[rtems commit] bsp/imx: Better utilize UART transmit FIFO
Sebastian Huber
sebh at rtems.org
Wed Nov 8 07:44:49 UTC 2017
Module: rtems
Branch: master
Commit: 336fe3b9fd3efe9672c92e5ab9d4cdfc0c2bce6b
Changeset: http://git.rtems.org/rtems/commit/?id=336fe3b9fd3efe9672c92e5ab9d4cdfc0c2bce6b
Author: Sebastian Huber <sebastian.huber at embedded-brains.de>
Date: Wed Nov 8 08:19:15 2017 +0100
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 f7d7820..5cceb9c 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 <sys/param.h>
+
#include <rtems/bspIo.h>
#include <rtems/console.h>
#include <rtems/sysinit.h>
@@ -25,12 +27,14 @@
#include <libfdt.h>
+#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;
More information about the vc
mailing list