summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/lpc17xx/lpc17_lowputc.c
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/arch/arm/src/lpc17xx/lpc17_lowputc.c')
-rwxr-xr-xnuttx/arch/arm/src/lpc17xx/lpc17_lowputc.c180
1 files changed, 71 insertions, 109 deletions
diff --git a/nuttx/arch/arm/src/lpc17xx/lpc17_lowputc.c b/nuttx/arch/arm/src/lpc17xx/lpc17_lowputc.c
index f8e76e6e3..e567bc1c2 100755
--- a/nuttx/arch/arm/src/lpc17xx/lpc17_lowputc.c
+++ b/nuttx/arch/arm/src/lpc17xx/lpc17_lowputc.c
@@ -264,7 +264,7 @@ void up_lowputc(char ch)
* console. Its purpose is to get the console output availabe as soon
* as possible.
*
- * The UART0/2/3 peripherals are configured using the following registers:
+ * The UART0/1/2/3 peripherals are configured using the following registers:
* 1. Power: In the PCONP register, set bits PCUART0/1/2/3.
* On reset, UART0 and UART 1 are enabled (PCUART0 = 1 and PCUART1 = 1)
* and UART2/3 are disabled (PCUART1 = 0 and PCUART3 = 0).
@@ -289,142 +289,104 @@ void up_lowputc(char ch)
void lpc17_lowsetup(void)
{
#ifdef HAVE_UART
-
-#if 0
uint32_t regval;
- /* Step 1: Enable power for all selected UARTs */
+ /* Step 1: Enable power for all console UART and disable power for
+ * other UARTs
+ */
- regval = getreg32(LPC17_SYSCON_PCONP);
- regval &= ~(SYSCON_PCONP_PCUART0|SYSCON_PCONP_PCUART1|SYSCON_PCONP_PCUART2|SYSCON_PCONP_PCUART3)
-#ifdef CONFIG_LPC17_UART0
+ regval = getreg32(LPC17_SYSCON_PCONP);
+ regval &= ~(SYSCON_PCONP_PCUART0|SYSCON_PCONP_PCUART1|
+ SYSCON_PCONP_PCUART2|SYSCON_PCONP_PCUART3)
+#if defined(CONFIG_UART0_SERIAL_CONSOLE)
regval |= SYSCON_PCONP_PCUART0;
-#endif
-#ifdef CONFIG_LPC17_UART1
+#elif defined(CONFIG_UART1_SERIAL_CONSOLE)
regval |= SYSCON_PCONP_PCUART1;
-#endif
-#ifdef CONFIG_LPC17_UART2
+#elif defined(CONFIG_UART2_SERIAL_CONSOLE)
regval |= SYSCON_PCONP_PCUART2;
-#endif
-#ifdef CONFIG_LPC17_UART3
+#elif defined(CONFIG_UART3_SERIAL_CONSOLE)
regval |= SYSCON_PCONP_PCUART3;
#endif
putreg32(regval, LPC17_SYSCON_PCONP);
-/* Step 2: Enable peripheral clocking for all selected UARTs */
-
-#define SYSCON_PCLKSET_MASK (3)
-
-#define SYSCON_PCLKSEL0_UART0_SHIFT (6) /* Bits 6-7: Peripheral clock UART0 */
-#define SYSCON_PCLKSEL0_UART0_MASK (3 << SYSCON_PCLKSEL0_UART0_MASK)
-#define SYSCON_PCLKSEL0_UART1_SHIFT (8) /* Bits 8-9: Peripheral clock UART1 */
-#define SYSCON_PCLKSEL0_UART1_MASK (3 << SYSCON_PCLKSEL0_UART1_SHIFT)
-
-
-#define SYSCON_PCLKSEL1_UART2_SHIFT (16) /* Bits 16-17: Peripheral clock UART2 */
-#define SYSCON_PCLKSEL1_UART2_MASK (3 << SYSCON_PCLKSEL1_UART2_SHIFT)
-#define SYSCON_PCLKSEL1_UART3_SHIFT (18) /* Bits 18-19: Peripheral clock UART3 */
-#define SYSCON_PCLKSEL1_UART3_MASK (3 << SYSCON_PCLKSEL1_UART3_SHIFT)
-
- /* Configure UART pins for all selected UARTs */
-
-#define GPIO_UART0_TXD (GPIO_ALT1 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN2)
-#define GPIO_UART0_RXD (GPIO_ALT1 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN3
-
-#define GPIO_UART1_TXD_1 (GPIO_ALT1 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN15)
-#define GPIO_UART1_RXD_1 (GPIO_ALT1 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN16)
-#define GPIO_UART1_CTS_1 (GPIO_ALT1 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN17)
-#define GPIO_UART1_DCD_1 (GPIO_ALT1 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN18)
-#define GPIO_UART1_DSR_1 (GPIO_ALT1 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN19)
-#define GPIO_UART1_DTR_1 (GPIO_ALT1 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN20)
-#define GPIO_UART1_RI_1 (GPIO_ALT1 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN21)
-#define GPIO_UART1_RTS_1 (GPIO_ALT1 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN22)
-
-#define GPIO_UART1_TXD_2 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT2 | GPIO_PIN0)
-#define GPIO_UART1_RXD_2 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT2 | GPIO_PIN1)
-#define GPIO_UART1_CTS_2 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT2 | GPIO_PIN2)
-#define GPIO_UART1_DCD_2 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT2 | GPIO_PIN3)
-#define GPIO_UART1_DSR_2 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT2 | GPIO_PIN4)
-#define GPIO_UART1_DTR_2 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT2 | GPIO_PIN5)
-#define GPIO_UART1_RI_2 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT2 | GPIO_PIN6)
-#define GPIO_UART1_RTS_2 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT2 | GPIO_PIN7)
-
-#define GPIO_UART2_TXD_1 (GPIO_ALT1 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN10)
-#define GPIO_UART2_RXD_1 (GPIO_ALT1 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN11)
-#define GPIO_UART2_TXD_2 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT2 | GPIO_PIN8)
-#define GPIO_UART2_RXD_2 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT2 | GPIO_PIN9)
-
-#define GPIO_UART3_TXD_1 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN0)
-#define GPIO_UART3_RXD_1 (GPIO_ALT2 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN1)
-#define GPIO_UART3_TXD_2 (GPIO_ALT3 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN25)
-#define GPIO_UART3_RXD_2 (GPIO_ALT3 | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN26)
-#define GPIO_UART3_TXD_3 (GPIO_ALT3 | GPIO_PULLUP | GPIO_PORT4 | GPIO_PIN28)
-#define GPIO_UART3_RXD_3 (GPIO_ALT3 | GPIO_PULLUP | GPIO_PORT4 | GPIO_PIN29)
-
-
-#ifdef CONFIG_LPC17_UART0
- (void)lpc17_configgpio(GPIO_UART0_RXD);
- (void)lpc17_configgpio(GPIO_UART0_TXD);
- (void)lpc17_configgpio(GPIO_UART0_CTS);
- (void)lpc17_configgpio(GPIO_UART0_RTS);
-#endif
-#ifdef CONFIG_LPC17_UART1
- (void)lpc17_configgpio(GPIO_UART1_RXD);
- (void)lpc17_configgpio(GPIO_UART1_TXD);
- (void)lpc17_configgpio(GPIO_UART1_CTS);
- (void)lpc17_configgpio(GPIO_UART1_RTS);
-#endif
-#ifdef CONFIG_LPC17_UART2
- (void)lpc17_configgpio(GPIO_UART2_RXD);
- (void)lpc17_configgpio(GPIO_UART2_TXD);
- (void)lpc17_configgpio(GPIO_UART2_CTS);
- (void)lpc17_configgpio(GPIO_UART2_RTS);
-#endif
-#ifdef CONFIG_LPC17_UART3
- (void)lpc17_configgpio(GPIO_UART3_RXD);
- (void)lpc17_configgpio(GPIO_UART3_TXD);
- (void)lpc17_configgpio(GPIO_UART3_CTS);
- (void)lpc17_configgpio(GPIO_UART3_RTS);
-#endif
+/* Step 2: Enable peripheral clocking for the console UART and disable
+ * clocking for all other UARTs
+ */
-#ifdef GPIO_CONSOLE_RXD
+ regval = getreg32(LPC17_SYSCON_PCLKSEL0);
+ regval &= SYSCON_PCLKSEL0_UART1_MASK;
+#if defined(CONFIG_UART0_SERIAL_CONSOLE)
+ regval |= (CONSOLE_CCLKDIV << SYSCON_PCLKSEL0_UART0_SHIFT);
+#elif defined(CONFIG_UART1_SERIAL_CONSOLE)
+ regval |= (CONSOLE_CCLKDIV << SYSCON_PCLKSEL0_UART1_SHIFT);
#endif
-#ifdef GPIO_CONSOLE_TXD
- (void)lpc17_configgpio(GPIO_CONSOLE_TXD);
+ putreg32(regval, LPC17_SYSCON_PCLKSEL0);
+
+ regval = getreg32(LPC17_SYSCON_PCLKSEL1);
+ regval &= SYSCON_PCLKSEL0_UART2_MASK;
+#if defined(CONFIG_UART0_SERIAL_CONSOLE)
+ regval |= (CONSOLE_CCLKDIV << SYSCON_PCLKSEL1_UART2_SHIFT);
+#elif defined(CONFIG_UART1_SERIAL_CONSOLE)
+ regval |= (CONSOLE_CCLKDIV << SYSCON_PCLKSEL1_UART23_SHIFT);
#endif
-#ifdef GPIO_CONSOLE_CTS
- (void)lpc17_configgpio(GPIO_CONSOLE_CTS);
+ putreg32(regval, LPC17_SYSCON_PCLKSEL1);
+
+ /* Configure UART pins for the selected CONSOLE */
+
+#if defined(CONFIG_UART0_SERIAL_CONSOLE)
+ lpc17_configgpio(GPIO_UART0_TXD);
+ lpc17_configgpio(GPIO_UART0_RXD);
+ irqrestore(flags);
+#elif defined(CONFIG_UART1_SERIAL_CONSOLE)
+ lpc17_configgpio(GPIO_UART1_TXD);
+ lpc17_configgpio(GPIO_UART1_RXD);
+#ifdef CONFIG_UART0_FLOWCONTROL
+ lpc17_configgpio(GPIO_UART1_CTS);
+ lpc17_configgpio(GPIO_UART1_DCD);
+ lpc17_configgpio(GPIO_UART1_DSR);
+ lpc17_configgpio(GPIO_UART1_DTR);
+ lpc17_configgpio(GPIO_UART1_RI);
+ lpc17_configgpio(GPIO_UART1_RTS);
#endif
-#ifdef GPIO_CONSOLE_RTS
- (void)lpc17_configgpio(GPIO_CONSOLE_RTS);
+#elif defined(CONFIG_UART2_SERIAL_CONSOLE)
+ lpc17_configgpio(GPIO_UART2_TXD);
+ lpc17_configgpio(GPIO_UART2_RXD);
+ irqrestore(flags);
+#elif defined(CONFIG_UART3_SERIAL_CONSOLE)
+ lpc17_configgpio(GPIO_UART3_TXD);
+ lpc17_configgpio(GPIO_UART3_RXD);
#endif
/* Configure the console (only) */
+
#if defined(HAVE_CONSOLE) && !defined(CONFIG_SUPPRESS_UART_CONFIG)
- /* Reset and disable receiver and transmitter */
- putreg32((UART_CR_RSTRX|UART_CR_RSTTX|UART_CR_RXDIS|UART_CR_TXDIS),
- CONSOLE_BASE+LPC17_UART_CR_OFFSET);
+ /* Clear fifos */
+
+ putreg32(UART_FCR_RXRST|UART_FCR_TXRST, CONSOLE_BASE+LPC17_UART_FCR_OFFSET);
+
+ /* Set trigger */
+
+ putreg32(UART_FCR_FIFOEN|UART_FCR_RXTRIGGER_8, CONSOLE_BASE+LPC17_UART_FCR_OFFSET);
- /* Disable all interrupts */
+ /* Set up the LCR and set DLAB=1*/
- putreg32(0xffffffff, CONSOLE_BASE+LPC17_UART_IDR_OFFSET);
+ putreg32(CONSOLE_LCR_VALUE|UART_LCR_DLAB, CONSOLE_BASE+LPC17_UART_LCR_OFFSET);
- /* Set up the mode register */
+ /* Set the BAUD divisor */
- putreg32(MR_VALUE, CONSOLE_BASE+LPC17_UART_MR_OFFSET);
+ putreg32(CONSOLE_DL >> 8, CONSOLE_BASE+LPC17_UART_DLM_OFFSET);
+ putreg32(CONSOLE_DL & 0xff, CONSOLE_BASE+LPC17_UART_DLL_OFFSET);
- /* Configure the console baud */
+ /* Clear DLAB */
- putreg32(((LPC17_MCK_FREQUENCY + (LPC17_CONSOLE_BAUD << 3))/(LPC17_CONSOLE_BAUD << 4)),
- CONSOLE_BASE+LPC17_UART_BRGR_OFFSET);
+ putreg32(CONSOLE_LCR_VALUE, LPC17_UART_LCR_OFFSET);
- /* Enable receiver & transmitter */
+ /* Configure the FIFOs */
- putreg32((UART_CR_RXEN|UART_CR_TXEN),
- CONSOLE_BASE+LPC17_UART_CR_OFFSET);
+ putreg32(UART_FCR_RXTRIGGER_8|UART_FCR_TXRST|UART_FCR_RXRST|UART_FCR_FIFOEN,
+ CONSOLE_BASE+LPC17_UART_FCR_OFFSET);
#endif
-#endif /* 0 */
#endif /* HAVE_UART */
}