[BACK]Return to sunkbd.c CVS log [TXT][DIR] Up to [local] / sys / dev / sun

Annotation of sys/dev/sun/sunkbd.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: sunkbd.c,v 1.21 2005/11/11 16:44:51 miod Exp $        */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 2002 Jason L. Wright (jason@thought.net)
        !             5:  * All rights reserved.
        !             6:  *
        !             7:  * Redistribution and use in source and binary forms, with or without
        !             8:  * modification, are permitted provided that the following conditions
        !             9:  * are met:
        !            10:  * 1. Redistributions of source code must retain the above copyright
        !            11:  *    notice, this list of conditions and the following disclaimer.
        !            12:  * 2. Redistributions in binary form must reproduce the above copyright
        !            13:  *    notice, this list of conditions and the following disclaimer in the
        !            14:  *    documentation and/or other materials provided with the distribution.
        !            15:  *
        !            16:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            17:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
        !            18:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
        !            19:  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
        !            20:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
        !            21:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
        !            22:  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            23:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
        !            24:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
        !            25:  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            26:  * POSSIBILITY OF SUCH DAMAGE.
        !            27:  *
        !            28:  * Effort sponsored in part by the Defense Advanced Research Projects
        !            29:  * Agency (DARPA) and Air Force Research Laboratory, Air Force
        !            30:  * Materiel Command, USAF, under agreement number F30602-01-2-0537.
        !            31:  *
        !            32:  */
        !            33:
        !            34: #include <sys/param.h>
        !            35: #include <sys/systm.h>
        !            36: #include <sys/device.h>
        !            37: #include <sys/kernel.h>
        !            38: #include <sys/timeout.h>
        !            39:
        !            40: #include <dev/wscons/wsconsio.h>
        !            41: #include <dev/wscons/wskbdvar.h>
        !            42:
        !            43: #include <dev/sun/sunkbdreg.h>
        !            44: #include <dev/sun/sunkbdvar.h>
        !            45:
        !            46: #ifdef __sparc64__
        !            47: #define        NTCTRL 0
        !            48: #else
        !            49: #include "tctrl.h"
        !            50: #endif
        !            51:
        !            52: #if NTCTRL > 0
        !            53: #include <sparc/dev/tctrlvar.h>                /* XXX for tadpole_bell() */
        !            54: #endif
        !            55:
        !            56: void   sunkbd_bell(struct sunkbd_softc *, u_int, u_int, u_int);
        !            57: int    sunkbd_enable(void *, int);
        !            58: int    sunkbd_getleds(struct sunkbd_softc *);
        !            59: int    sunkbd_ioctl(void *, u_long, caddr_t, int, struct proc *);
        !            60: void   sunkbd_setleds(void *, int);
        !            61:
        !            62: struct wskbd_accessops sunkbd_accessops = {
        !            63:        sunkbd_enable,
        !            64:        sunkbd_setleds,
        !            65:        sunkbd_ioctl
        !            66: };
        !            67:
        !            68: void
        !            69: sunkbd_bell(struct sunkbd_softc *sc, u_int period, u_int pitch, u_int volume)
        !            70: {
        !            71:        int ticks, s;
        !            72:        u_int8_t c = SKBD_CMD_BELLON;
        !            73:
        !            74: #if NTCTRL > 0
        !            75:        if (tadpole_bell(period / 10, pitch, volume) != 0)
        !            76:                return;
        !            77: #endif
        !            78:
        !            79:        s = spltty();
        !            80:        if (sc->sc_bellactive) {
        !            81:                if (sc->sc_belltimeout == 0)
        !            82:                        timeout_del(&sc->sc_bellto);
        !            83:        }
        !            84:        if (pitch == 0 || period == 0) {
        !            85:                sunkbd_bellstop(sc);
        !            86:                splx(s);
        !            87:                return;
        !            88:        }
        !            89:        if (sc->sc_bellactive == 0) {
        !            90:                ticks = (period * hz) / 1000;
        !            91:                if (ticks <= 0)
        !            92:                        ticks = 1;
        !            93:
        !            94:                sc->sc_bellactive = 1;
        !            95:                sc->sc_belltimeout = 1;
        !            96:                (*sc->sc_sendcmd)(sc, &c, 1);
        !            97:                timeout_add(&sc->sc_bellto, ticks);
        !            98:        }
        !            99:        splx(s);
        !           100: }
        !           101:
        !           102: void
        !           103: sunkbd_bellstop(void *v)
        !           104: {
        !           105:        struct sunkbd_softc *sc = v;
        !           106:        int s;
        !           107:        u_int8_t c;
        !           108:
        !           109:        s = spltty();
        !           110:        sc->sc_belltimeout = 0;
        !           111:        c = SKBD_CMD_BELLOFF;
        !           112:        (*sc->sc_sendcmd)(v, &c, 1);
        !           113:        sc->sc_bellactive = 0;
        !           114:        splx(s);
        !           115: }
        !           116:
        !           117: void
        !           118: sunkbd_decode(u_int8_t c, u_int *type, int *value)
        !           119: {
        !           120:        switch (c) {
        !           121:        case SKBD_RSP_IDLE:
        !           122:                *type = WSCONS_EVENT_ALL_KEYS_UP;
        !           123:                *value = 0;
        !           124:                break;
        !           125:        default:
        !           126:                *type = (c & 0x80) ?
        !           127:                    WSCONS_EVENT_KEY_UP : WSCONS_EVENT_KEY_DOWN;
        !           128:                *value = c & 0x7f;
        !           129:                break;
        !           130:        }
        !           131: }
        !           132:
        !           133: int
        !           134: sunkbd_enable(void *v, int on)
        !           135: {
        !           136:        return (0);
        !           137: }
        !           138:
        !           139: int
        !           140: sunkbd_getleds(struct sunkbd_softc *sc)
        !           141: {
        !           142:        return (sc->sc_leds);
        !           143: }
        !           144:
        !           145: int
        !           146: sunkbd_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p)
        !           147: {
        !           148:        struct sunkbd_softc *sc = v;
        !           149:        int *d_int = (int *)data;
        !           150:        struct wskbd_bell_data *d_bell = (struct wskbd_bell_data *)data;
        !           151:
        !           152:        switch (cmd) {
        !           153:        case WSKBDIO_GTYPE:
        !           154:                if (ISTYPE5(sc->sc_layout)) {
        !           155:                        *d_int = WSKBD_TYPE_SUN5;
        !           156:                } else {
        !           157:                        *d_int = WSKBD_TYPE_SUN;
        !           158:                }
        !           159:                return (0);
        !           160:        case WSKBDIO_SETLEDS:
        !           161:                sunkbd_setleds(sc, *d_int);
        !           162:                return (0);
        !           163:        case WSKBDIO_GETLEDS:
        !           164:                *d_int = sunkbd_getleds(sc);
        !           165:                return (0);
        !           166:        case WSKBDIO_COMPLEXBELL:
        !           167:                sunkbd_bell(sc, d_bell->period, d_bell->pitch, d_bell->volume);
        !           168:                return (0);
        !           169:        }
        !           170:
        !           171:        return (-1);
        !           172: }
        !           173:
        !           174: void
        !           175: sunkbd_raw(struct sunkbd_softc *sc, u_int8_t c)
        !           176: {
        !           177:        int claimed = 0;
        !           178:
        !           179:        if (sc->sc_kbdstate == SKBD_STATE_LAYOUT) {
        !           180:                sc->sc_kbdstate = SKBD_STATE_GETKEY;
        !           181:                sc->sc_layout = c;
        !           182:                return;
        !           183:        }
        !           184:
        !           185:        switch (c) {
        !           186:        case SKBD_RSP_RESET:
        !           187:                sc->sc_kbdstate = SKBD_STATE_RESET;
        !           188:                claimed = 1;
        !           189:                break;
        !           190:        case SKBD_RSP_LAYOUT:
        !           191:                sc->sc_kbdstate = SKBD_STATE_LAYOUT;
        !           192:                claimed = 1;
        !           193:                break;
        !           194:        case SKBD_RSP_IDLE:
        !           195:                sc->sc_kbdstate = SKBD_STATE_GETKEY;
        !           196:                claimed = 1;
        !           197:        }
        !           198:
        !           199:        if (claimed)
        !           200:                return;
        !           201:
        !           202:        switch (sc->sc_kbdstate) {
        !           203:        case SKBD_STATE_RESET:
        !           204:                sc->sc_kbdstate = SKBD_STATE_GETKEY;
        !           205:                if (c < KB_SUN2 || c > KB_SUN4)
        !           206:                        printf("%s: reset: invalid keyboard type 0x%02x\n",
        !           207:                            sc->sc_dev.dv_xname, c);
        !           208:                else
        !           209:                        sc->sc_id = c;
        !           210:                break;
        !           211:        case SKBD_STATE_GETKEY:
        !           212:                break;
        !           213:        }
        !           214: }
        !           215:
        !           216: int
        !           217: sunkbd_setclick(struct sunkbd_softc *sc, int click)
        !           218: {
        !           219:        u_int8_t c;
        !           220:
        !           221:        /* Type 2 keyboards do not support keyclick */
        !           222:        if (sc->sc_id == KB_SUN2)
        !           223:                return (ENXIO);
        !           224:
        !           225:        c = click ? SKBD_CMD_CLICKON : SKBD_CMD_CLICKOFF;
        !           226:        (*sc->sc_sendcmd)(sc, &c, 1);
        !           227:        return (0);
        !           228: }
        !           229:
        !           230: void
        !           231: sunkbd_setleds(void *v, int wled)
        !           232: {
        !           233:        struct sunkbd_softc *sc = v;
        !           234:        u_int8_t sled = 0;
        !           235:        u_int8_t cmd[2];
        !           236:
        !           237:        sc->sc_leds = wled;
        !           238:
        !           239:        if (wled & WSKBD_LED_CAPS)
        !           240:                sled |= SKBD_LED_CAPSLOCK;
        !           241:        if (wled & WSKBD_LED_NUM)
        !           242:                sled |= SKBD_LED_NUMLOCK;
        !           243:        if (wled & WSKBD_LED_SCROLL)
        !           244:                sled |= SKBD_LED_SCROLLLOCK;
        !           245:        if (wled & WSKBD_LED_COMPOSE)
        !           246:                sled |= SKBD_LED_COMPOSE;
        !           247:
        !           248:        cmd[0] = SKBD_CMD_SETLED;
        !           249:        cmd[1] = sled;
        !           250:        (*sc->sc_sendcmd)(sc, cmd, sizeof(cmd));
        !           251: }

CVSweb