diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2007-05-01 00:28:53 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2007-05-01 00:28:53 +0000 |
commit | 28d607865c3224b7398f9715039bb8d31537ee1c (patch) | |
tree | d5bb69176fb8575824c987127fbe22d9277f9aab /nuttx/arch/arm/src/lpc214x/lpc214x_lowputc.S | |
parent | d120e9e5ed22796147c5bf429dc75eb6359b313b (diff) | |
download | px4-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.S | 113 |
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 |