From 108b7be44fd1d31e43bdd1ff0416f8b8f63901f5 Mon Sep 17 00:00:00 2001 From: patacongo Date: Sat, 26 Jan 2008 14:35:25 +0000 Subject: [PATCH] Fix a16f serial bugs git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@568 42af7a65-404d-4744-a932-0658087f49c3 --- arch/z16/src/z16f/z16f_head.S | 2 +- arch/z16/src/z16f/z16f_lowuart.S | 28 ++++++++++++------------- arch/z16/src/z16f/z16f_serial.c | 35 ++++++++++++++------------------ 3 files changed, 30 insertions(+), 35 deletions(-) diff --git a/arch/z16/src/z16f/z16f_head.S b/arch/z16/src/z16f/z16f_head.S index 2a1871aae5..f9cdf745c9 100755 --- a/arch/z16/src/z16f/z16f_head.S +++ b/arch/z16/src/z16f/z16f_head.S @@ -149,7 +149,7 @@ _z16f_reset: #endif /* Perform VERY early UART initialization so that we can use it here */ -#if defined(CONFIG_ARCH_LOWPUTC) || defined(CONFIG_ARCH_LOWGETC) +#if defined(CONFIG_ARCH_LOWPUTC) || defined(CONFIG_ARCH_LOWGETC) || CONFIG_NFILE_DESCRIPTORS == 0 call _z16f_lowuartinit /* Initialize the UART for debugging */ #endif /* Initialize the hardware stack overflow register */ diff --git a/arch/z16/src/z16f/z16f_lowuart.S b/arch/z16/src/z16f/z16f_lowuart.S index 037b3dd803..5e45e8c53e 100755 --- a/arch/z16/src/z16f/z16f_lowuart.S +++ b/arch/z16/src/z16f/z16f_lowuart.S @@ -41,7 +41,7 @@ #include #include "chip/chip.h" -#if defined(CONFIG_ARCH_LOWPUTC) || defined(CONFIG_ARCH_LOWGETC) +#if defined(CONFIG_ARCH_LOWPUTC) || defined(CONFIG_ARCH_LOWGETC) || CONFIG_NFILE_DESCRIPTORS == 0 /************************************************************************* * External References / External Definitions @@ -96,19 +96,6 @@ _z16f_lowuartinit: udiv r0, r3 /* BRG = (freq + baud * 8)/(baud * 16) */ #ifdef CONFIG_UART0_SERIAL_CONSOLE - ld.w Z16F_UART0_BR, r0 /* Z16F_UART0_BR = BRG */ - - /* Set the GPIO Alternate Function Register Lo (AFL) register */ - - ld r0, #%30 - or.b Z16F_GPIOA_AFL, r0 /* Z16F_GPIOA_AFL |= %30 */ - - /* Enable UART receive (REN) and transmit (TEN) */ - - clr.b Z16F_UART0_CTL1 /* Z16F_UART0_CTL1 = 0 */ - ld r0, #(Z16F_UARTCTL0_TEN|Z16F_UARTCTL0_REN) - ld.b Z16F_UART0_CTL0, r0 /* Z16F_UART0_CTL0 = %c0 */ -#else ld.w Z16F_UART1_BR, r0 /* Z16F_UART1_BR = BRG */ /* Set the GPIO Alternate Function Register Lo (AFL) register */ @@ -121,6 +108,19 @@ _z16f_lowuartinit: clr.b Z16F_UART1_CTL1 /* Z16F_UART1_CTL1 = 0 */ ld r0, #(Z16F_UARTCTL0_TEN|Z16F_UARTCTL0_REN) ld.b Z16F_UART1_CTL0, r0 /* Z16F_UART1_CTL0 = %c0 */ +#else + ld.w Z16F_UART0_BR, r0 /* Z16F_UART0_BR = BRG */ + + /* Set the GPIO Alternate Function Register Lo (AFL) register */ + + ld r0, #%30 + or.b Z16F_GPIOA_AFL, r0 /* Z16F_GPIOA_AFL |= %30 */ + + /* Enable UART receive (REN) and transmit (TEN) */ + + clr.b Z16F_UART0_CTL1 /* Z16F_UART0_CTL1 = 0 */ + ld r0, #(Z16F_UARTCTL0_TEN|Z16F_UARTCTL0_REN) + ld.b Z16F_UART0_CTL0, r0 /* Z16F_UART0_CTL0 = %c0 */ #endif popmlo /* Restore registers */ ret /* Return */ diff --git a/arch/z16/src/z16f/z16f_serial.c b/arch/z16/src/z16f/z16f_serial.c index 1ca6e03777..d63c6e5dd9 100644 --- a/arch/z16/src/z16f/z16f_serial.c +++ b/arch/z16/src/z16f/z16f_serial.c @@ -649,39 +649,35 @@ int up_putc(int ch) ****************************************************************************/ #ifdef CONFIG_UART1_SERIAL_CONSOLE -# define z16f_contrde() \ - do { \ - int tmp; \ - for (tmp = 1000 ; tmp > 0 ; tmp--) \ - if ((getreg8(Z16F_UART1_STAT0) & Z16F_UARTSTAT0_TDRE) != 0) \ - break; \ - } while (0) +# define z16f_contrde() \ + ((getreg8(Z16F_UART1_STAT0) & Z16F_UARTSTAT0_TDRE) != 0) # define z16f_contxd(ch) \ - putreg8((ubyte)(ch), Z16F_UART1_STAT0) + putreg8((ubyte)(ch), Z16F_UART1_TXD) #else -# define z16f_contrde() \ - do { \ - int tmp; \ - for (tmp = 1000 ; tmp > 0 ; tmp--) \ - if ((getreg8(Z16F_UART0_STAT0) & Z16F_UARTSTAT0_TDRE) != 0) \ - break; \ - } while (0) +# define z16f_contrde() \ + ((getreg8(Z16F_UART0_STAT0) & Z16F_UARTSTAT0_TDRE) != 0) # define z16f_contxd(ch) \ - putreg8((ubyte)(ch), Z16F_UART0_STAT0) + putreg8((ubyte)(ch), Z16F_UART0_TXD) #endif /**************************************************************************** * Private Functions ****************************************************************************/ +static void _up_putc(int ch) +{ + int tmp; + for (tmp = 1000 ; tmp > 0 && !z16f_contrde(); tmp--); + z16f_contxd(ch); +} + /**************************************************************************** * Public Functions ****************************************************************************/ int up_putc(int ch) { - z16f_contrde(); - z16f_contxd(ch); + _up_putc(ch); /* Check for LF */ @@ -689,8 +685,7 @@ int up_putc(int ch) { /* Add CR */ - z16f_contrde(); - z16f_contxd('\r'); + _up_putc('\r'); } return ch;