[BACK]Return to qsckbd.c CVS log [TXT][DIR] Up to [local] / sys / arch / vax / vxt

Annotation of sys/arch/vax/vxt/qsckbd.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: qsckbd.c,v 1.1 2006/08/27 16:55:41 miod Exp $ */
        !             2: /*     from OpenBSD: dzkbd.c,v 1.11 2006/08/05 22:05:55 miod Exp */
        !             3: /*
        !             4:  * Copyright (c) 2006 Miodrag Vallat.
        !             5:  *
        !             6:  * Permission to use, copy, modify, and distribute this software for any
        !             7:  * purpose with or without fee is hereby granted, provided that the above
        !             8:  * copyright notice, this permission notice, and the disclaimer below
        !             9:  * appear in all copies.
        !            10:  *
        !            11:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
        !            12:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            13:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
        !            14:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            15:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
        !            16:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
        !            17:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            18:  */
        !            19:
        !            20: /*
        !            21:  * Copyright (c) 1992, 1993
        !            22:  *     The Regents of the University of California.  All rights reserved.
        !            23:  *
        !            24:  * This software was developed by the Computer Systems Engineering group
        !            25:  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
        !            26:  * contributed to Berkeley.
        !            27:  *
        !            28:  * All advertising materials mentioning features or use of this software
        !            29:  * must display the following acknowledgement:
        !            30:  *     This product includes software developed by the University of
        !            31:  *     California, Lawrence Berkeley Laboratory.
        !            32:  *
        !            33:  * Redistribution and use in source and binary forms, with or without
        !            34:  * modification, are permitted provided that the following conditions
        !            35:  * are met:
        !            36:  * 1. Redistributions of source code must retain the above copyright
        !            37:  *    notice, this list of conditions and the following disclaimer.
        !            38:  * 2. Redistributions in binary form must reproduce the above copyright
        !            39:  *    notice, this list of conditions and the following disclaimer in the
        !            40:  *    documentation and/or other materials provided with the distribution.
        !            41:  * 3. Neither the name of the University nor the names of its contributors
        !            42:  *    may be used to endorse or promote products derived from this software
        !            43:  *    without specific prior written permission.
        !            44:  *
        !            45:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
        !            46:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            47:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            48:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            49:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            50:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            51:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            52:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            53:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            54:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            55:  * SUCH DAMAGE.
        !            56:  *
        !            57:  *     @(#)kbd.c       8.2 (Berkeley) 10/30/93
        !            58:  */
        !            59:
        !            60: /*
        !            61:  * LK200/LK400 keyboard attached to line C of the SC26C94
        !            62:  */
        !            63:
        !            64: #include <sys/param.h>
        !            65: #include <sys/systm.h>
        !            66: #include <sys/device.h>
        !            67: #include <sys/ioctl.h>
        !            68: #include <sys/syslog.h>
        !            69: #include <sys/malloc.h>
        !            70: #include <sys/timeout.h>
        !            71:
        !            72: #include <dev/wscons/wsconsio.h>
        !            73: #include <dev/wscons/wskbdvar.h>
        !            74: #include <dev/wscons/wsksymdef.h>
        !            75: #include <dev/wscons/wsksymvar.h>
        !            76: #include <vax/dec/wskbdmap_lk201.h>
        !            77:
        !            78: #include <machine/bus.h>
        !            79:
        !            80: #include <vax/dec/lk201reg.h>
        !            81: #include <vax/dec/lk201var.h>
        !            82:
        !            83: #include <vax/vxt/qscvar.h>
        !            84:
        !            85: struct qsckbd_internal {
        !            86:        u_int   dzi_line;
        !            87:        struct lk201_state dzi_ks;
        !            88: };
        !            89:
        !            90: struct qsckbd_internal qsckbd_console_internal;
        !            91:
        !            92: struct qsckbd_softc {
        !            93:        struct device qsckbd_dev;       /* required first: base device */
        !            94:
        !            95:        struct qsckbd_internal *sc_itl;
        !            96:        int sc_enabled;
        !            97:        struct device *sc_wskbddev;
        !            98: };
        !            99:
        !           100: int    qsckbd_match(struct device *, void *, void *);
        !           101: void   qsckbd_attach(struct device *, struct device *, void *);
        !           102:
        !           103: struct cfattach qsckbd_ca = {
        !           104:        sizeof(struct qsckbd_softc), qsckbd_match, qsckbd_attach,
        !           105: };
        !           106:
        !           107: int    qsckbd_enable(void *, int);
        !           108: void   qsckbd_set_leds(void *, int);
        !           109: int    qsckbd_ioctl(void *, u_long, caddr_t, int, struct proc *);
        !           110:
        !           111: const struct wskbd_accessops qsckbd_accessops = {
        !           112:        qsckbd_enable,
        !           113:        qsckbd_set_leds,
        !           114:        qsckbd_ioctl,
        !           115: };
        !           116:
        !           117: void   qsckbd_cngetc(void *, u_int *, int *);
        !           118: void   qsckbd_cnpollc(void *, int);
        !           119:
        !           120: const struct wskbd_consops qsckbd_consops = {
        !           121:        qsckbd_cngetc,
        !           122:        qsckbd_cnpollc,
        !           123: };
        !           124:
        !           125: const struct wskbd_mapdata qsckbd_keymapdata = {
        !           126:        lkkbd_keydesctab,
        !           127: #ifdef LKKBD_LAYOUT
        !           128:        LKKBD_LAYOUT,
        !           129: #else
        !           130:        KB_US,
        !           131: #endif
        !           132: };
        !           133:
        !           134: int    qsckbd_input(void *, int);
        !           135: int    qsckbd_sendchar(void *, int);
        !           136:
        !           137: int
        !           138: qsckbd_match(struct device *parent, void *vcf, void *aux)
        !           139: {
        !           140:        struct qsc_attach_args *qa = aux;
        !           141:        struct cfdata *cf = vcf;
        !           142:
        !           143:        if (cf->cf_loc[0] == qa->qa_line)
        !           144:                return 1;
        !           145:
        !           146:        return 0;
        !           147: }
        !           148:
        !           149: void
        !           150: qsckbd_attach(struct device *parent, struct device *self, void *aux)
        !           151: {
        !           152:        struct qsckbd_softc *sc = (void *)self;
        !           153:        struct qsc_attach_args *qa = aux;
        !           154:        struct qsckbd_internal *dzi;
        !           155:        struct wskbddev_attach_args a;
        !           156:        int isconsole;
        !           157:
        !           158:        qa->qa_hook->fn = qsckbd_input;
        !           159:        qa->qa_hook->arg = self;
        !           160:
        !           161:        isconsole = qa->qa_console;
        !           162:
        !           163:        if (isconsole) {
        !           164:                dzi = &qsckbd_console_internal;
        !           165:                sc->sc_enabled = 1;
        !           166:        } else {
        !           167:                dzi = malloc(sizeof(struct qsckbd_internal), M_DEVBUF, M_NOWAIT);
        !           168:                if (dzi == NULL) {
        !           169:                        printf(": out of memory\n");
        !           170:                        return;
        !           171:                }
        !           172:                dzi->dzi_ks.attmt.sendchar = qsckbd_sendchar;
        !           173:                dzi->dzi_ks.attmt.cookie = (void *)qa->qa_line;
        !           174:        }
        !           175:        dzi->dzi_ks.device = self;
        !           176:        dzi->dzi_line = qa->qa_line;
        !           177:        sc->sc_itl = dzi;
        !           178:
        !           179:        printf("\n");
        !           180:
        !           181:        if (!isconsole)
        !           182:                lk201_init(&dzi->dzi_ks);
        !           183:
        !           184:        a.console = dzi == &qsckbd_console_internal;
        !           185:        a.keymap = &qsckbd_keymapdata;
        !           186:        a.accessops = &qsckbd_accessops;
        !           187:        a.accesscookie = sc;
        !           188:
        !           189:        sc->sc_wskbddev = config_found(self, &a, wskbddevprint);
        !           190: }
        !           191:
        !           192: int
        !           193: qsckbd_cnattach(u_int line)
        !           194: {
        !           195:
        !           196:        qsckbd_console_internal.dzi_ks.attmt.sendchar = qsckbd_sendchar;
        !           197:        qsckbd_console_internal.dzi_ks.attmt.cookie = (void *)line;
        !           198:        lk201_init(&qsckbd_console_internal.dzi_ks);
        !           199:        qsckbd_console_internal.dzi_line = line;
        !           200:
        !           201:        wskbd_cnattach(&qsckbd_consops, &qsckbd_console_internal,
        !           202:            &qsckbd_keymapdata);
        !           203:
        !           204:        return 0;
        !           205: }
        !           206:
        !           207: int
        !           208: qsckbd_enable(void *v, int on)
        !           209: {
        !           210:        struct qsckbd_softc *sc = v;
        !           211:
        !           212:        sc->sc_enabled = on;
        !           213:        return 0;
        !           214: }
        !           215:
        !           216: void
        !           217: qsckbd_cngetc(void *v, u_int *type, int *data)
        !           218: {
        !           219:        struct qsckbd_internal *dzi = v;
        !           220:        int c;
        !           221:
        !           222:        do {
        !           223:                c = qscgetc(dzi->dzi_line);
        !           224:        } while (lk201_decode(&dzi->dzi_ks, 1, 0, c, type, data) == LKD_NODATA);
        !           225: }
        !           226:
        !           227: void
        !           228: qsckbd_cnpollc(void *v, int on)
        !           229: {
        !           230: }
        !           231:
        !           232: void
        !           233: qsckbd_set_leds(void *v, int leds)
        !           234: {
        !           235:        struct qsckbd_softc *sc = (struct qsckbd_softc *)v;
        !           236:
        !           237:        lk201_set_leds(&sc->sc_itl->dzi_ks, leds);
        !           238: }
        !           239:
        !           240: int
        !           241: qsckbd_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p)
        !           242: {
        !           243:        struct qsckbd_softc *sc = (struct qsckbd_softc *)v;
        !           244:
        !           245:        switch (cmd) {
        !           246:        case WSKBDIO_GTYPE:
        !           247:                *(int *)data = lk201_get_type(&sc->sc_itl->dzi_ks);
        !           248:                return 0;
        !           249:        case WSKBDIO_SETLEDS:
        !           250:                lk201_set_leds(&sc->sc_itl->dzi_ks, *(int *)data);
        !           251:                return 0;
        !           252:        case WSKBDIO_GETLEDS:
        !           253:                *(int *)data = lk201_get_leds(&sc->sc_itl->dzi_ks);
        !           254:                return 0;
        !           255:        case WSKBDIO_COMPLEXBELL:
        !           256:                lk201_bell(&sc->sc_itl->dzi_ks,
        !           257:                           (struct wskbd_bell_data *)data);
        !           258:                return 0;
        !           259:        }
        !           260:        return -1;
        !           261: }
        !           262:
        !           263: int
        !           264: qsckbd_input(void *v, int data)
        !           265: {
        !           266:        struct qsckbd_softc *sc = (struct qsckbd_softc *)v;
        !           267:        u_int type;
        !           268:        int val;
        !           269:        int decode;
        !           270:
        !           271:        /*
        !           272:         * We want to run through lk201_decode always, so that a late plugged
        !           273:         * keyboard will get configured correctly.
        !           274:         */
        !           275:        do {
        !           276:                decode = lk201_decode(&sc->sc_itl->dzi_ks, sc->sc_enabled, 1,
        !           277:                    data, &type, &val);
        !           278:                if (decode != LKD_NODATA)
        !           279:                        wskbd_input(sc->sc_wskbddev, type, val);
        !           280:        } while (decode == LKD_MORE);
        !           281:
        !           282:        return(1);
        !           283: }
        !           284:
        !           285: int
        !           286: qsckbd_sendchar(void *v, int c)
        !           287: {
        !           288:        qscputc((u_int)v, c);
        !           289:        return (0);
        !           290: }

CVSweb