cons.c revision 1.10 1 1.10 kiyohara /* $NetBSD: cons.c,v 1.10 2008/06/07 03:56:20 kiyohara Exp $ */
2 1.1 sakamoto
3 1.1 sakamoto /*
4 1.1 sakamoto * Copyright (c) 1990, 1993
5 1.1 sakamoto * The Regents of the University of California. All rights reserved.
6 1.6 agc *
7 1.6 agc * This code is derived from software contributed to Berkeley by
8 1.6 agc * the Systems Programming Group of the University of Utah Computer
9 1.6 agc * Science Department.
10 1.6 agc *
11 1.6 agc * Redistribution and use in source and binary forms, with or without
12 1.6 agc * modification, are permitted provided that the following conditions
13 1.6 agc * are met:
14 1.6 agc * 1. Redistributions of source code must retain the above copyright
15 1.6 agc * notice, this list of conditions and the following disclaimer.
16 1.6 agc * 2. Redistributions in binary form must reproduce the above copyright
17 1.6 agc * notice, this list of conditions and the following disclaimer in the
18 1.6 agc * documentation and/or other materials provided with the distribution.
19 1.6 agc * 3. Neither the name of the University nor the names of its contributors
20 1.6 agc * may be used to endorse or promote products derived from this software
21 1.6 agc * without specific prior written permission.
22 1.6 agc *
23 1.6 agc * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 1.6 agc * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 1.6 agc * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 1.6 agc * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 1.6 agc * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 1.6 agc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 1.6 agc * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 1.6 agc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 1.6 agc * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 1.6 agc * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 1.6 agc * SUCH DAMAGE.
34 1.6 agc *
35 1.6 agc * from: Utah Hdr: cons.c 1.7 92/02/28
36 1.6 agc *
37 1.6 agc * @(#)cons.c 8.1 (Berkeley) 6/10/93
38 1.6 agc */
39 1.6 agc /*
40 1.6 agc * Copyright (c) 1988 University of Utah.
41 1.1 sakamoto *
42 1.1 sakamoto * This code is derived from software contributed to Berkeley by
43 1.1 sakamoto * the Systems Programming Group of the University of Utah Computer
44 1.1 sakamoto * Science Department.
45 1.1 sakamoto *
46 1.1 sakamoto * Redistribution and use in source and binary forms, with or without
47 1.1 sakamoto * modification, are permitted provided that the following conditions
48 1.1 sakamoto * are met:
49 1.1 sakamoto * 1. Redistributions of source code must retain the above copyright
50 1.1 sakamoto * notice, this list of conditions and the following disclaimer.
51 1.1 sakamoto * 2. Redistributions in binary form must reproduce the above copyright
52 1.1 sakamoto * notice, this list of conditions and the following disclaimer in the
53 1.1 sakamoto * documentation and/or other materials provided with the distribution.
54 1.1 sakamoto * 3. All advertising materials mentioning features or use of this software
55 1.1 sakamoto * must display the following acknowledgement:
56 1.1 sakamoto * This product includes software developed by the University of
57 1.1 sakamoto * California, Berkeley and its contributors.
58 1.1 sakamoto * 4. Neither the name of the University nor the names of its contributors
59 1.1 sakamoto * may be used to endorse or promote products derived from this software
60 1.1 sakamoto * without specific prior written permission.
61 1.1 sakamoto *
62 1.1 sakamoto * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
63 1.1 sakamoto * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
64 1.1 sakamoto * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
65 1.1 sakamoto * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
66 1.1 sakamoto * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
67 1.1 sakamoto * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
68 1.1 sakamoto * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
69 1.1 sakamoto * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
70 1.1 sakamoto * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
71 1.1 sakamoto * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
72 1.1 sakamoto * SUCH DAMAGE.
73 1.1 sakamoto *
74 1.1 sakamoto * from: Utah Hdr: cons.c 1.7 92/02/28
75 1.1 sakamoto *
76 1.1 sakamoto * @(#)cons.c 8.1 (Berkeley) 6/10/93
77 1.1 sakamoto */
78 1.1 sakamoto
79 1.9 kiyohara #include <lib/libsa/stand.h>
80 1.1 sakamoto #include <sys/param.h>
81 1.5 sakamoto #include "boot.h"
82 1.1 sakamoto #include "cons.h"
83 1.1 sakamoto
84 1.2 sakamoto #ifdef CONS_BE
85 1.9 kiyohara void becnprobe(struct consdev *);
86 1.9 kiyohara void becninit(struct consdev *);
87 1.9 kiyohara void becnputchar(void *, register int);
88 1.9 kiyohara int becngetchar(void *);
89 1.9 kiyohara int becnscan(void *);
90 1.2 sakamoto #endif
91 1.2 sakamoto
92 1.2 sakamoto #ifdef CONS_VGA
93 1.9 kiyohara void vgacnprobe(struct consdev *);
94 1.9 kiyohara void vgacninit(struct consdev *);
95 1.9 kiyohara void vgacnputchar(void *, register int);
96 1.9 kiyohara int vgacngetchar(void *);
97 1.9 kiyohara int vgacnscan(void *);
98 1.2 sakamoto #endif
99 1.2 sakamoto
100 1.2 sakamoto #ifdef CONS_SERIAL
101 1.9 kiyohara void siocnprobe(struct consdev *);
102 1.9 kiyohara void siocninit(struct consdev *);
103 1.9 kiyohara void siocnputchar(void *, register int);
104 1.9 kiyohara int siocngetchar(void *);
105 1.9 kiyohara int siocnscan(void *);
106 1.4 sakamoto # include "ns16550.h"
107 1.4 sakamoto # ifndef COMPORT
108 1.4 sakamoto # define COMPORT COM1
109 1.4 sakamoto # endif
110 1.4 sakamoto # ifndef COMSPEED
111 1.4 sakamoto # define COMSPEED 9600
112 1.4 sakamoto # endif
113 1.2 sakamoto #endif
114 1.1 sakamoto
115 1.1 sakamoto struct consdev constab[] = {
116 1.2 sakamoto #ifdef CONS_BE
117 1.4 sakamoto { "be", 0xd0000000, 0,
118 1.5 sakamoto becnprobe, becninit, becngetchar, becnputchar, becnscan },
119 1.2 sakamoto #endif
120 1.1 sakamoto #ifdef CONS_VGA
121 1.4 sakamoto { "vga", 0xc0000000, 0,
122 1.5 sakamoto vgacnprobe, vgacninit, vgacngetchar, vgacnputchar, vgacnscan },
123 1.1 sakamoto #endif
124 1.1 sakamoto #ifdef CONS_SERIAL
125 1.4 sakamoto { "com", COMPORT, COMSPEED,
126 1.5 sakamoto siocnprobe, siocninit, siocngetchar, siocnputchar, siocnscan },
127 1.1 sakamoto #endif
128 1.1 sakamoto { 0 }
129 1.1 sakamoto };
130 1.1 sakamoto
131 1.1 sakamoto struct consdev *cn_tab;
132 1.1 sakamoto
133 1.2 sakamoto char *
134 1.9 kiyohara cninit(int *addr, int *speed)
135 1.1 sakamoto {
136 1.1 sakamoto register struct consdev *cp;
137 1.1 sakamoto
138 1.1 sakamoto cn_tab = NULL;
139 1.1 sakamoto for (cp = constab; cp->cn_probe; cp++) {
140 1.1 sakamoto (*cp->cn_probe)(cp);
141 1.1 sakamoto if (cp->cn_pri > CN_DEAD &&
142 1.1 sakamoto (cn_tab == NULL || cp->cn_pri > cn_tab->cn_pri))
143 1.1 sakamoto cn_tab = cp;
144 1.1 sakamoto }
145 1.1 sakamoto if (cn_tab) {
146 1.1 sakamoto (*cn_tab->cn_init)(cn_tab);
147 1.4 sakamoto *addr = cn_tab->address;
148 1.4 sakamoto *speed = cn_tab->speed;
149 1.5 sakamoto return (cn_tab->cn_name);
150 1.1 sakamoto }
151 1.2 sakamoto
152 1.5 sakamoto return (NULL);
153 1.1 sakamoto }
154 1.1 sakamoto
155 1.4 sakamoto int
156 1.1 sakamoto cngetc()
157 1.1 sakamoto {
158 1.9 kiyohara
159 1.1 sakamoto if (cn_tab)
160 1.1 sakamoto return ((*cn_tab->cn_getc)(cn_tab->cn_dev));
161 1.1 sakamoto return (0);
162 1.1 sakamoto }
163 1.1 sakamoto
164 1.4 sakamoto void
165 1.9 kiyohara cnputc(int c)
166 1.1 sakamoto {
167 1.9 kiyohara
168 1.1 sakamoto if (cn_tab)
169 1.1 sakamoto (*cn_tab->cn_putc)(cn_tab->cn_dev, c);
170 1.1 sakamoto }
171 1.1 sakamoto
172 1.4 sakamoto int
173 1.1 sakamoto cnscan()
174 1.1 sakamoto {
175 1.9 kiyohara
176 1.1 sakamoto if (cn_tab)
177 1.1 sakamoto return ((*cn_tab->cn_scan)(cn_tab->cn_dev));
178 1.8 tsutsui return -1;
179 1.1 sakamoto }
180 1.1 sakamoto
181 1.2 sakamoto #ifdef CONS_BE
182 1.1 sakamoto /*
183 1.1 sakamoto * BeBox default console
184 1.1 sakamoto */
185 1.1 sakamoto void
186 1.9 kiyohara becnprobe(struct consdev *cp)
187 1.1 sakamoto {
188 1.9 kiyohara
189 1.2 sakamoto cp->cn_pri = CN_INTERNAL;
190 1.1 sakamoto }
191 1.1 sakamoto
192 1.1 sakamoto void
193 1.9 kiyohara becninit(struct consdev *cp)
194 1.1 sakamoto {
195 1.9 kiyohara
196 1.5 sakamoto video_init((u_char *)cp->address);
197 1.1 sakamoto kbdreset();
198 1.10 kiyohara kbd(1); /* read out ugly data */
199 1.1 sakamoto }
200 1.1 sakamoto
201 1.4 sakamoto int
202 1.9 kiyohara becngetchar(void *dev)
203 1.1 sakamoto {
204 1.9 kiyohara
205 1.2 sakamoto return (kbd_getc());
206 1.1 sakamoto }
207 1.1 sakamoto
208 1.1 sakamoto void
209 1.9 kiyohara becnputchar(void *dev, register int c)
210 1.1 sakamoto {
211 1.9 kiyohara
212 1.2 sakamoto video_putc(c);
213 1.1 sakamoto }
214 1.1 sakamoto
215 1.4 sakamoto int
216 1.9 kiyohara becnscan(void *dev)
217 1.1 sakamoto {
218 1.9 kiyohara
219 1.1 sakamoto return (kbd(1));
220 1.1 sakamoto }
221 1.9 kiyohara #endif /* CONS_BE */
222 1.1 sakamoto
223 1.2 sakamoto #ifdef CONS_VGA
224 1.2 sakamoto /*
225 1.2 sakamoto * VGA console
226 1.2 sakamoto */
227 1.2 sakamoto void
228 1.9 kiyohara vgacnprobe(struct consdev *cp)
229 1.2 sakamoto {
230 1.9 kiyohara
231 1.2 sakamoto cp->cn_pri = CN_NORMAL;
232 1.2 sakamoto }
233 1.2 sakamoto
234 1.2 sakamoto void
235 1.9 kiyohara vgacninit(struct consdev *cp)
236 1.2 sakamoto {
237 1.9 kiyohara
238 1.5 sakamoto vga_reset((u_char *)cp->address);
239 1.5 sakamoto vga_init((u_char *)cp->address);
240 1.2 sakamoto kbdreset();
241 1.2 sakamoto }
242 1.2 sakamoto
243 1.4 sakamoto int
244 1.9 kiyohara vgacngetchar(void *dev)
245 1.2 sakamoto {
246 1.9 kiyohara
247 1.2 sakamoto return (kbd_getc());
248 1.2 sakamoto }
249 1.2 sakamoto
250 1.2 sakamoto void
251 1.9 kiyohara vgacnputchar(void *dev, register int c)
252 1.2 sakamoto {
253 1.9 kiyohara
254 1.2 sakamoto vga_putc(c);
255 1.2 sakamoto }
256 1.2 sakamoto
257 1.4 sakamoto int
258 1.9 kiyohara vgacnscan(void *dev)
259 1.2 sakamoto {
260 1.9 kiyohara
261 1.2 sakamoto return (kbd(1));
262 1.2 sakamoto }
263 1.2 sakamoto #endif /* CONS_VGA */
264 1.2 sakamoto
265 1.1 sakamoto #ifdef CONS_SERIAL
266 1.1 sakamoto /*
267 1.2 sakamoto * serial console
268 1.1 sakamoto */
269 1.1 sakamoto void
270 1.9 kiyohara siocnprobe(struct consdev *cp)
271 1.1 sakamoto {
272 1.9 kiyohara
273 1.1 sakamoto cp->cn_pri = CN_REMOTE;
274 1.1 sakamoto }
275 1.1 sakamoto
276 1.1 sakamoto void
277 1.9 kiyohara siocninit(struct consdev *cp)
278 1.1 sakamoto {
279 1.9 kiyohara
280 1.4 sakamoto cp->cn_dev = (void *)NS16550_init(cp->address, cp->speed);
281 1.1 sakamoto }
282 1.1 sakamoto
283 1.4 sakamoto int
284 1.9 kiyohara siocngetchar(void *dev)
285 1.1 sakamoto {
286 1.9 kiyohara
287 1.4 sakamoto return (NS16550_getc((struct NS16550 *)dev));
288 1.1 sakamoto }
289 1.1 sakamoto
290 1.1 sakamoto void
291 1.9 kiyohara siocnputchar(void *dev, register int c)
292 1.1 sakamoto {
293 1.9 kiyohara
294 1.1 sakamoto if (c == '\n')
295 1.4 sakamoto NS16550_putc((struct NS16550 *)dev, '\r');
296 1.4 sakamoto NS16550_putc((struct NS16550 *)dev, c);
297 1.1 sakamoto }
298 1.1 sakamoto
299 1.4 sakamoto int
300 1.9 kiyohara siocnscan(void *dev)
301 1.1 sakamoto {
302 1.9 kiyohara
303 1.4 sakamoto return (NS16550_scankbd((struct NS16550 *)dev));
304 1.1 sakamoto }
305 1.1 sakamoto #endif /* CONS_SERIAL */
306