[BACK]Return to ite.c CVS log [TXT][DIR] Up to [local] / sys / arch / hp300 / stand / common

Annotation of sys/arch/hp300/stand/common/ite.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: ite.c,v 1.7 2006/08/17 06:31:10 miod Exp $    */
        !             2: /*     $NetBSD: ite.c,v 1.12 1997/01/30 10:32:55 thorpej Exp $ */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 1988 University of Utah.
        !             6:  * Copyright (c) 1990, 1993
        !             7:  *     The Regents of the University of California.  All rights reserved.
        !             8:  *
        !             9:  * This code is derived from software contributed to Berkeley by
        !            10:  * the Systems Programming Group of the University of Utah Computer
        !            11:  * Science Department.
        !            12:  *
        !            13:  * Redistribution and use in source and binary forms, with or without
        !            14:  * modification, are permitted provided that the following conditions
        !            15:  * are met:
        !            16:  * 1. Redistributions of source code must retain the above copyright
        !            17:  *    notice, this list of conditions and the following disclaimer.
        !            18:  * 2. Redistributions in binary form must reproduce the above copyright
        !            19:  *    notice, this list of conditions and the following disclaimer in the
        !            20:  *    documentation and/or other materials provided with the distribution.
        !            21:  * 3. Neither the name of the University nor the names of its contributors
        !            22:  *    may be used to endorse or promote products derived from this software
        !            23:  *    without specific prior written permission.
        !            24:  *
        !            25:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
        !            26:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            27:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            28:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            29:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            30:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            31:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            32:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            33:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            34:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            35:  * SUCH DAMAGE.
        !            36:  *
        !            37:  * from: Utah $Hdr: ite.c 1.24 93/06/25$
        !            38:  *
        !            39:  *     @(#)ite.c       8.1 (Berkeley) 7/8/93
        !            40:  */
        !            41:
        !            42: /*
        !            43:  * Standalone Internal Terminal Emulator (CRT and keyboard)
        !            44:  */
        !            45:
        !            46: #ifdef ITECONSOLE
        !            47:
        !            48: #include <sys/param.h>
        !            49:
        !            50: #include <hp300/dev/sgcreg.h>
        !            51: #include <dev/ic/stireg.h>
        !            52:
        !            53: #include "samachdep.h"
        !            54: #include "consdefs.h"
        !            55: #include "device.h"
        !            56: #include "grfreg.h"
        !            57: #include "itevar.h"
        !            58: #include "kbdvar.h"
        !            59:
        !            60: void   itecheckwrap(struct ite_data *, struct itesw *);
        !            61: void   iteconfig(void);
        !            62: void   ite_clrtoeol(struct ite_data *, struct itesw *, int, int);
        !            63:
        !            64: struct itesw itesw[] = {
        !            65:        { GID_TOPCAT,
        !            66:        topcat_init,    ite_dio_clear,  ite_dio_putc8bpp,
        !            67:        ite_dio_cursor, ite_dio_scroll },
        !            68:
        !            69:        { GID_GATORBOX,
        !            70:        gbox_init,      ite_dio_clear,  ite_dio_putc8bpp,
        !            71:        ite_dio_cursor, gbox_scroll },
        !            72:
        !            73:        { GID_RENAISSANCE,
        !            74:        rbox_init,      ite_dio_clear,  ite_dio_putc8bpp,
        !            75:        ite_dio_cursor, ite_dio_scroll },
        !            76:
        !            77:        { GID_LRCATSEYE,
        !            78:        topcat_init,    ite_dio_clear,  ite_dio_putc8bpp,
        !            79:        ite_dio_cursor, ite_dio_scroll },
        !            80:
        !            81:        { GID_HRCCATSEYE,
        !            82:        topcat_init,    ite_dio_clear,  ite_dio_putc8bpp,
        !            83:        ite_dio_cursor, ite_dio_scroll },
        !            84:
        !            85:        { GID_HRMCATSEYE,
        !            86:        topcat_init,    ite_dio_clear,  ite_dio_putc8bpp,
        !            87:        ite_dio_cursor, ite_dio_scroll },
        !            88:
        !            89:        { GID_DAVINCI,
        !            90:        dvbox_init,     ite_dio_clear,  ite_dio_putc8bpp,
        !            91:        ite_dio_cursor, ite_dio_scroll },
        !            92:
        !            93:        { GID_HYPERION,
        !            94:        hyper_init,     ite_dio_clear,  ite_dio_putc1bpp,
        !            95:        ite_dio_cursor, ite_dio_scroll },
        !            96:
        !            97:        { GID_TIGER,
        !            98:        tvrx_init,      ite_dio_clear,  ite_dio_putc1bpp,
        !            99:        ite_dio_cursor, ite_dio_scroll },
        !           100:
        !           101:        { GID_STI,
        !           102:        sti_iteinit,    sti_clear,      sti_putc,
        !           103:        sti_cursor,     sti_scroll },
        !           104: };
        !           105: int    nitesw = sizeof(itesw) / sizeof(itesw[0]);
        !           106:
        !           107: /* these guys need to be in initialized data */
        !           108: int itecons = -1;
        !           109: struct  ite_data ite_data[NITE] = { { 0 } };
        !           110:
        !           111: /*
        !           112:  * Locate all bitmapped displays
        !           113:  */
        !           114: void
        !           115: iteconfig()
        !           116: {
        !           117:        extern struct hp_hw sc_table[];
        !           118:        int dtype, fboff, slotno, i;
        !           119:        u_int8_t *va;
        !           120:        struct hp_hw *hw;
        !           121:        struct grfreg *gr;
        !           122:        struct ite_data *ip;
        !           123:
        !           124:        i = 0;
        !           125:        for (hw = sc_table; hw < &sc_table[MAXCTLRS]; hw++) {
        !           126:                if (!HW_ISDEV(hw, D_BITMAP))
        !           127:                        continue;
        !           128:                gr = (struct grfreg *) hw->hw_kva;
        !           129:                /* XXX: redundent but safe */
        !           130:                if (badaddr((caddr_t)gr) || gr->gr_id != GRFHWID)
        !           131:                        continue;
        !           132:                for (dtype = 0; dtype < nitesw; dtype++)
        !           133:                        if (itesw[dtype].ite_hwid == gr->gr_id2)
        !           134:                                break;
        !           135:                if (dtype == nitesw)
        !           136:                        continue;
        !           137:                if (i >= NITE)
        !           138:                        break;
        !           139:                ip = &ite_data[i];
        !           140:                ip->isw = &itesw[dtype];
        !           141:                ip->regbase = (caddr_t) gr;
        !           142:                fboff = (gr->gr_fbomsb << 8) | gr->gr_fbolsb;
        !           143:                ip->fbbase = (caddr_t) (*((u_char *)ip->regbase+fboff) << 16);
        !           144:                /* DIO II: FB offset is relative to select code space */
        !           145:                if (ip->regbase >= (caddr_t)DIOIIBASE)
        !           146:                        ip->fbbase += (int)ip->regbase;
        !           147:                ip->fbwidth  = gr->gr_fbwidth_h << 8 | gr->gr_fbwidth_l;
        !           148:                ip->fbheight = gr->gr_fbheight_h << 8 | gr->gr_fbheight_l;
        !           149:                ip->dwidth   = gr->gr_dwidth_h << 8 | gr->gr_dwidth_l;
        !           150:                ip->dheight  = gr->gr_dheight_h << 8 | gr->gr_dheight_l;
        !           151:                /*
        !           152:                 * XXX some displays (e.g. the davinci) appear
        !           153:                 * to return a display height greater than the
        !           154:                 * returned FB height.  Guess we should go back
        !           155:                 * to getting the display dimensions from the
        !           156:                 * fontrom...
        !           157:                 */
        !           158:                if (ip->dwidth > ip->fbwidth)
        !           159:                        ip->dwidth = ip->fbwidth;
        !           160:                if (ip->dheight > ip->fbheight)
        !           161:                        ip->dheight = ip->fbheight;
        !           162:                ip->alive = 1;
        !           163:                i++;
        !           164:        }
        !           165:
        !           166:        /*
        !           167:         * Now probe for SGC frame buffers
        !           168:         */
        !           169:        if (machineid != HP_400 && machineid != HP_425 &&
        !           170:            machineid != HP_433)
        !           171:                return;
        !           172:
        !           173:        for (dtype = 0; dtype < nitesw; dtype++)
        !           174:                if (itesw[dtype].ite_hwid == GID_STI)
        !           175:                        break;
        !           176:        if (dtype == nitesw)
        !           177:                return;
        !           178:
        !           179:        for (slotno = 0; slotno < SGC_NSLOTS; slotno++) {
        !           180:                va = (u_int8_t *)IIOV(SGC_BASE + (slotno * SGC_DEVSIZE));
        !           181:
        !           182:                /* Check to see if hardware exists. */
        !           183:                if (badaddr(va) != 0)
        !           184:                        continue;
        !           185:
        !           186:                /* Check hardware. */
        !           187:                if (va[3] == STI_DEVTYPE1) {
        !           188:                        if (i >= NITE)
        !           189:                                break;
        !           190:                        ip = &ite_data[i];
        !           191:                        ip->isw = &itesw[dtype];
        !           192:                        ip->regbase = (caddr_t)GRFIADDR;/* to get CN_INTERNAL */
        !           193:                        ip->fbbase = (caddr_t)slotno;
        !           194:                        ip->alive = 1;
        !           195:                        i++;
        !           196:                        /* we only support one SGC frame buffer at the moment */
        !           197:                        break;
        !           198:                }
        !           199:        }
        !           200: }
        !           201:
        !           202: void
        !           203: iteprobe(struct consdev *cp)
        !           204: {
        !           205:        int ite;
        !           206:        struct ite_data *ip;
        !           207:        int unit, pri;
        !           208:
        !           209:        iteconfig();
        !           210:        unit = -1;
        !           211:        pri = CN_DEAD;
        !           212:        for (ite = 0; ite < NITE; ite++) {
        !           213:                ip = &ite_data[ite];
        !           214:                if (ip->alive == 0)
        !           215:                        continue;
        !           216:                if ((int)ip->regbase == GRFIADDR) {
        !           217:                        pri = CN_INTERNAL;
        !           218:                        unit = ite;
        !           219:                } else if (unit < 0) {
        !           220:                        pri = CN_NORMAL;
        !           221:                        unit = ite;
        !           222:                }
        !           223:        }
        !           224:        cp->cn_dev = unit;
        !           225:        cp->cn_pri = pri;
        !           226: }
        !           227:
        !           228: void
        !           229: iteinit(struct consdev *cp)
        !           230: {
        !           231:        int ite = cp->cn_dev;
        !           232:        struct ite_data *ip;
        !           233:
        !           234:        ip = &ite_data[ite];
        !           235:
        !           236:        ip->curx = 0;
        !           237:        ip->cury = 0;
        !           238:        ip->cursorx = 0;
        !           239:        ip->cursory = 0;
        !           240:
        !           241:        (*ip->isw->ite_init)(ip);
        !           242:        (*ip->isw->ite_cursor)(ip, DRAW_CURSOR);
        !           243:
        !           244:        itecons = ite;
        !           245:        kbdinit();
        !           246: }
        !           247:
        !           248: /* ARGSUSED */
        !           249: void
        !           250: iteputchar(dev_t dev, int c)
        !           251: {
        !           252:        struct ite_data *ip = &ite_data[itecons];
        !           253:        struct itesw *sp = ip->isw;
        !           254:
        !           255:        c &= 0x7F;
        !           256:        switch (c) {
        !           257:
        !           258:        case '\n':
        !           259:                if (++ip->cury == ip->rows) {
        !           260:                        ip->cury--;
        !           261:                        (*sp->ite_scroll)(ip);
        !           262:                        ite_clrtoeol(ip, sp, ip->cury, 0);
        !           263:                }
        !           264:                else
        !           265:                        (*sp->ite_cursor)(ip, MOVE_CURSOR);
        !           266:                break;
        !           267:
        !           268:        case '\r':
        !           269:                ip->curx = 0;
        !           270:                (*sp->ite_cursor)(ip, MOVE_CURSOR);
        !           271:                break;
        !           272:
        !           273:        case '\b':
        !           274:                if (--ip->curx < 0)
        !           275:                        ip->curx = 0;
        !           276:                else
        !           277:                        (*sp->ite_cursor)(ip, MOVE_CURSOR);
        !           278:                break;
        !           279:
        !           280:        default:
        !           281:                if (c < ' ' || c == 0177)
        !           282:                        break;
        !           283:                (*sp->ite_putc)(ip, c, ip->cury, ip->curx);
        !           284:                (*sp->ite_cursor)(ip, DRAW_CURSOR);
        !           285:                itecheckwrap(ip, sp);
        !           286:                break;
        !           287:        }
        !           288: }
        !           289:
        !           290: void
        !           291: itecheckwrap(struct ite_data *ip, struct itesw *sp)
        !           292: {
        !           293:        if (++ip->curx == ip->cols) {
        !           294:                ip->curx = 0;
        !           295:                if (++ip->cury == ip->rows) {
        !           296:                        --ip->cury;
        !           297:                        (*sp->ite_scroll)(ip);
        !           298:                        ite_clrtoeol(ip, sp, ip->cury, 0);
        !           299:                        return;
        !           300:                }
        !           301:        }
        !           302:        (*sp->ite_cursor)(ip, MOVE_CURSOR);
        !           303: }
        !           304:
        !           305: void
        !           306: ite_clrtoeol(struct ite_data *ip, struct itesw *sp, int y, int x)
        !           307: {
        !           308:        (*sp->ite_clear)(ip, y, x, 1, ip->cols - x);
        !           309:        (*sp->ite_cursor)(ip, DRAW_CURSOR);
        !           310: }
        !           311:
        !           312: /* ARGSUSED */
        !           313: int
        !           314: itegetchar(dev_t dev)
        !           315: {
        !           316: #ifdef SMALL
        !           317:        return (0);
        !           318: #else
        !           319:        return (kbdgetc());
        !           320: #endif
        !           321: }
        !           322: #endif

CVSweb