]> git.karo-electronics.de Git - karo-tx-uboot.git/blob - cpu/arm720t/serial.c
* Patch by Thomas Elste, 10 Feb 2004:
[karo-tx-uboot.git] / cpu / arm720t / serial.c
1 /*
2  * (C) Copyright 2002
3  * Wolfgang Denk, DENX Software Engineering, <wd@denx.de>
4  *
5  * (C) Copyright 2002
6  * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
7  * Marius Groeger <mgroeger@sysgo.de>
8  *
9  * (C) Copyright 2002
10  * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
11  * Alex Zuepke <azu@sysgo.de>
12  *
13  * Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl)
14  *
15  * This program is free software; you can redistribute it and/or modify
16  * it under the terms of the GNU General Public License as published by
17  * the Free Software Foundation; either version 2 of the License, or
18  * (at your option) any later version.
19  *
20  * This program is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with this program; if not, write to the Free Software
27  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
28  *
29  */
30
31 #include <common.h>
32 #include <clps7111.h>
33
34 #ifndef CONFIG_NETARM
35
36 void serial_setbrg (void)
37 {
38         DECLARE_GLOBAL_DATA_PTR;
39
40         unsigned int reg = 0;
41
42         if (gd->baudrate == 1200)
43                 reg = 191;
44         else if (gd->baudrate == 9600)
45                 reg = 23;
46         else if (gd->baudrate == 19200)
47                 reg = 11;
48         else if (gd->baudrate == 38400)
49                 reg = 5;
50         else if (gd->baudrate == 57600)
51                 reg = 3;
52         else if (gd->baudrate == 115200)
53                 reg = 1;
54         else
55                 hang ();
56
57         /* init serial serial 1,2 */
58         IO_SYSCON1 = SYSCON1_UART1EN;
59         IO_SYSCON2 = SYSCON2_UART2EN;
60
61         reg |= UBRLCR_WRDLEN8;
62
63         IO_UBRLCR1 = reg;
64         IO_UBRLCR2 = reg;
65 }
66
67
68 /*
69  * Initialise the serial port with the given baudrate. The settings
70  * are always 8 data bits, no parity, 1 stop bit, no start bits.
71  *
72  */
73 int serial_init (void)
74 {
75         serial_setbrg ();
76
77         return (0);
78 }
79
80
81 /*
82  * Output a single byte to the serial port.
83  */
84 void serial_putc (const char c)
85 {
86         int tmo;
87
88         /* If \n, also do \r */
89         if (c == '\n')
90                 serial_putc ('\r');
91
92         tmo = get_timer (0) + 1 * CFG_HZ;
93         while (IO_SYSFLG1 & SYSFLG1_UTXFF)
94                 if (get_timer (0) > tmo)
95                         break;
96
97         IO_UARTDR1 = c;
98 }
99
100 /*
101  * Read a single byte from the serial port. Returns 1 on success, 0
102  * otherwise. When the function is succesfull, the character read is
103  * written into its argument c.
104  */
105 int serial_tstc (void)
106 {
107         return !(IO_SYSFLG1 & SYSFLG1_URXFE);
108 }
109
110 /*
111  * Read a single byte from the serial port. Returns 1 on success, 0
112  * otherwise. When the function is succesfull, the character read is
113  * written into its argument c.
114  */
115 int serial_getc (void)
116 {
117         while (IO_SYSFLG1 & SYSFLG1_URXFE);
118
119         return IO_UARTDR1 & 0xff;
120 }
121
122 void
123 serial_puts (const char *s)
124 {
125         while (*s) {
126                 serial_putc (*s++);
127         }
128 }
129
130 #endif /* CONFIG_NETARM */