Merge branch 'master' of git://git.denx.de/u-boot-arm
[oweals/u-boot.git] / cpu / arm720t / serial.c
index 5c6a0cc555d7319304b0827cbcddfe48448ffbb2..54a9b3137bd2c8ef2160e7fb1d479966116970bc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2002
+ * (C) Copyright 2002-2004
  * Wolfgang Denk, DENX Software Engineering, <wd@denx.de>
  *
  * (C) Copyright 2002
  */
 
 #include <common.h>
+
+#if defined(CONFIG_IMPA7) || defined(CONFIG_EP7312) || defined(CONFIG_ARMADILLO)
+
 #include <clps7111.h>
 
-#ifndef CONFIG_NETARM
+DECLARE_GLOBAL_DATA_PTR;
 
 void serial_setbrg (void)
 {
-       DECLARE_GLOBAL_DATA_PTR;
-
        unsigned int reg = 0;
 
-       if (gd->baudrate == 1200)
-               reg = 191;
-       else if (gd->baudrate == 9600)
-               reg = 23;
-       else if (gd->baudrate == 19200)
-               reg = 11;
-       else if (gd->baudrate == 38400)
-               reg = 5;
-       else if (gd->baudrate == 57600)
-               reg = 3;
-       else if (gd->baudrate == 115200)
-               reg = 1;
-       else
-               hang ();
+       switch (gd->baudrate) {
+       case   1200:    reg = 191;      break;
+       case   9600:    reg =  23;      break;
+       case  19200:    reg =  11;      break;
+       case  38400:    reg =   5;      break;
+       case  57600:    reg =   3;      break;
+       case 115200:    reg =   1;      break;
+       default:        hang ();        break;
+       }
 
        /* init serial serial 1,2 */
        IO_SYSCON1 = SYSCON1_UART1EN;
@@ -89,7 +85,7 @@ void serial_putc (const char c)
        if (c == '\n')
                serial_putc ('\r');
 
-       tmo = get_timer (0) + 1 * CFG_HZ;
+       tmo = get_timer (0) + 1 * CONFIG_SYS_HZ;
        while (IO_SYSFLG1 & SYSFLG1_UTXFF)
                if (get_timer (0) > tmo)
                        break;
@@ -127,4 +123,80 @@ serial_puts (const char *s)
        }
 }
 
-#endif /* CONFIG_NETARM */
+#elif defined(CONFIG_LPC2292)
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#include <asm/arch/hardware.h>
+
+void serial_setbrg (void)
+{
+       unsigned short divisor = 0;
+
+       switch (gd->baudrate) {
+       case   1200:    divisor = 3072; break;
+       case   9600:    divisor =  384; break;
+       case  19200:    divisor =  192; break;
+       case  38400:    divisor =   96; break;
+       case  57600:    divisor =   64; break;
+       case 115200:    divisor =   32; break;
+       default:        hang ();        break;
+       }
+
+       /* init serial UART0 */
+       PUT8(U0LCR, 0);
+       PUT8(U0IER, 0);
+       PUT8(U0LCR, 0x80);      /* DLAB=1 */
+       PUT8(U0DLL, (unsigned char)(divisor & 0x00FF));
+       PUT8(U0DLM, (unsigned char)(divisor >> 8));
+       PUT8(U0LCR, 0x03);      /* 8N1, DLAB=0  */
+       PUT8(U0FCR, 1);         /* Enable RX and TX FIFOs */
+}
+
+int serial_init (void)
+{
+       unsigned long pinsel0;
+
+       serial_setbrg ();
+
+       pinsel0 = GET32(PINSEL0);
+       pinsel0 &= ~(0x00000003);
+       pinsel0 |= 5;
+       PUT32(PINSEL0, pinsel0);
+
+       return (0);
+}
+
+void serial_putc (const char c)
+{
+       if (c == '\n')
+       {
+               while((GET8(U0LSR) & (1<<5)) == 0); /* Wait for empty U0THR */
+               PUT8(U0THR, '\r');
+       }
+
+       while((GET8(U0LSR) & (1<<5)) == 0); /* Wait for empty U0THR */
+       PUT8(U0THR, c);
+}
+
+int serial_getc (void)
+{
+       while((GET8(U0LSR) & 1) == 0);
+       return GET8(U0RBR);
+}
+
+void
+serial_puts (const char *s)
+{
+       while (*s) {
+               serial_putc (*s++);
+       }
+}
+
+/* Test if there is a byte to read */
+int serial_tstc (void)
+{
+       return (GET8(U0LSR) & 1);
+}
+
+#endif