1 /* $NetBSD: com.c,v 1.1 2011/03/03 05:59:37 kiyohara Exp $ */
2
3 /*-
4 * Copyright (c) 2008 Izumi Tsutsui. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN 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 USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * 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 /*-
27 * Copyright (c) 1993, 1994, 1995, 1996, 1997
28 * Charles M. Hannum. All rights reserved.
29 *
30 * Interrupt processing and hardware flow control partly based on code from
31 * Onno van der Linden and Gordon Ross.
32 *
33 * Redistribution and use in source and binary forms, with or without
34 * modification, are permitted provided that the following conditions
35 * are met:
36 * 1. Redistributions of source code must retain the above copyright
37 * notice, this list of conditions and the following disclaimer.
38 * 2. Redistributions in binary form must reproduce the above copyright
39 * notice, this list of conditions and the following disclaimer in the
40 * documentation and/or other materials provided with the distribution.
41 * 3. All advertising materials mentioning features or use of this software
42 * must display the following acknowledgement:
43 * This product includes software developed by Charles M. Hannum.
44 * 4. The name of the author may not be used to endorse or promote products
45 * derived from this software without specific prior written permission.
46 *
47 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
48 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
49 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
50 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
51 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
52 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
53 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
54 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
55 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
56 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
57 */
58
59 /*
60 * Copyright (c) 1991 The Regents of the University of California.
61 * All rights reserved.
62 *
63 * Redistribution and use in source and binary forms, with or without
64 * modification, are permitted provided that the following conditions
65 * are met:
66 * 1. Redistributions of source code must retain the above copyright
67 * notice, this list of conditions and the following disclaimer.
68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in the
70 * documentation and/or other materials provided with the distribution.
71 * 3. Neither the name of the University nor the names of its contributors
72 * may be used to endorse or promote products derived from this software
73 * without specific prior written permission.
74 *
75 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
76 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
77 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
78 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
79 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
80 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
81 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
82 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
83 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
84 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
85 * SUCH DAMAGE.
86 *
87 * @(#)com.c 7.5 (Berkeley) 5/16/91
88 */
89
90 #ifdef CONS_COM
91
92 #include <lib/libsa/stand.h>
93 #include <lib/libkern/libkern.h>
94
95 #include <dev/ic/comreg.h>
96
97 #include <machine/cpu.h>
98
99 #include "boot.h"
100 #include "ns16550.h"
101
102 #define CSR_READ(base, reg) (*(volatile uint8_t *)((base) + (reg)))
103 #define CSR_WRITE(base, reg, val) \
104 do { \
105 *(volatile uint8_t *)((base) + (reg)) = (val); \
106 } while (/* CONSTCOND */ 0)
107
108 #define COM_FREQ 1843200 /* 16-bit baud rate divisor */
109 #define COM_TOLERANCE 30 /* baud rate tolerance, in 0.1% units */
110
111 static int comspeed(long);
112
113 static int
comspeed(long speed)114 comspeed(long speed)
115 {
116 #define divrnd(n, q) (((n)*2/(q)+1)/2) /* divide and round off */
117
118 int x, err;
119 long frequency = COM_FREQ * 10;
120
121 if (speed <= 0)
122 return -1;
123 x = divrnd((frequency / 16), speed);
124 if (x <= 0)
125 return -1;
126 err = divrnd(((quad_t)frequency) * 1000 / 16, speed * x) - 1000;
127 if (err < 0)
128 err = -err;
129 if (err > COM_TOLERANCE)
130 return -1;
131 return x;
132
133 #undef divrnd
134 }
135
136 void *
com_init(int addr,int speed)137 com_init(int addr, int speed)
138 {
139 uint8_t *com_port;
140
141 com_port = (void *)addr;
142
143 CSR_WRITE(com_port, com_lctl, LCR_DLAB);
144 speed = comspeed(speed);
145 CSR_WRITE(com_port, com_dlbl, speed);
146 CSR_WRITE(com_port, com_dlbh, speed >> 8);
147
148 CSR_WRITE(com_port, com_lctl, LCR_PNONE | LCR_8BITS);
149 CSR_WRITE(com_port, com_mcr, MCR_RTS | MCR_DTR);
150 CSR_WRITE(com_port, com_fifo,
151 FIFO_XMT_RST | FIFO_RCV_RST | FIFO_ENABLE);
152 CSR_WRITE(com_port, com_ier, 0);
153
154 return com_port;
155 }
156
157 void
com_putc(void * dev,int c)158 com_putc(void *dev, int c)
159 {
160 volatile uint8_t *com_port = dev;
161
162 while ((CSR_READ(com_port, com_lsr) & LSR_TXRDY) == 0)
163 ;
164
165 CSR_WRITE(com_port, com_data, c);
166 }
167
168 int
com_getc(void * dev)169 com_getc(void *dev)
170 {
171 volatile uint8_t *com_port = dev;
172
173 while ((CSR_READ(com_port, com_lsr) & LSR_RXRDY) == 0)
174 ;
175
176 return CSR_READ(com_port, com_data);
177 }
178
179 int
com_scankbd(void * dev)180 com_scankbd(void *dev)
181 {
182 volatile uint8_t *com_port = dev;
183
184 if ((CSR_READ(com_port, com_lsr) & LSR_RXRDY) == 0)
185 return -1;
186
187 return CSR_READ(com_port, com_data);
188 }
189 #endif /* CONS_SERIAL */
190