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