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