summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/m68k/mcf5206/console/mcfuart.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libcpu/m68k/mcf5206/console/mcfuart.c')
-rw-r--r--c/src/lib/libcpu/m68k/mcf5206/console/mcfuart.c642
1 files changed, 296 insertions, 346 deletions
diff --git a/c/src/lib/libcpu/m68k/mcf5206/console/mcfuart.c b/c/src/lib/libcpu/m68k/mcf5206/console/mcfuart.c
index ec284c4239..fccce8541d 100644
--- a/c/src/lib/libcpu/m68k/mcf5206/console/mcfuart.c
+++ b/c/src/lib/libcpu/m68k/mcf5206/console/mcfuart.c
@@ -1,6 +1,8 @@
/*
* Generic UART Serial driver for Motorola Coldfire processors
- *
+ */
+
+/*
* Copyright (C) 2000 OKTET Ltd., St.-Petersburg, Russian Fed.
* Author: Victor V. Vengerov <vvv@oktet.ru>
*
@@ -10,7 +12,6 @@
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
- *
*/
#include <rtems.h>
@@ -23,8 +24,8 @@
* UART descriptor structures
*/
static struct {
- mcfuart *uart;
- int vec;
+ mcfuart *uart;
+ int vec;
} int_driven_uart[2];
/* Forward function declarations */
@@ -48,20 +49,24 @@ mcfuart_interrupt_handler(rtems_vector_number vec);
* RTEMS_SUCCESSFUL if all parameters are valid, or error code
*/
rtems_status_code
-mcfuart_init(mcfuart *uart, void *tty, uint8_t intvec,
- uint32_t chn)
+mcfuart_init(
+ mcfuart *uart,
+ void *tty,
+ uint8_t intvec,
+ uint32_t chn
+)
{
- if (uart == NULL)
- return RTEMS_INVALID_ADDRESS;
+ if (uart == NULL)
+ return RTEMS_INVALID_ADDRESS;
- if ((chn <= 0) || (chn > MCF5206E_UART_CHANNELS))
- return RTEMS_INVALID_NUMBER;
+ if ((chn <= 0) || (chn > MCF5206E_UART_CHANNELS))
+ return RTEMS_INVALID_NUMBER;
- uart->chn = chn;
- uart->intvec = intvec;
- uart->tty = tty;
+ uart->chn = chn;
+ uart->intvec = intvec;
+ uart->tty = tty;
- return RTEMS_SUCCESSFUL;
+ return RTEMS_SUCCESSFUL;
}
/* mcfuart_set_baudrate --
@@ -77,38 +82,38 @@ mcfuart_init(mcfuart *uart, void *tty, uint8_t intvec,
static void
mcfuart_set_baudrate(mcfuart *uart, speed_t baud)
{
- uint32_t div;
- uint32_t rate;
- switch (baud)
- {
- case B50: rate = 50; break;
- case B75: rate = 75; break;
- case B110: rate = 110; break;
- case B134: rate = 134; break;
- case B150: rate = 150; break;
- case B200: rate = 200; break;
- case B300: rate = 300; break;
- case B600: rate = 600; break;
- case B1200: rate = 1200; break;
- case B2400: rate = 2400; break;
- case B4800: rate = 4800; break;
- case B9600: rate = 9600; break;
- case B19200: rate = 19200; break;
- case B38400: rate = 38400; break;
- case B57600: rate = 57600; break;
+ uint32_t div;
+ uint32_t rate;
+
+ switch (baud) {
+ case B50: rate = 50; break;
+ case B75: rate = 75; break;
+ case B110: rate = 110; break;
+ case B134: rate = 134; break;
+ case B150: rate = 150; break;
+ case B200: rate = 200; break;
+ case B300: rate = 300; break;
+ case B600: rate = 600; break;
+ case B1200: rate = 1200; break;
+ case B2400: rate = 2400; break;
+ case B4800: rate = 4800; break;
+ case B9600: rate = 9600; break;
+ case B19200: rate = 19200; break;
+ case B38400: rate = 38400; break;
+ case B57600: rate = 57600; break;
#ifdef B115200
- case B115200: rate = 115200; break;
+ case B115200: rate = 115200; break;
#endif
#ifdef B230400
- case B230400: rate = 230400; break;
+ case B230400: rate = 230400; break;
#endif
- default: rate = 9600; break;
+ default: rate = 9600; break;
}
- div = SYSTEM_CLOCK_FREQUENCY / (rate * 32);
+ div = SYSTEM_CLOCK_FREQUENCY / (rate * 32);
- *MCF5206E_UBG1(MBAR,uart->chn) = (uint8_t)((div >> 8) & 0xff);
- *MCF5206E_UBG2(MBAR,uart->chn) = (uint8_t)(div & 0xff);
+ *MCF5206E_UBG1(MBAR,uart->chn) = (uint8_t)((div >> 8) & 0xff);
+ *MCF5206E_UBG2(MBAR,uart->chn) = (uint8_t)(div & 0xff);
}
/*
@@ -128,69 +133,64 @@ mcfuart_set_baudrate(mcfuart *uart, speed_t baud)
* This function in general follows to algorith described in MCF5206e
* User's Manual, 12.5 UART Module Initialization Sequence
*/
-rtems_status_code
-mcfuart_reset(mcfuart *uart)
+rtems_status_code mcfuart_reset(mcfuart *uart)
{
- register uint32_t chn;
- rtems_status_code rc;
-
- if (uart == NULL)
- return RTEMS_INVALID_ADDRESS;
-
- chn = uart->chn;
-
- /* Reset the receiver and transmitter */
- *MCF5206E_UCR(MBAR,chn) = MCF5206E_UCR_MISC_RESET_RX;
- *MCF5206E_UCR(MBAR,chn) = MCF5206E_UCR_MISC_RESET_TX;
-
- /*
- * Program the vector number for a UART module interrupt, or
- * disable UART interrupts if polled I/O. Enable the desired
- * interrupt sources.
- */
- if (uart->intvec != 0)
- {
- int_driven_uart[chn - 1].uart = uart;
- int_driven_uart[chn - 1].vec = uart->intvec;
- rc = rtems_interrupt_catch(mcfuart_interrupt_handler, uart->intvec,
- &uart->old_handler);
- if (rc != RTEMS_SUCCESSFUL)
- return rc;
- *MCF5206E_UIVR(MBAR,chn) = uart->intvec;
- *MCF5206E_UIMR(MBAR,chn) = MCF5206E_UIMR_FFULL;
- *MCF5206E_UACR(MBAR,chn) = MCF5206E_UACR_IEC;
- *MCF5206E_IMR(MBAR) &= ~MCF5206E_INTR_BIT(uart->chn == 1 ?
- MCF5206E_INTR_UART_1 :
- MCF5206E_INTR_UART_2);
- }
- else
- {
- *MCF5206E_UIMR(MBAR,chn) = 0;
- }
-
- /* Select the receiver and transmitter clock. */
- mcfuart_set_baudrate(uart, B19200); /* dBUG defaults (unfortunately,
- it is differ to termios default */
- *MCF5206E_UCSR(MBAR,chn) =
- MCF5206E_UCSR_RCS_TIMER | MCF5206E_UCSR_TCS_TIMER;
-
- /* Mode Registers 1,2 - set termios defaults (8N1) */
- *MCF5206E_UCR(MBAR,chn) = MCF5206E_UCR_MISC_RESET_MR;
- *MCF5206E_UMR(MBAR,chn) =
+ register uint32_t chn;
+ rtems_status_code rc;
+
+ if (uart == NULL)
+ return RTEMS_INVALID_ADDRESS;
+
+ chn = uart->chn;
+
+ /* Reset the receiver and transmitter */
+ *MCF5206E_UCR(MBAR,chn) = MCF5206E_UCR_MISC_RESET_RX;
+ *MCF5206E_UCR(MBAR,chn) = MCF5206E_UCR_MISC_RESET_TX;
+
+ /*
+ * Program the vector number for a UART module interrupt, or
+ * disable UART interrupts if polled I/O. Enable the desired
+ * interrupt sources.
+ */
+ if (uart->intvec != 0) {
+ int_driven_uart[chn - 1].uart = uart;
+ int_driven_uart[chn - 1].vec = uart->intvec;
+ rc = rtems_interrupt_catch(mcfuart_interrupt_handler, uart->intvec,
+ &uart->old_handler);
+ if (rc != RTEMS_SUCCESSFUL)
+ return rc;
+ *MCF5206E_UIVR(MBAR,chn) = uart->intvec;
+ *MCF5206E_UIMR(MBAR,chn) = MCF5206E_UIMR_FFULL;
+ *MCF5206E_UACR(MBAR,chn) = MCF5206E_UACR_IEC;
+ *MCF5206E_IMR(MBAR) &= ~MCF5206E_INTR_BIT(uart->chn == 1 ?
+ MCF5206E_INTR_UART_1 :
+ MCF5206E_INTR_UART_2);
+ } else {
+ *MCF5206E_UIMR(MBAR,chn) = 0;
+ }
+
+ /* Select the receiver and transmitter clock. */
+ mcfuart_set_baudrate(uart, B19200); /* dBUG defaults (unfortunately,
+ it is differ to termios default */
+ *MCF5206E_UCSR(MBAR,chn) = MCF5206E_UCSR_RCS_TIMER | MCF5206E_UCSR_TCS_TIMER;
+
+ /* Mode Registers 1,2 - set termios defaults (8N1) */
+ *MCF5206E_UCR(MBAR,chn) = MCF5206E_UCR_MISC_RESET_MR;
+ *MCF5206E_UMR(MBAR,chn) =
/* MCF5206E_UMR1_RXRTS | */
- MCF5206E_UMR1_PM_NO_PARITY |
- MCF5206E_UMR1_BC_8;
- *MCF5206E_UMR(MBAR,chn) =
- MCF5206E_UMR2_CM_NORMAL |
+ MCF5206E_UMR1_PM_NO_PARITY |
+ MCF5206E_UMR1_BC_8;
+ *MCF5206E_UMR(MBAR,chn) =
+ MCF5206E_UMR2_CM_NORMAL |
/* MCF5206E_UMR2_TXCTS | */
- MCF5206E_UMR2_SB_1;
+ MCF5206E_UMR2_SB_1;
- /* Enable Receiver and Transmitter */
- *MCF5206E_UCR(MBAR,chn) = MCF5206E_UCR_MISC_RESET_ERR;
- *MCF5206E_UCR(MBAR,chn) = MCF5206E_UCR_TC_ENABLE;
- *MCF5206E_UCR(MBAR,chn) = MCF5206E_UCR_RC_ENABLE;
+ /* Enable Receiver and Transmitter */
+ *MCF5206E_UCR(MBAR,chn) = MCF5206E_UCR_MISC_RESET_ERR;
+ *MCF5206E_UCR(MBAR,chn) = MCF5206E_UCR_TC_ENABLE;
+ *MCF5206E_UCR(MBAR,chn) = MCF5206E_UCR_RC_ENABLE;
- return RTEMS_SUCCESSFUL;
+ return RTEMS_SUCCESSFUL;
}
/*
@@ -205,25 +205,24 @@ mcfuart_reset(mcfuart *uart)
* RTEMS_SUCCESSFUL if UART closed successfuly, or error code in
* other case
*/
-rtems_status_code
-mcfuart_disable(mcfuart *uart)
+rtems_status_code mcfuart_disable(mcfuart *uart)
{
- rtems_status_code rc;
- *MCF5206E_UCR(MBAR,uart->chn) =
- MCF5206E_UCR_TC_DISABLE |
- MCF5206E_UCR_RC_DISABLE;
- if (uart->intvec != 0)
- {
- *MCF5206E_IMR(MBAR) |= MCF5206E_INTR_BIT(uart->chn == 1 ?
- MCF5206E_INTR_UART_1 :
- MCF5206E_INTR_UART_2);
- rc = rtems_interrupt_catch(uart->old_handler, uart->intvec, NULL);
- int_driven_uart[uart->chn - 1].uart = NULL;
- int_driven_uart[uart->chn - 1].vec = 0;
- if (rc != RTEMS_SUCCESSFUL)
- return rc;
- }
- return RTEMS_SUCCESSFUL;
+ rtems_status_code rc;
+
+ *MCF5206E_UCR(MBAR,uart->chn) =
+ MCF5206E_UCR_TC_DISABLE |
+ MCF5206E_UCR_RC_DISABLE;
+ if (uart->intvec != 0) {
+ *MCF5206E_IMR(MBAR) |= MCF5206E_INTR_BIT(uart->chn == 1 ?
+ MCF5206E_INTR_UART_1 :
+ MCF5206E_INTR_UART_2);
+ rc = rtems_interrupt_catch(uart->old_handler, uart->intvec, NULL);
+ int_driven_uart[uart->chn - 1].uart = NULL;
+ int_driven_uart[uart->chn - 1].vec = 0;
+ if (rc != RTEMS_SUCCESSFUL)
+ return rc;
+ }
+ return RTEMS_SUCCESSFUL;
}
/*
@@ -238,93 +237,72 @@ mcfuart_disable(mcfuart *uart)
* RETURNS:
* RTEMS_SUCCESSFUL
*/
-int
-mcfuart_set_attributes(mcfuart *uart, const struct termios *t)
+int mcfuart_set_attributes(mcfuart *uart, const struct termios *t)
{
- int level;
- speed_t baud;
- uint8_t umr1, umr2;
-
- baud = cfgetospeed(t);
- umr1 = 0;
- umr2 = MCF5206E_UMR2_CM_NORMAL;
-
- /* Set flow control */
- if ((t->c_cflag & CRTSCTS) != 0)
- {
- umr1 |= MCF5206E_UMR1_RXRTS;
- umr2 |= MCF5206E_UMR2_TXCTS;
- }
-
- /* Set character size */
- switch (t->c_cflag & CSIZE)
- {
- case CS5: umr1 |= MCF5206E_UMR1_BC_5; break;
- case CS6: umr1 |= MCF5206E_UMR1_BC_6; break;
- case CS7: umr1 |= MCF5206E_UMR1_BC_7; break;
- case CS8: umr1 |= MCF5206E_UMR1_BC_8; break;
- }
-
- /* Set number of stop bits */
- if ((t->c_cflag & CSTOPB) != 0)
- {
- if ((t->c_cflag & CSIZE) == CS5)
- {
- umr2 |= MCF5206E_UMR2_SB5_2;
- }
- else
- {
- umr2 |= MCF5206E_UMR2_SB_2;
- }
- }
- else
- {
- if ((t->c_cflag & CSIZE) == CS5)
- {
- umr2 |= MCF5206E_UMR2_SB5_1;
- }
- else
- {
- umr2 |= MCF5206E_UMR2_SB_1;
- }
+ int level;
+ speed_t baud;
+ uint8_t umr1, umr2;
+
+ baud = cfgetospeed(t);
+ umr1 = 0;
+ umr2 = MCF5206E_UMR2_CM_NORMAL;
+
+ /* Set flow control */
+ if ((t->c_cflag & CRTSCTS) != 0) {
+ umr1 |= MCF5206E_UMR1_RXRTS;
+ umr2 |= MCF5206E_UMR2_TXCTS;
+ }
+
+ /* Set character size */
+ switch (t->c_cflag & CSIZE) {
+ case CS5: umr1 |= MCF5206E_UMR1_BC_5; break;
+ case CS6: umr1 |= MCF5206E_UMR1_BC_6; break;
+ case CS7: umr1 |= MCF5206E_UMR1_BC_7; break;
+ case CS8: umr1 |= MCF5206E_UMR1_BC_8; break;
+ }
+
+ /* Set number of stop bits */
+ if ((t->c_cflag & CSTOPB) != 0) {
+ if ((t->c_cflag & CSIZE) == CS5) {
+ umr2 |= MCF5206E_UMR2_SB5_2;
+ } else {
+ umr2 |= MCF5206E_UMR2_SB_2;
}
-
- /* Set parity mode */
- if ((t->c_cflag & PARENB) != 0)
- {
- if ((t->c_cflag & PARODD) != 0)
- {
- umr1 |= MCF5206E_UMR1_PM_ODD;
- }
- else
- {
- umr1 |= MCF5206E_UMR1_PM_EVEN;
- }
+ } else {
+ if ((t->c_cflag & CSIZE) == CS5) {
+ umr2 |= MCF5206E_UMR2_SB5_1;
+ } else {
+ umr2 |= MCF5206E_UMR2_SB_1;
}
- else
- {
- umr1 |= MCF5206E_UMR1_PM_NO_PARITY;
+ }
+
+ /* Set parity mode */
+ if ((t->c_cflag & PARENB) != 0) {
+ if ((t->c_cflag & PARODD) != 0) {
+ umr1 |= MCF5206E_UMR1_PM_ODD;
+ } else {
+ umr1 |= MCF5206E_UMR1_PM_EVEN;
}
-
- rtems_interrupt_disable(level);
+ } else {
+ umr1 |= MCF5206E_UMR1_PM_NO_PARITY;
+ }
+
+ rtems_interrupt_disable(level);
+ *MCF5206E_UCR(MBAR,uart->chn) =
+ MCF5206E_UCR_TC_DISABLE | MCF5206E_UCR_RC_DISABLE;
+ mcfuart_set_baudrate(uart, baud);
+ *MCF5206E_UCR(MBAR,uart->chn) = MCF5206E_UCR_MISC_RESET_MR;
+ *MCF5206E_UMR(MBAR,uart->chn) = umr1;
+ *MCF5206E_UMR(MBAR,uart->chn) = umr2;
+ if ((t->c_cflag & CREAD) != 0) {
*MCF5206E_UCR(MBAR,uart->chn) =
- MCF5206E_UCR_TC_DISABLE | MCF5206E_UCR_RC_DISABLE;
- mcfuart_set_baudrate(uart, baud);
- *MCF5206E_UCR(MBAR,uart->chn) = MCF5206E_UCR_MISC_RESET_MR;
- *MCF5206E_UMR(MBAR,uart->chn) = umr1;
- *MCF5206E_UMR(MBAR,uart->chn) = umr2;
- if ((t->c_cflag & CREAD) != 0)
- {
- *MCF5206E_UCR(MBAR,uart->chn) =
- MCF5206E_UCR_TC_ENABLE | MCF5206E_UCR_RC_ENABLE;
- }
- else
- {
- *MCF5206E_UCR(MBAR,uart->chn) = MCF5206E_UCR_TC_ENABLE;
- }
- rtems_interrupt_enable(level);
+ MCF5206E_UCR_TC_ENABLE | MCF5206E_UCR_RC_ENABLE;
+ } else {
+ *MCF5206E_UCR(MBAR,uart->chn) = MCF5206E_UCR_TC_ENABLE;
+ }
+ rtems_interrupt_enable(level);
- return RTEMS_SUCCESSFUL;
+ return RTEMS_SUCCESSFUL;
}
/*
@@ -343,41 +321,33 @@ mcfuart_set_attributes(mcfuart *uart, const struct termios *t)
* RETURNS:
* code of received character or -1 if no characters received.
*/
-int
-mcfuart_poll_read(mcfuart *uart)
+int mcfuart_poll_read(mcfuart *uart)
{
- uint8_t usr;
- int ch;
- if (uart->parerr_mark_flag == true)
- {
- uart->parerr_mark_flag = false;
- return 0;
- }
- usr = *MCF5206E_USR(MBAR,uart->chn);
- if ((usr & MCF5206E_USR_RXRDY) != 0)
- {
- if (((usr & (MCF5206E_USR_FE | MCF5206E_USR_PE)) != 0) &&
- !(uart->c_iflag & IGNPAR))
- {
- ch = *MCF5206E_URB(MBAR,uart->chn); /* Clear error bits */
- if (uart->c_iflag & PARMRK)
- {
- uart->parerr_mark_flag = true;
- ch = 0xff;
- }
- else
- {
- ch = 0;
- }
- }
- else
- {
- ch = *MCF5206E_URB(MBAR,uart->chn);
- }
+ uint8_t usr;
+ int ch;
+
+ if (uart->parerr_mark_flag == true) {
+ uart->parerr_mark_flag = false;
+ return 0;
+ }
+
+ usr = *MCF5206E_USR(MBAR,uart->chn);
+ if ((usr & MCF5206E_USR_RXRDY) != 0) {
+ if (((usr & (MCF5206E_USR_FE | MCF5206E_USR_PE)) != 0) &&
+ !(uart->c_iflag & IGNPAR)) {
+ ch = *MCF5206E_URB(MBAR,uart->chn); /* Clear error bits */
+ if (uart->c_iflag & PARMRK) {
+ uart->parerr_mark_flag = true;
+ ch = 0xff;
+ } else {
+ ch = 0;
+ }
+ } else {
+ ch = *MCF5206E_URB(MBAR,uart->chn);
}
- else
- ch = -1;
- return ch;
+ } else
+ ch = -1;
+ return ch;
}
/*
@@ -392,17 +362,15 @@ mcfuart_poll_read(mcfuart *uart)
* RETURNS:
* 0
*/
-ssize_t
-mcfuart_poll_write(mcfuart *uart, const char *buf, size_t len)
+ssize_t mcfuart_poll_write(mcfuart *uart, const char *buf, size_t len)
{
size_t retval = len;
- while (len--)
- {
- while ((*MCF5206E_USR(MBAR, uart->chn) & MCF5206E_USR_TXRDY) == 0);
- *MCF5206E_UTB(MBAR, uart->chn) = *buf++;
- }
- return retval;
+ while (len--) {
+ while ((*MCF5206E_USR(MBAR, uart->chn) & MCF5206E_USR_TXRDY) == 0);
+ *MCF5206E_UTB(MBAR, uart->chn) = *buf++;
+ }
+ return retval;
}
/* mcfuart_interrupt_handler --
@@ -414,95 +382,78 @@ mcfuart_poll_write(mcfuart *uart, const char *buf, size_t len)
* RETURNS:
* none
*/
-static rtems_isr
-mcfuart_interrupt_handler(rtems_vector_number vec)
+static rtems_isr mcfuart_interrupt_handler(rtems_vector_number vec)
{
- mcfuart *uart;
- register uint8_t usr;
- register uint8_t uisr;
- register int chn;
- register int bp = 0;
-
- /* Find UART descriptor from vector number */
- if (int_driven_uart[0].vec == vec)
- uart = int_driven_uart[0].uart;
- else if (int_driven_uart[1].vec == vec)
- uart = int_driven_uart[1].uart;
- else
- return;
-
- chn = uart->chn;
-
- uisr = *MCF5206E_UISR(MBAR, chn);
- if (uisr & MCF5206E_UISR_DB)
- {
- *MCF5206E_UCR(MBAR, chn) = MCF5206E_UCR_MISC_RESET_BRK;
+ mcfuart *uart;
+ register uint8_t usr;
+ register uint8_t uisr;
+ register int chn;
+ register int bp = 0;
+
+ /* Find UART descriptor from vector number */
+ if (int_driven_uart[0].vec == vec)
+ uart = int_driven_uart[0].uart;
+ else if (int_driven_uart[1].vec == vec)
+ uart = int_driven_uart[1].uart;
+ else
+ return;
+
+ chn = uart->chn;
+
+ uisr = *MCF5206E_UISR(MBAR, chn);
+ if (uisr & MCF5206E_UISR_DB) {
+ *MCF5206E_UCR(MBAR, chn) = MCF5206E_UCR_MISC_RESET_BRK;
+ }
+
+ /* Receiving */
+ while (1) {
+ char buf[32];
+ usr = *MCF5206E_USR(MBAR,chn);
+ if ((bp < sizeof(buf) - 1) && ((usr & MCF5206E_USR_RXRDY) != 0)) {
+ /* Receive character and handle frame/parity errors */
+ if (((usr & (MCF5206E_USR_FE | MCF5206E_USR_PE)) != 0) &&
+ !(uart->c_iflag & IGNPAR)) {
+ if (uart->c_iflag & PARMRK) {
+ buf[bp++] = 0xff;
+ buf[bp++] = 0x00;
+ } else {
+ buf[bp++] = 0x00;
+ }
+ } else {
+ buf[bp++] = *MCF5206E_URB(MBAR, chn);
+ }
+
+ /* Reset error condition if any errors has been detected */
+ if (usr & (MCF5206E_USR_RB | MCF5206E_USR_FE |
+ MCF5206E_USR_PE | MCF5206E_USR_OE)) {
+ *MCF5206E_UCR(MBAR, chn) = MCF5206E_UCR_MISC_RESET_ERR;
+ }
+ } else {
+ if (bp != 0)
+ rtems_termios_enqueue_raw_characters(uart->tty, buf, bp);
+ break;
}
-
- /* Receiving */
- while (1)
- {
- char buf[32];
- usr = *MCF5206E_USR(MBAR,chn);
- if ((bp < sizeof(buf) - 1) && ((usr & MCF5206E_USR_RXRDY) != 0))
- {
- /* Receive character and handle frame/parity errors */
- if (((usr & (MCF5206E_USR_FE | MCF5206E_USR_PE)) != 0) &&
- !(uart->c_iflag & IGNPAR))
- {
- if (uart->c_iflag & PARMRK)
- {
- buf[bp++] = 0xff;
- buf[bp++] = 0x00;
- }
- else
- {
- buf[bp++] = 0x00;
- }
- }
- else
- {
- buf[bp++] = *MCF5206E_URB(MBAR, chn);
- }
-
- /* Reset error condition if any errors has been detected */
- if (usr & (MCF5206E_USR_RB | MCF5206E_USR_FE |
- MCF5206E_USR_PE | MCF5206E_USR_OE))
- {
- *MCF5206E_UCR(MBAR, chn) = MCF5206E_UCR_MISC_RESET_ERR;
- }
- }
- else
- {
- if (bp != 0)
- rtems_termios_enqueue_raw_characters(uart->tty, buf, bp);
- break;
- }
- }
-
- /* Transmitting */
- while (1)
- {
- if ((*MCF5206E_USR(MBAR, chn) & MCF5206E_USR_TXRDY) == 0)
- break;
- if (uart->tx_buf != NULL)
- {
- if (uart->tx_ptr >= uart->tx_buf_len)
- {
- register int dequeue = uart->tx_buf_len;
- *MCF5206E_UIMR(MBAR, uart->chn) = MCF5206E_UIMR_FFULL;
- uart->tx_buf = NULL;
- uart->tx_ptr = uart->tx_buf_len = 0;
- rtems_termios_dequeue_characters(uart->tty, dequeue);
- }
- else
- {
- *MCF5206E_UTB(MBAR, chn) = uart->tx_buf[uart->tx_ptr++];
- }
- }
- else
- break;
+ }
+
+ /* Transmitting */
+ while (1) {
+ if ((*MCF5206E_USR(MBAR, chn) & MCF5206E_USR_TXRDY) == 0)
+ break;
+ if (uart->tx_buf != NULL) {
+ if (uart->tx_ptr >= uart->tx_buf_len) {
+ register int dequeue = uart->tx_buf_len;
+
+ *MCF5206E_UIMR(MBAR, uart->chn) = MCF5206E_UIMR_FFULL;
+ uart->tx_buf = NULL;
+ uart->tx_ptr = uart->tx_buf_len = 0;
+ rtems_termios_dequeue_characters(uart->tty, dequeue);
+ } else {
+ *MCF5206E_UTB(MBAR, chn) = uart->tx_buf[uart->tx_ptr++];
+ }
}
+ else
+ break;
+ }
}
/* mcfuart_interrupt_write --
@@ -516,24 +467,25 @@ mcfuart_interrupt_handler(rtems_vector_number vec)
* RETURNS:
* 0
*/
-ssize_t
-mcfuart_interrupt_write(mcfuart *uart, const char *buf, size_t len)
+ssize_t mcfuart_interrupt_write(
+ mcfuart *uart,
+ const char *buf,
+ size_t len
+)
{
- if (len > 0)
- {
- uart->tx_buf = buf;
- uart->tx_buf_len = len;
- uart->tx_ptr = 0;
- *MCF5206E_UIMR(MBAR, uart->chn) =
- MCF5206E_UIMR_FFULL | MCF5206E_UIMR_TXRDY;
- while (((*MCF5206E_USR(MBAR,uart->chn) & MCF5206E_USR_TXRDY) != 0) &&
- (uart->tx_ptr < uart->tx_buf_len))
- {
- *MCF5206E_UTB(MBAR,uart->chn) = uart->tx_buf[uart->tx_ptr++];
- }
+ if (len > 0) {
+ uart->tx_buf = buf;
+ uart->tx_buf_len = len;
+ uart->tx_ptr = 0;
+ *MCF5206E_UIMR(MBAR, uart->chn) =
+ MCF5206E_UIMR_FFULL | MCF5206E_UIMR_TXRDY;
+ while (((*MCF5206E_USR(MBAR,uart->chn) & MCF5206E_USR_TXRDY) != 0) &&
+ (uart->tx_ptr < uart->tx_buf_len)) {
+ *MCF5206E_UTB(MBAR,uart->chn) = uart->tx_buf[uart->tx_ptr++];
}
+ }
- return 0;
+ return 0;
}
/* mcfuart_stop_remote_tx --
@@ -545,11 +497,10 @@ mcfuart_interrupt_write(mcfuart *uart, const char *buf, size_t len)
* RETURNS:
* RTEMS_SUCCESSFUL
*/
-int
-mcfuart_stop_remote_tx(mcfuart *uart)
+int mcfuart_stop_remote_tx(mcfuart *uart)
{
- *MCF5206E_UOP0(MBAR, uart->chn) = 1;
- return RTEMS_SUCCESSFUL;
+ *MCF5206E_UOP0(MBAR, uart->chn) = 1;
+ return RTEMS_SUCCESSFUL;
}
/* mcfuart_start_remote_tx --
@@ -561,9 +512,8 @@ mcfuart_stop_remote_tx(mcfuart *uart)
* RETURNS:
* RTEMS_SUCCESSFUL
*/
-int
-mcfuart_start_remote_tx(mcfuart *uart)
+int mcfuart_start_remote_tx(mcfuart *uart)
{
- *MCF5206E_UOP1(MBAR, uart->chn) = 1;
- return RTEMS_SUCCESSFUL;
+ *MCF5206E_UOP1(MBAR, uart->chn) = 1;
+ return RTEMS_SUCCESSFUL;
}