summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/lpc214x/lpc214x_lowputc.S
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-05-01 00:28:53 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-05-01 00:28:53 +0000
commit28d607865c3224b7398f9715039bb8d31537ee1c (patch)
treed5bb69176fb8575824c987127fbe22d9277f9aab /nuttx/arch/arm/src/lpc214x/lpc214x_lowputc.S
parentd120e9e5ed22796147c5bf429dc75eb6359b313b (diff)
downloadpx4-nuttx-28d607865c3224b7398f9715039bb8d31537ee1c.tar.gz
px4-nuttx-28d607865c3224b7398f9715039bb8d31537ee1c.tar.bz2
px4-nuttx-28d607865c3224b7398f9715039bb8d31537ee1c.zip
Low level UART support
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@196 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/arm/src/lpc214x/lpc214x_lowputc.S')
-rw-r--r--nuttx/arch/arm/src/lpc214x/lpc214x_lowputc.S113
1 files changed, 112 insertions, 1 deletions
diff --git a/nuttx/arch/arm/src/lpc214x/lpc214x_lowputc.S b/nuttx/arch/arm/src/lpc214x/lpc214x_lowputc.S
index 8096ed3e9..bd9a86d0b 100644
--- a/nuttx/arch/arm/src/lpc214x/lpc214x_lowputc.S
+++ b/nuttx/arch/arm/src/lpc214x/lpc214x_lowputc.S
@@ -40,11 +40,70 @@
#include <nuttx/config.h>
#include "up_internal.h"
#include "up_arch.h"
+#include "lpc214x_uart.h"
/**************************************************************************
* Private Definitions
**************************************************************************/
+#if defined(CONFIG_UART0_SERIAL_CONSOLE)
+# define LPC214X_UART_BASE LPC214X_UART0_BASE
+# define LPC214X_UART_PINSEL LPC214X_UART0_PINSEL
+# define LPC214X_UART_PINMASK LPC214X_UART0_PINMASK
+# define LPC214X_UART_BAUD CONFIG_UART0_BAUD
+# define LPC214X_UART_BITS CONFIG_UART0_BITS
+# define LPC214X_UART_PARITY CONFIG_UART0_PARITY
+# ifdef CONFIG_UART0_2STOP
+# define LPC214X_UART_2STOP 1
+# endif
+#elif defined(CONFIG_UART1_SERIAL_CONSOLE)
+# define LPC214X_UART_BASE LPC214X_UART1_BASE
+# define LPC214X_UART_PINSEL LPC214X_UART1_PINSEL
+# define LPC214X_UART_PINMASK LPC214X_UART1_PINMASK
+# define LPC214X_UART_BAUD CONFIG_UART1_BAUD
+# define LPC214X_UART_BITS CONFIG_UART1_BITS
+# define LPC214X_UART_PARITY CONFIG_UART1_PARITY
+# ifdef CONFIG_UART1_2STOP
+# define LPC214X_UART_2STOP 1
+# endif
+#else
+# error "No CONFIG_UARTn_SERIAL_CONSOLE Setting"
+#endif
+
+#if LPC214X_UART_BITS == 5
+# define LPC214X_LCR_CHAR LPC214X_LCR_CHAR_5
+#elif LPC214X_UART_BITS == 6
+# define LPC214X_LCR_CHAR LPC214X_LCR_CHAR_6
+#elif LPC214X_UART_BITS == 7
+# define LPC214X_LCR_CHAR LPC214X_LCR_CHAR_7
+#elif LPC214X_UART_BITS == 8
+# define LPC214X_LCR_CHAR LPC214X_LCR_CHAR_8
+#else
+# error "No CONFIG_UARTn_BITS Setting"
+#endif
+
+#if LPC214X_UART_PARITY == 0
+# define LPC214X_LCR_PAR LPC214X_LCR_PAR_NONE
+#elif LPC214X_UART_PARITY == 1
+# define LPC214X_LCR_PAR LPC214X_LCR_PAR_ODD
+#elif LPC214X_UART_PARITY == 2
+# define LPC214X_LCR_PAR LPC214X_LCR_PAR_EVEN
+#elif LPC214X_UART_PARITY == 3
+# define LPC214X_LCR_PAR LPC214X_LCR_PAR_MARK
+#elif LPC214X_UART_PARITY == 4
+# define LPC214X_LCR_PAR LPC214X_LCR_PAR_SPACE
+#else
+# error "No CONFIG_UARTn_PARITY Setting"
+#endif
+
+#ifdef LPC214X_UART_2STOP
+# define LPC214X_LCR_STOP LPC214X_LCR_STOP_2
+#else
+# define LPC214X_LCR_STOP LPC214X_LCR_STOP_1
+#endif
+
+#define LPC214X_LCR_VALUE (LPC214X_LCR_CHAR | LPC214X_LCR_PAR | LPC214X_LCR_STOP)
+
/**************************************************************************
* Private Types
**************************************************************************/
@@ -83,9 +142,61 @@
.type up_lowputc, function
up_lowputc:
/* On entry, r0 holds the character to be printed */
-#warning "Not implemented"
+
+ ldr r1, =LPC214X_UART_BASE
+ strb r0, [r1, #LPC214X_THR_OFFSET]
+
+ /* Wait for the byte to be transferred */
+
+1: ldr r0, [r1, #LPC214X_LSR_OFFSET]
+ ands r0, #LPC214X_LSR_TEMT /* Transmitter empty */
+ beq 1b
/* And return */
mov pc, lr
+ .size up_lowputc, . - up_lowputc
+
+/* This performs basic initialization of the UART. This can be called very
+ * early in initialization because it does not depend on having a stack. It
+ * modifies r0-r2 and r14.
+ */
+
+ .text
+ .globl up_lowsetup
+ .type up_lowsetup, function
+up_lowsetup:
+ /* Configure PINSEL0 */
+
+ ldr r0, =LPC214X_PINSEL0
+ ldr r1, [r0]
+ ldr r2, =LPC214X_UART_PINMASK
+ and r1, r2
+ ldr r2, =LPC214X_UART_PINSEL
+ orr r1, r2
+ str r1, [r0]
+
+ /* Configure parity, data bits, stop bits and set DLAB=1 */
+
+ ldr r0, =LPC214X_UART0_BASE
+ mov r1, #(LPC214X_LCR_VALUE | LPC214X_LCR_DLAB_ENABLE)
+ strb r1, [r0, #LPC214X_LCR_OFFSET]
+
+ /* Set the BAUD divisor */
+
+ mov r1, #(UART_BAUD(LPC214X_UART_BAUD) >> 8)
+ strb r1, [r0, #LPC214X_DLM_OFFSET]
+
+ mov r1, #(UART_BAUD(LPC214X_UART_BAUD) & 0xff)
+ strb r1, [r0, #LPC214X_DLL_OFFSET]
+
+ /* Clear DLAB */
+
+ mov r1, #LPC214X_LCR_VALUE
+ strb r1, [r0, #LPC214X_LCR_OFFSET]
+
+ /* And return */
+
+ mov pc, lr
+ .size up_lowsetup, . - up_lowsetup
.end