1/* $NetBSD: ite.c,v 1.15 2011/02/10 13:04:32 tsutsui 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. Neither the name of the University nor the names of its contributors 21 * may be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * from: Utah $Hdr: ite.c 1.24 93/06/25$ 37 * 38 * @(#)ite.c 8.1 (Berkeley) 7/8/93 39 */ 40 41/* 42 * Standalone Internal Terminal Emulator (CRT and keyboard) 43 */ 44 45#ifdef ITECONSOLE 46 47#include <sys/param.h> 48#include <dev/cons.h> 49 50#include <hp300/stand/common/grfreg.h> 51#include <hp300/dev/intioreg.h> 52 53#include <hp300/stand/common/device.h> 54#include <hp300/stand/common/itevar.h> 55#include <hp300/stand/common/kbdvar.h> 56#include <hp300/stand/common/consdefs.h> 57#include <hp300/stand/common/samachdep.h> 58 59static void iteconfig(void); 60static void ite_clrtoeol(struct ite_data *, struct itesw *, int, int); 61static void itecheckwrap(struct ite_data *, struct itesw *); 62 63struct itesw itesw[] = { 64 { GID_TOPCAT, 65 topcat_init, ite_dio_clear, ite_dio_putc8bpp, 66 ite_dio_cursor, ite_dio_scroll }, 67 68 { GID_GATORBOX, 69 gbox_init, ite_dio_clear, ite_dio_putc8bpp, 70 ite_dio_cursor, gbox_scroll }, 71 72 { GID_RENAISSANCE, 73 rbox_init, ite_dio_clear, ite_dio_putc8bpp, 74 ite_dio_cursor, ite_dio_scroll }, 75 76 { GID_LRCATSEYE, 77 topcat_init, ite_dio_clear, ite_dio_putc8bpp, 78 ite_dio_cursor, ite_dio_scroll }, 79 80 { GID_HRCCATSEYE, 81 topcat_init, ite_dio_clear, ite_dio_putc8bpp, 82 ite_dio_cursor, ite_dio_scroll }, 83 84 { GID_HRMCATSEYE, 85 topcat_init, ite_dio_clear, ite_dio_putc8bpp, 86 ite_dio_cursor, ite_dio_scroll }, 87 88 { GID_DAVINCI, 89 dvbox_init, ite_dio_clear, ite_dio_putc8bpp, 90 ite_dio_cursor, ite_dio_scroll }, 91 92 { GID_HYPERION, 93 hyper_init, ite_dio_clear, ite_dio_putc1bpp, 94 ite_dio_cursor, ite_dio_scroll }, 95 96 { GID_TIGER, 97 tvrx_init, ite_dio_clear, ite_dio_putc1bpp, 98 ite_dio_cursor, ite_dio_scroll }, 99 100 { GID_A1474MID, 101 dumb_init, dumb_clear, dumb_putc, 102 dumb_cursor, dumb_scroll }, 103 104 { GID_A147xVGA, 105 dumb_init, dumb_clear, dumb_putc, 106 dumb_cursor, dumb_scroll }, 107}; 108int nitesw = sizeof(itesw) / sizeof(itesw[0]); 109 110/* these guys need to be in initialized data */ 111int itecons = -1; 112struct ite_data ite_data[NITE] = { { 0 } }; 113int ite_scode[NITE] = { 0 }; 114 115/* 116 * Locate all bitmapped displays 117 */ 118static void 119iteconfig(void) 120{ 121 int dtype, fboff, i; 122 struct hp_hw *hw; 123 struct grfreg *gr; 124 struct ite_data *ip; 125 126 i = 0; 127 for (hw = sc_table; hw < &sc_table[MAXCTLRS]; hw++) { 128 if (!HW_ISDEV(hw, D_BITMAP)) 129 continue; 130 gr = (struct grfreg *) hw->hw_kva; 131 /* XXX: redundent but safe */ 132 if (badaddr((void *)gr) || gr->gr_id != GRFHWID) 133 continue; 134 for (dtype = 0; dtype < nitesw; dtype++) 135 if (itesw[dtype].ite_hwid == gr->gr_id2) 136 break; 137 if (dtype == nitesw) 138 continue; 139 if (i >= NITE) 140 break; 141 ite_scode[i] = hw->hw_sc; 142 ip = &ite_data[i]; 143 ip->isw = &itesw[dtype]; 144 ip->regbase = (void *) gr; 145 fboff = (gr->gr_fbomsb << 8) | gr->gr_fbolsb; 146 ip->fbbase = (void *)(*((u_char *)ip->regbase + fboff) << 16); 147 /* DIO II: FB offset is relative to select code space */ 148 if (ip->regbase >= (void *)DIOIIBASE) 149 ip->fbbase = (char*)ip->fbbase + (int)ip->regbase; 150 ip->fbwidth = gr->gr_fbwidth_h << 8 | gr->gr_fbwidth_l; 151 ip->fbheight = gr->gr_fbheight_h << 8 | gr->gr_fbheight_l; 152 ip->dwidth = gr->gr_dwidth_h << 8 | gr->gr_dwidth_l; 153 ip->dheight = gr->gr_dheight_h << 8 | gr->gr_dheight_l; 154 /* 155 * XXX some displays (e.g. the davinci) appear 156 * to return a display height greater than the 157 * returned FB height. Guess we should go back 158 * to getting the display dimensions from the 159 * fontrom... 160 */ 161 if (ip->dwidth > ip->fbwidth) 162 ip->dwidth = ip->fbwidth; 163 if (ip->dheight > ip->fbheight) 164 ip->dheight = ip->fbheight; 165 ip->alive = 1; 166 i++; 167 } 168} 169 170#ifdef CONSDEBUG 171/* 172 * Allows us to cycle through all possible consoles (NITE ites and serial port) 173 * by using SHIFT-RESET on the keyboard. 174 */ 175int whichconsole = -1; 176#endif 177 178void 179iteprobe(struct consdev *cp) 180{ 181 int ite; 182 struct ite_data *ip; 183 int unit, pri; 184 185#ifdef CONSDEBUG 186 whichconsole = ++whichconsole % (NITE+1); 187#endif 188 189 if (itecons != -1) 190 return; 191 192 iteconfig(); 193 unit = -1; 194 pri = CN_DEAD; 195 for (ite = 0; ite < NITE; ite++) { 196#ifdef CONSDEBUG 197 if (ite < whichconsole) 198 continue; 199#endif 200 ip = &ite_data[ite]; 201 if (ip->alive == 0) 202 continue; 203 if ((int)ip->regbase == INTIOBASE + FB_BASE) { 204 pri = CN_INTERNAL; 205 unit = ite; 206 } else if (unit < 0) { 207 pri = CN_NORMAL; 208 unit = ite; 209 } 210 } 211 curcons_scode = ite_scode[unit]; 212 cp->cn_dev = unit; 213 cp->cn_pri = pri; 214} 215 216void 217iteinit(struct consdev *cp) 218{ 219 int ite = cp->cn_dev; 220 struct ite_data *ip; 221 222 if (itecons != -1) 223 return; 224 225 ip = &ite_data[ite]; 226 227 ip->curx = 0; 228 ip->cury = 0; 229 ip->cursorx = 0; 230 ip->cursory = 0; 231 232 (*ip->isw->ite_init)(ip); 233 (*ip->isw->ite_cursor)(ip, DRAW_CURSOR); 234 235 itecons = ite; 236 kbdinit(); 237} 238 239/* ARGSUSED */ 240void 241iteputchar(dev_t dev, int c) 242{ 243 struct ite_data *ip = &ite_data[itecons]; 244 struct itesw *sp = ip->isw; 245 246 c &= 0x7F; 247 switch (c) { 248 249 case '\n': 250 if (++ip->cury == ip->rows) { 251 ip->cury--; 252 (*sp->ite_scroll)(ip); 253 ite_clrtoeol(ip, sp, ip->cury, 0); 254 } 255 else 256 (*sp->ite_cursor)(ip, MOVE_CURSOR); 257 break; 258 259 case '\r': 260 ip->curx = 0; 261 (*sp->ite_cursor)(ip, MOVE_CURSOR); 262 break; 263 264 case '\b': 265 if (--ip->curx < 0) 266 ip->curx = 0; 267 else 268 (*sp->ite_cursor)(ip, MOVE_CURSOR); 269 break; 270 271 default: 272 if (c < ' ' || c == 0177) 273 break; 274 (*sp->ite_putc)(ip, c, ip->cury, ip->curx); 275 (*sp->ite_cursor)(ip, DRAW_CURSOR); 276 itecheckwrap(ip, sp); 277 break; 278 } 279} 280 281static void 282itecheckwrap(struct ite_data *ip, struct itesw *sp) 283{ 284 if (++ip->curx == ip->cols) { 285 ip->curx = 0; 286 if (++ip->cury == ip->rows) { 287 --ip->cury; 288 (*sp->ite_scroll)(ip); 289 ite_clrtoeol(ip, sp, ip->cury, 0); 290 return; 291 } 292 } 293 (*sp->ite_cursor)(ip, MOVE_CURSOR); 294} 295 296static void 297ite_clrtoeol(struct ite_data *ip, struct itesw *sp, int y, int x) 298{ 299 300 (*sp->ite_clear)(ip, y, x, 1, ip->cols - x); 301 (*sp->ite_cursor)(ip, DRAW_CURSOR); 302} 303 304/* ARGSUSED */ 305int 306itegetchar(dev_t dev) 307{ 308 309#ifdef SMALL 310 return 0; 311#else 312 return kbdgetc(); 313#endif 314} 315#endif 316