]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * | |
3 | * BRIEF MODULE DESCRIPTION | |
4 | * Low level uart routines to directly access a 16550 uart. | |
5 | * | |
6 | * Copyright 2001 MontaVista Software Inc. | |
7 | * Author: MontaVista Software, Inc. | |
8 | * ppopov@mvista.com or source@mvista.com | |
9 | * | |
10 | * This program is free software; you can redistribute it and/or modify it | |
11 | * under the terms of the GNU General Public License as published by the | |
12 | * Free Software Foundation; either version 2 of the License, or (at your | |
13 | * option) any later version. | |
14 | * | |
15 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | |
16 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
17 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | |
18 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | |
19 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | |
20 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |
21 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
22 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
23 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |
24 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
25 | * | |
26 | * You should have received a copy of the GNU General Public License along | |
27 | * with this program; if not, write to the Free Software Foundation, Inc., | |
28 | * 675 Mass Ave, Cambridge, MA 02139, USA. | |
29 | */ | |
30 | ||
31 | #include <linux/types.h> | |
32 | #include <asm/mach-au1x00/au1000.h> | |
33 | ||
34 | #define SERIAL_BASE UART_BASE | |
35 | #define SER_CMD 0x7 | |
36 | #define SER_DATA 0x1 | |
37 | #define TX_BUSY 0x20 | |
38 | ||
39 | #define TIMEOUT 0xffffff | |
40 | #define SLOW_DOWN | |
41 | ||
42 | static const char digits[16] = "0123456789abcdef"; | |
43 | static volatile unsigned long * const com1 = (unsigned long *)SERIAL_BASE; | |
44 | ||
45 | ||
46 | #ifdef SLOW_DOWN | |
47 | static inline void slow_down(void) | |
48 | { | |
49 | int k; | |
50 | for (k=0; k<10000; k++); | |
51 | } | |
52 | #else | |
53 | #define slow_down() | |
54 | #endif | |
55 | ||
56 | void | |
57 | putch(const unsigned char c) | |
58 | { | |
59 | unsigned char ch; | |
60 | int i = 0; | |
61 | ||
62 | do { | |
63 | ch = com1[SER_CMD]; | |
64 | slow_down(); | |
65 | i++; | |
66 | if (i>TIMEOUT) { | |
67 | break; | |
68 | } | |
69 | } while (0 == (ch & TX_BUSY)); | |
70 | com1[SER_DATA] = c; | |
71 | } | |
72 | ||
73 | void | |
74 | puts(unsigned char *cp) | |
75 | { | |
76 | unsigned char ch; | |
77 | int i = 0; | |
78 | ||
79 | while (*cp) { | |
80 | do { | |
81 | ch = com1[SER_CMD]; | |
82 | slow_down(); | |
83 | i++; | |
84 | if (i>TIMEOUT) { | |
85 | break; | |
86 | } | |
87 | } while (0 == (ch & TX_BUSY)); | |
88 | com1[SER_DATA] = *cp++; | |
89 | } | |
90 | putch('\r'); | |
91 | putch('\n'); | |
92 | } | |
93 | ||
94 | void | |
95 | fputs(const char *cp) | |
96 | { | |
97 | unsigned char ch; | |
98 | int i = 0; | |
99 | ||
100 | while (*cp) { | |
101 | ||
102 | do { | |
103 | ch = com1[SER_CMD]; | |
104 | slow_down(); | |
105 | i++; | |
106 | if (i>TIMEOUT) { | |
107 | break; | |
108 | } | |
109 | } while (0 == (ch & TX_BUSY)); | |
110 | com1[SER_DATA] = *cp++; | |
111 | } | |
112 | } | |
113 | ||
114 | ||
115 | void | |
116 | put64(uint64_t ul) | |
117 | { | |
118 | int cnt; | |
119 | unsigned ch; | |
120 | ||
121 | cnt = 16; /* 16 nibbles in a 64 bit long */ | |
122 | putch('0'); | |
123 | putch('x'); | |
124 | do { | |
125 | cnt--; | |
126 | ch = (unsigned char)(ul >> cnt * 4) & 0x0F; | |
127 | putch(digits[ch]); | |
128 | } while (cnt > 0); | |
129 | } | |
130 | ||
131 | void | |
132 | put32(unsigned u) | |
133 | { | |
134 | int cnt; | |
135 | unsigned ch; | |
136 | ||
137 | cnt = 8; /* 8 nibbles in a 32 bit long */ | |
138 | putch('0'); | |
139 | putch('x'); | |
140 | do { | |
141 | cnt--; | |
142 | ch = (unsigned char)(u >> cnt * 4) & 0x0F; | |
143 | putch(digits[ch]); | |
144 | } while (cnt > 0); | |
145 | } |