cons.c revision 1.8.4.1 1 1.8.4.1 yamt /* $NetBSD: cons.c,v 1.8.4.1 2009/05/04 08:10:52 yamt 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.8.4.1 yamt #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.8.4.1 yamt void becnprobe(struct consdev *);
86 1.8.4.1 yamt void becninit(struct consdev *);
87 1.8.4.1 yamt void becnputchar(void *, register int);
88 1.8.4.1 yamt int becngetchar(void *);
89 1.8.4.1 yamt int becnscan(void *);
90 1.2 sakamoto #endif
91 1.2 sakamoto
92 1.2 sakamoto #ifdef CONS_VGA
93 1.8.4.1 yamt void vgacnprobe(struct consdev *);
94 1.8.4.1 yamt void vgacninit(struct consdev *);
95 1.8.4.1 yamt void vgacnputchar(void *, register int);
96 1.8.4.1 yamt int vgacngetchar(void *);
97 1.8.4.1 yamt int vgacnscan(void *);
98 1.2 sakamoto #endif
99 1.2 sakamoto
100 1.2 sakamoto #ifdef CONS_SERIAL
101 1.8.4.1 yamt void siocnprobe(struct consdev *);
102 1.8.4.1 yamt void siocninit(struct consdev *);
103 1.8.4.1 yamt void siocnputchar(void *, register int);
104 1.8.4.1 yamt int siocngetchar(void *);
105 1.8.4.1 yamt 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.8.4.1 yamt 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.8.4.1 yamt cngetc(void)
157 1.1 sakamoto {
158 1.8.4.1 yamt
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.8.4.1 yamt cnputc(int c)
166 1.1 sakamoto {
167 1.8.4.1 yamt
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.8.4.1 yamt cnscan(void)
174 1.1 sakamoto {
175 1.8.4.1 yamt
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.8.4.1 yamt becnprobe(struct consdev *cp)
187 1.1 sakamoto {
188 1.8.4.1 yamt
189 1.2 sakamoto cp->cn_pri = CN_INTERNAL;
190 1.1 sakamoto }
191 1.1 sakamoto
192 1.1 sakamoto void
193 1.8.4.1 yamt becninit(struct consdev *cp)
194 1.1 sakamoto {
195 1.8.4.1 yamt
196 1.5 sakamoto video_init((u_char *)cp->address);
197 1.1 sakamoto kbdreset();
198 1.8.4.1 yamt kbd(1); /* read out ugly data */
199 1.1 sakamoto }
200 1.1 sakamoto
201 1.4 sakamoto int
202 1.8.4.1 yamt becngetchar(void *dev)
203 1.1 sakamoto {
204 1.8.4.1 yamt
205 1.2 sakamoto return (kbd_getc());
206 1.1 sakamoto }
207 1.1 sakamoto
208 1.1 sakamoto void
209 1.8.4.1 yamt becnputchar(void *dev, register int c)
210 1.1 sakamoto {
211 1.8.4.1 yamt
212 1.2 sakamoto video_putc(c);
213 1.1 sakamoto }
214 1.1 sakamoto
215 1.4 sakamoto int
216 1.8.4.1 yamt becnscan(void *dev)
217 1.1 sakamoto {
218 1.8.4.1 yamt
219 1.1 sakamoto return (kbd(1));
220 1.1 sakamoto }
221 1.8.4.1 yamt #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.8.4.1 yamt vgacnprobe(struct consdev *cp)
229 1.2 sakamoto {
230 1.8.4.1 yamt
231 1.2 sakamoto cp->cn_pri = CN_NORMAL;
232 1.2 sakamoto }
233 1.2 sakamoto
234 1.2 sakamoto void
235 1.8.4.1 yamt vgacninit(struct consdev *cp)
236 1.2 sakamoto {
237 1.8.4.1 yamt
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.8.4.1 yamt vgacngetchar(void *dev)
245 1.2 sakamoto {
246 1.8.4.1 yamt
247 1.2 sakamoto return (kbd_getc());
248 1.2 sakamoto }
249 1.2 sakamoto
250 1.2 sakamoto void
251 1.8.4.1 yamt vgacnputchar(void *dev, register int c)
252 1.2 sakamoto {
253 1.8.4.1 yamt
254 1.2 sakamoto vga_putc(c);
255 1.2 sakamoto }
256 1.2 sakamoto
257 1.4 sakamoto int
258 1.8.4.1 yamt vgacnscan(void *dev)
259 1.2 sakamoto {
260 1.8.4.1 yamt
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.8.4.1 yamt siocnprobe(struct consdev *cp)
271 1.1 sakamoto {
272 1.8.4.1 yamt
273 1.1 sakamoto cp->cn_pri = CN_REMOTE;
274 1.1 sakamoto }
275 1.1 sakamoto
276 1.1 sakamoto void
277 1.8.4.1 yamt siocninit(struct consdev *cp)
278 1.1 sakamoto {
279 1.8.4.1 yamt
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.8.4.1 yamt siocngetchar(void *dev)
285 1.1 sakamoto {
286 1.8.4.1 yamt
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.8.4.1 yamt siocnputchar(void *dev, register int c)
292 1.1 sakamoto {
293 1.8.4.1 yamt
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.8.4.1 yamt siocnscan(void *dev)
301 1.1 sakamoto {
302 1.8.4.1 yamt
303 1.4 sakamoto return (NS16550_scankbd((struct NS16550 *)dev));
304 1.1 sakamoto }
305 1.1 sakamoto #endif /* CONS_SERIAL */
306