diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2008-09-19 17:45:51 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2008-09-19 17:45:51 +0000 |
commit | d56fc4681310fd7870b86a363748fb93369bb81e (patch) | |
tree | e605c1b0c233164b659c79b9fb0641cf5d12f9ba | |
parent | b54085ce47b1903bc32ccd30cda10be743202e7b (diff) | |
download | nuttx-d56fc4681310fd7870b86a363748fb93369bb81e.tar.gz nuttx-d56fc4681310fd7870b86a363748fb93369bb81e.tar.bz2 nuttx-d56fc4681310fd7870b86a363748fb93369bb81e.zip |
Fix basic problems with LPC2148 uart interrupts
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@944 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r-- | nuttx/arch/arm/src/lpc214x/lpc214x_serial.c | 93 | ||||
-rwxr-xr-x | nuttx/arch/arm/src/lpc214x/lpc214x_uart.h | 2 |
2 files changed, 67 insertions, 28 deletions
diff --git a/nuttx/arch/arm/src/lpc214x/lpc214x_serial.c b/nuttx/arch/arm/src/lpc214x/lpc214x_serial.c index 746899b96..3b9f0e04c 100644 --- a/nuttx/arch/arm/src/lpc214x/lpc214x_serial.c +++ b/nuttx/arch/arm/src/lpc214x/lpc214x_serial.c @@ -181,14 +181,16 @@ static uart_dev_t g_uart1port = /* Now, which one with be tty0/console and which tty1? */ -#ifdef CONFIG_SERIAL_IRDA_CONSOLE -# define CONSOLE_DEV g_uart1port -# define TTYS0_DEV g_uart1port -# define TTYS1_DEV g_uart0port +#if defined(CONFIG_UART0_SERIAL_CONSOLE) +# define CONSOLE_DEV g_uart0port +# define TTYS0_DEV g_uart0port +# define TTYS1_DEV g_uart1port +#elif defined(CONFIG_UART1_SERIAL_CONSOLE) +# define CONSOLE_DEV g_uart1port +# define TTYS0_DEV g_uart1port +# define TTYS1_DEV g_uart0port #else -# define CONSOLE_DEV g_uart0port -# define TTYS0_DEV g_uart0port -# define TTYS1_DEV g_uart1port +# error "No CONFIG_UARTn_SERIAL_CONSOLE Setting" #endif /**************************************************************************** @@ -295,11 +297,13 @@ static int up_setup(struct uart_dev_s *dev) /* Clear fifos */ - up_serialout(priv, LPC214X_UART_FCR_OFFSET, (LPC214X_FCR_RX_FIFO_RESET|LPC214X_FCR_TX_FIFO_RESET)); - + up_serialout(priv, LPC214X_UART_FCR_OFFSET, + (LPC214X_FCR_RX_FIFO_RESET|LPC214X_FCR_TX_FIFO_RESET)); + /* Set trigger */ - up_serialout(priv, LPC214X_UART_FCR_OFFSET, (LPC214X_FCR_FIFO_ENABLE|LPC214X_FCR_FIFO_TRIG14)); + up_serialout(priv, LPC214X_UART_FCR_OFFSET, + (LPC214X_FCR_FIFO_ENABLE|LPC214X_FCR_FIFO_TRIG14)); /* Set up the IER */ @@ -334,7 +338,8 @@ static int up_setup(struct uart_dev_s *dev) /* Enter DLAB=1 */ - up_serialout(priv, LPC214X_UART_LCR_OFFSET, (lcr | LPC214X_LCR_DLAB_ENABLE)); + up_serialout(priv, LPC214X_UART_LCR_OFFSET, + (lcr | LPC214X_LCR_DLAB_ENABLE)); /* Set the BAUD divisor */ @@ -344,7 +349,13 @@ static int up_setup(struct uart_dev_s *dev) /* Clear DLAB */ - up_serialout(priv, LPC214X_UART_LCR_OFFSET, lcr); + up_serialout(priv, LPC214X_UART_LCR_OFFSET, lcr); + + /* Configure the FIFOs */ + + up_serialout(priv, LPC214X_UART_FCR_OFFSET, + (LPC214X_FCR_FIFO_TRIG8|LPC214X_FCR_TX_FIFO_RESET|\ + LPC214X_FCR_RX_FIFO_RESET|LPC214X_FCR_FIFO_ENABLE)); #endif return OK; } @@ -459,42 +470,70 @@ static int up_interrupt(int irq, void *context) * termination conditions */ - status = up_serialin(priv, LPC214X_UART_IIR_OFFSET); + status = up_serialin(priv, LPC214X_UART_IIR_OFFSET); - /* The NO INTERRUPT should be zero */ + /* The NO INTERRUPT should be zero if there are pending + * interrupts + */ - if (status != LPC214X_IIR_NO_INT) + if ((status & LPC214X_IIR_NO_INT) != 0) { - /* Handline incoming, receive bytes (with or without timeout) */ + /* Break out of the loop when there is no longer a + * pending interrupt + */ - if (status == LPC214X_IIR_RDA_INT || status == LPC214X_IIR_CTI_INT) + break; + } + + /* Handle the interrupt by its interrupt ID field */ + + switch (status & LPC214X_IIR_MASK) + { + /* Handle incoming, receive bytes (with or without timeout) */ + + case LPC214X_IIR_RDA_INT: + case LPC214X_IIR_CTI_INT: { uart_recvchars(dev); + break; } /* Handle outgoing, transmit bytes */ - else if (status == LPC214X_IIR_THRE_INT) + case LPC214X_IIR_THRE_INT: { uart_xmitchars(dev); + break; } - /* Just clear modem status interrupts */ + /* Just clear modem status interrupts (UART1 only) */ - else if (status == LPC214X_IIR_MS_INT) - { - /* Read the modem status regisgter (MSR) to clear */ + case LPC214X_IIR_MS_INT: + { + /* Read the modem status register (MSR) to clear */ - (void)up_serialin(priv, LPC214X_UART_MSR_OFFSET); - } + status = up_serialin(priv, LPC214X_UART_MSR_OFFSET); + vdbg("MSR: %02x\n", status); + break; + } /* Just clear any line status interrupts */ - else if (status == LPC214X_IIR_RLS_INT) + case LPC214X_IIR_RLS_INT: { /* Read the line status register (LSR) to clear */ - (void)up_serialin(priv, LPC214X_UART_LSR_OFFSET); + status = up_serialin(priv, LPC214X_UART_LSR_OFFSET); + vdbg("LSR: %02x\n", status); + break; + } + + /* There should be no other values */ + + default: + { + dbg("Unexpected IIR: %02x\n", status); + break; } } } @@ -711,7 +750,7 @@ void up_earlyserialinit(void) up_disableuartint(TTYS0_DEV.priv, NULL); up_disableuartint(TTYS1_DEV.priv, NULL); - /* Configuration whichever on is the console */ + /* Configuration whichever one is the console */ CONSOLE_DEV.isconsole = TRUE; up_setup(&CONSOLE_DEV); diff --git a/nuttx/arch/arm/src/lpc214x/lpc214x_uart.h b/nuttx/arch/arm/src/lpc214x/lpc214x_uart.h index 9e5b6883d..2752d17ae 100755 --- a/nuttx/arch/arm/src/lpc214x/lpc214x_uart.h +++ b/nuttx/arch/arm/src/lpc214x/lpc214x_uart.h @@ -69,7 +69,7 @@ /* Interrupt ID Register(IIR) bit definitions */
#define LPC214X_IIR_NO_INT (1 << 0) /* No interrupts pending */
-#define LPC214X_IIR_MS_INT (0 << 1) /* MODEM Status */
+#define LPC214X_IIR_MS_INT (0 << 1) /* MODEM Status (UART1 only) */
#define LPC214X_IIR_THRE_INT (1 << 1) /* Transmit Holding Register Empty */
#define LPC214X_IIR_RDA_INT (2 << 1) /* Receive Data Available */
#define LPC214X_IIR_RLS_INT (3 << 1) /* Receive Line Status */
|