From e8dd1b88bd968b7449a1c61238b069d768c2931c Mon Sep 17 00:00:00 2001 From: Hugh Graham Date: Wed, 16 May 2001 22:15:20 +0000 Subject: Blind merge of wscons support from NetBSD/vax. Perhaps someone with a supported framebuffer (simple monochrome) can finish this off. If anyone has run across docs for LCG or SPGFX, please get in touch. --- sys/arch/vax/dec/dzkbd.c | 325 ++++++++++++++++++++++++++++++++++++++ sys/arch/vax/dec/dzkbdvar.h | 18 +++ sys/arch/vax/dec/dzms.c | 269 +++++++++++++++++++++++++++++++ sys/arch/vax/dec/files.dec | 17 ++ sys/arch/vax/dec/lk201.h | 146 +++++++++++++++++ sys/arch/vax/dec/lk201_ws.c | 179 +++++++++++++++++++++ sys/arch/vax/dec/lk201reg.h | 64 ++++++++ sys/arch/vax/dec/lk201var.h | 52 ++++++ sys/arch/vax/dec/wskbdmap_lk201.c | 137 ++++++++++++++++ sys/arch/vax/dec/wskbdmap_lk201.h | 7 + 10 files changed, 1214 insertions(+) create mode 100644 sys/arch/vax/dec/dzkbd.c create mode 100644 sys/arch/vax/dec/dzkbdvar.h create mode 100644 sys/arch/vax/dec/dzms.c create mode 100644 sys/arch/vax/dec/files.dec create mode 100644 sys/arch/vax/dec/lk201.h create mode 100644 sys/arch/vax/dec/lk201_ws.c create mode 100644 sys/arch/vax/dec/lk201reg.h create mode 100644 sys/arch/vax/dec/lk201var.h create mode 100644 sys/arch/vax/dec/wskbdmap_lk201.c create mode 100644 sys/arch/vax/dec/wskbdmap_lk201.h (limited to 'sys/arch/vax/dec') diff --git a/sys/arch/vax/dec/dzkbd.c b/sys/arch/vax/dec/dzkbd.c new file mode 100644 index 00000000000..b96949d9848 --- /dev/null +++ b/sys/arch/vax/dec/dzkbd.c @@ -0,0 +1,325 @@ +/* $OpenBSD: dzkbd.c,v 1.1 2001/05/16 22:15:17 hugh Exp $ */ +/* $NetBSD: dzkbd.c,v 1.1 2000/12/02 17:03:55 ragge Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)kbd.c 8.2 (Berkeley) 10/30/93 + */ + +/* + * LK200/LK400 keyboard attached to line 0 of the DZ*-11 + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include "../dec/wskbdmap_lk201.h" + +#include + +#include "../qbus/dzreg.h" +#include "../qbus/dzvar.h" + +#include "../dec/dzkbdvar.h" +#include "../dec/lk201reg.h" +#include "../dec/lk201var.h" + +struct dzkbd_internal { + struct dz_linestate *dzi_ls; + struct lk201_state dzi_ks; +}; + +struct dzkbd_internal dzkbd_console_internal; + +struct dzkbd_softc { + struct device dzkbd_dev; /* required first: base device */ + + struct dzkbd_internal *sc_itl; + + int sc_enabled; + int kbd_type; + + struct device *sc_wskbddev; +}; + +static int dzkbd_input __P((void *, int)); + +static int dzkbd_match __P((struct device *, struct cfdata *, void *)); +static void dzkbd_attach __P((struct device *, struct device *, void *)); + +struct cfattach dzkbd_ca = { + sizeof(struct dzkbd_softc), (cfmatch_t)dzkbd_match, dzkbd_attach, +}; + +struct cfdriver lkkbd_cd = { + NULL, "lkkbd", DV_DULL +}; + +static int dzkbd_enable __P((void *, int)); +static void dzkbd_set_leds __P((void *, int)); +static int dzkbd_ioctl __P((void *, u_long, caddr_t, int, struct proc *)); + +const struct wskbd_accessops dzkbd_accessops = { + dzkbd_enable, + dzkbd_set_leds, + dzkbd_ioctl, +}; + +static void dzkbd_cngetc(void *, u_int *, int *); +static void dzkbd_cnpollc(void *, int); + +const struct wskbd_consops dzkbd_consops = { + dzkbd_cngetc, + dzkbd_cnpollc, +}; + +static int dzkbd_sendchar __P((void *, u_char)); + +const struct wskbd_mapdata dzkbd_keymapdata = { + zskbd_keydesctab, +#ifdef DZKBD_LAYOUT + DZKBD_LAYOUT, +#else + KB_US | KB_LK401, +#endif +}; + +/* + * kbd_match: how is this dz line configured? + */ +static int +dzkbd_match(struct device *parent, struct cfdata *cf, void *aux) +{ + struct dzkm_attach_args *daa = aux; + +#define DZCF_LINE 0 +#define DZCF_LINE_DEFAULT 0 + + /* Exact match is better than wildcard. */ + if (cf->cf_loc[DZCF_LINE] == daa->daa_line) + return 2; + + /* This driver accepts wildcard. */ + if (cf->cf_loc[DZCF_LINE] == DZCF_LINE_DEFAULT) + return 1; + + return 0; +} + +static void +dzkbd_attach(struct device *parent, struct device *self, void *aux) +{ + struct dz_softc *dz = (void *)parent; + struct dzkbd_softc *dzkbd = (void *)self; + struct dzkm_attach_args *daa = aux; + struct dz_linestate *ls; + struct dzkbd_internal *dzi; + struct wskbddev_attach_args a; + int isconsole; + + dz->sc_dz[daa->daa_line].dz_catch = dzkbd_input; + dz->sc_dz[daa->daa_line].dz_private = dzkbd; + ls = &dz->sc_dz[daa->daa_line]; + + isconsole = (daa->daa_flags & DZKBD_CONSOLE); + + if (isconsole) { + dzi = &dzkbd_console_internal; + } else { + dzi = malloc(sizeof(struct dzkbd_internal), + M_DEVBUF, M_NOWAIT); + dzi->dzi_ks.attmt.sendchar = dzkbd_sendchar; + dzi->dzi_ks.attmt.cookie = ls; + dzi->dzi_ls = ls; + } + dzkbd->sc_itl = dzi; + + printf("\n"); + + if (!isconsole) + lk201_init(&dzi->dzi_ks); + + /* XXX should identify keyboard ID here XXX */ + /* XXX layout and the number of LED is varying XXX */ + + dzkbd->kbd_type = WSKBD_TYPE_LK201; + + dzkbd->sc_enabled = 1; + + a.console = isconsole; + a.keymap = &dzkbd_keymapdata; + a.accessops = &dzkbd_accessops; + a.accesscookie = dzkbd; + + dzkbd->sc_wskbddev = config_found(self, &a, wskbddevprint); +} + +int +dzkbd_cnattach(ls) + struct dz_linestate *ls; +{ + + dzkbd_console_internal.dzi_ks.attmt.sendchar = dzkbd_sendchar; + dzkbd_console_internal.dzi_ks.attmt.cookie = ls; + lk201_init(&dzkbd_console_internal.dzi_ks); + dzkbd_console_internal.dzi_ls = ls; + + wskbd_cnattach(&dzkbd_consops, &dzkbd_console_internal, + &dzkbd_keymapdata); + + return 0; +} + +static int +dzkbd_enable(v, on) + void *v; + int on; +{ + struct dzkbd_softc *sc = v; + + sc->sc_enabled = on; + return 0; +} + +static int +dzkbd_sendchar(v, c) + void *v; + u_char c; +{ + struct dz_linestate *ls = v; + int s; + + s = spltty(); + dzputc(ls, c); + splx(s); + return (0); +} + +static void +dzkbd_cngetc(v, type, data) + void *v; + u_int *type; + int *data; +{ + struct dzkbd_internal *dzi = v; + int c; + + do { + c = dzgetc(dzi->dzi_ls); + } while (!lk201_decode(&dzi->dzi_ks, c, type, data)); +} + +static void +dzkbd_cnpollc(v, on) + void *v; + int on; +{ +#if 0 + struct dzkbd_internal *dzi = v; +#endif +} + +static void +dzkbd_set_leds(v, leds) + void *v; + int leds; +{ + struct dzkbd_softc *sc = (struct dzkbd_softc *)v; + +//printf("dzkbd_set_leds\n"); + lk201_set_leds(&sc->sc_itl->dzi_ks, leds); +} + +static int +dzkbd_ioctl(v, cmd, data, flag, p) + void *v; + u_long cmd; + caddr_t data; + int flag; + struct proc *p; +{ + struct dzkbd_softc *sc = (struct dzkbd_softc *)v; + + switch (cmd) { + case WSKBDIO_GTYPE: + *(int *)data = sc->kbd_type; + return 0; + case WSKBDIO_SETLEDS: + lk201_set_leds(&sc->sc_itl->dzi_ks, *(int *)data); + return 0; + case WSKBDIO_GETLEDS: + /* XXX don't dig in kbd internals */ + *(int *)data = sc->sc_itl->dzi_ks.leds_state; + return 0; + case WSKBDIO_COMPLEXBELL: + lk201_bell(&sc->sc_itl->dzi_ks, + (struct wskbd_bell_data *)data); + return 0; + } + return -1; +} + +static int +dzkbd_input(v, data) + void *v; + int data; +{ + struct dzkbd_softc *sc = (struct dzkbd_softc *)v; + u_int type; + int val; + + if (sc->sc_enabled == 0) + return(0); + + if (lk201_decode(&sc->sc_itl->dzi_ks, data, &type, &val)) + wskbd_input(sc->sc_wskbddev, type, val); + return(1); +} + diff --git a/sys/arch/vax/dec/dzkbdvar.h b/sys/arch/vax/dec/dzkbdvar.h new file mode 100644 index 00000000000..e0de4e9b7bf --- /dev/null +++ b/sys/arch/vax/dec/dzkbdvar.h @@ -0,0 +1,18 @@ +/* $OpenBSD: dzkbdvar.h,v 1.1 2001/05/16 22:15:17 hugh Exp $ */ +/* $NetBSD: dzkbdvar.h,v 1.2 2001/03/06 07:40:52 matt Exp $ */ + +struct dzkm_attach_args { + int daa_line; /* Line to search */ + int daa_flags; /* Console etc...*/ +#define DZKBD_CONSOLE 1 +}; + + + +/* These functions must be present for the keyboard/mouse to work */ +int dzgetc(struct dz_linestate *); +void dzputc(struct dz_linestate *, int); +void dzsetlpr(struct dz_linestate *, int); + +/* Exported functions */ +int dzkbd_cnattach(struct dz_linestate *); diff --git a/sys/arch/vax/dec/dzms.c b/sys/arch/vax/dec/dzms.c new file mode 100644 index 00000000000..60abd4f0901 --- /dev/null +++ b/sys/arch/vax/dec/dzms.c @@ -0,0 +1,269 @@ +/* $OpenBSD: dzms.c,v 1.1 2001/05/16 22:15:17 hugh Exp $ */ +/* $NetBSD: dzms.c,v 1.1 2000/12/02 17:03:55 ragge Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ms.c 8.1 (Berkeley) 6/11/93 + */ + +/* + * VSXXX mice attached to line 1 of the DZ* + */ + +#include +#include +#include +#include +#include + +#include + +#include "../qbus/dzreg.h" +#include "../qbus/dzvar.h" + +#include "../dec/dzkbdvar.h" +#include "../dec/lk201.h" + +#include +#include + +struct dzms_softc { /* driver status information */ + struct device dzms_dev; /* required first: base device */ + struct dz_linestate *dzms_ls; + + int sc_enabled; /* input enabled? */ + int self_test; + + int inputstate; + u_int buttons; + signed char dx; + signed char dy; + + struct device *sc_wsmousedev; +}; + +static int dzms_match __P((struct device *, struct cfdata *, void *)); +static void dzms_attach __P((struct device *, struct device *, void *)); +static int dzms_input __P((void *, int)); + +struct cfattach dzms_ca = { + sizeof(struct dzms_softc), (cfmatch_t)dzms_match, dzms_attach, +}; + +struct cfdriver lkms_cd = { + NULL, "lkms", DV_DULL +}; + +static int dzms_enable __P((void *)); +static int dzms_ioctl __P((void *, u_long, caddr_t, int, struct proc *)); +static void dzms_disable __P((void *)); + +const struct wsmouse_accessops dzms_accessops = { + dzms_enable, + dzms_ioctl, + dzms_disable, +}; + +static int +dzms_match(parent, cf, aux) + struct device *parent; + struct cfdata *cf; + void *aux; +{ + struct dzkm_attach_args *daa = aux; + +#define DZCF_LINE 0 +#define DZCF_LINE_DEFAULT 0 + + /* Exact match is better than wildcard. */ + if (cf->cf_loc[DZCF_LINE] == daa->daa_line) + return 2; + + /* This driver accepts wildcard. */ + if (cf->cf_loc[DZCF_LINE] == DZCF_LINE_DEFAULT) + return 1; + + return 0; +} + +static void +dzms_attach(parent, self, aux) + struct device *parent, *self; + void *aux; +{ + struct dz_softc *dz = (void *)parent; + struct dzms_softc *dzms = (void *)self; + struct dzkm_attach_args *daa = aux; + struct dz_linestate *ls; + struct wsmousedev_attach_args a; + + dz->sc_dz[daa->daa_line].dz_catch = dzms_input; + dz->sc_dz[daa->daa_line].dz_private = dzms; + ls = &dz->sc_dz[daa->daa_line]; + dzms->dzms_ls = ls; + + printf("\n"); + + a.accessops = &dzms_accessops; + a.accesscookie = dzms; + + dzms->sc_enabled = 0; + dzms->self_test = 0; + dzms->sc_wsmousedev = config_found(self, &a, wsmousedevprint); +} + +static int +dzms_enable(v) + void *v; +{ + struct dzms_softc *sc = v; + + if (sc->sc_enabled) + return EBUSY; + + /* XXX mice presence test should be done in match/attach context XXX */ + sc->self_test = 1; + dzputc(sc->dzms_ls, MOUSE_SELF_TEST); + DELAY(100000); + if (sc->self_test < 0) { + sc->self_test = 0; + return EBUSY; + } else if (sc->self_test == 5) { + sc->self_test = 0; + sc->sc_enabled = 1; + } + sc->inputstate = 0; + + dzputc(sc->dzms_ls, MOUSE_INCREMENTAL); + + return 0; +} + +static void +dzms_disable(v) + void *v; +{ + struct dzms_softc *sc = v; + + sc->sc_enabled = 0; +} + +static int +dzms_ioctl(v, cmd, data, flag, p) + void *v; + u_long cmd; + caddr_t data; + int flag; + struct proc *p; +{ + if (cmd == WSMOUSEIO_GTYPE) { + *(u_int *)data = WSMOUSE_TYPE_VSXXX; + return 0; + } + return -1; +} + +static int +dzms_input(vsc, data) + void *vsc; + int data; +{ + struct dzms_softc *sc = vsc; + + /* XXX mice presence test should be done in match/attach context XXX */ + if (!sc->sc_enabled) { + if (sc->self_test > 0) { + if (data < 0) { + printf("Timeout on 1st byte of mouse self-test report\n"); + sc->self_test = -1; + } else { + sc->self_test++; + } + } + if (sc->self_test == 3) { + if ((data & 0x0f) != 0x2) { + printf("We don't have a mouse!!!\n"); + sc->self_test = -1; + } + } + /* Interrupts are not expected. Discard the byte. */ + return(1); + } + +#define WSMS_BUTTON1 0x01 +#define WSMS_BUTTON2 0x02 +#define WSMS_BUTTON3 0x04 + + if ((data & MOUSE_START_FRAME) != 0) + sc->inputstate = 1; + else + sc->inputstate++; + + if (sc->inputstate == 1) { + sc->buttons = 0; + if ((data & LEFT_BUTTON) != 0) + sc->buttons |= WSMS_BUTTON1; + if ((data & MIDDLE_BUTTON) != 0) + sc->buttons |= WSMS_BUTTON2; + if ((data & RIGHT_BUTTON) != 0) + sc->buttons |= WSMS_BUTTON3; + + sc->dx = data & MOUSE_X_SIGN; + sc->dy = data & MOUSE_Y_SIGN; + } else if (sc->inputstate == 2) { + if (sc->dx == 0) + sc->dx = -data; + else + sc->dx = data; + } else if (sc->inputstate == 3) { + sc->inputstate = 0; + if (sc->dy == 0) + sc->dy = -data; + else + sc->dy = data; + wsmouse_input(sc->sc_wsmousedev, sc->buttons, + sc->dx, sc->dy, 0, WSMOUSE_INPUT_DELTA); + } + + return(1); +} + diff --git a/sys/arch/vax/dec/files.dec b/sys/arch/vax/dec/files.dec new file mode 100644 index 00000000000..921a5580518 --- /dev/null +++ b/sys/arch/vax/dec/files.dec @@ -0,0 +1,17 @@ +# $OpenBSD: files.dec,v 1.1 2001/05/16 22:15:17 hugh Exp $ +# $NetBSD: files.dec,v 1.4 1999/08/04 07:17:51 nisimura Exp $ +# +# Config file and device description for machine-independent +# code for devices for Digital Equipment Corp. systems. +# Included by ports that need it. + +# Attribute for DEC lance padded-DMA copy functions. Lance attachments +# which need it should specify the le_de_subr attribute. +define le_dec_subr + +# DMA copy functions. Lance attachments qhich Decices +file arch/vax/dec/if_le_dec.c le_dec_subr + +# LK201 keyboard +file arch/vax/dec/lk201_ws.c lkkbd +file arch/vax/dec/wskbdmap_lk201.c lkkbd diff --git a/sys/arch/vax/dec/lk201.h b/sys/arch/vax/dec/lk201.h new file mode 100644 index 00000000000..ce901212c8e --- /dev/null +++ b/sys/arch/vax/dec/lk201.h @@ -0,0 +1,146 @@ +/* $OpenBSD: lk201.h,v 1.1 2001/05/16 22:15:17 hugh Exp $ */ +/* $NetBSD: lk201.h,v 1.7 1999/03/19 18:34:01 ad Exp $ */ + + +/* + * Ascii values of command keys. + */ +#define KBD_TAB '\t' +#define KBD_DEL 127 +#define KBD_RET '\r' + +/* + * Define "hardware-independent" codes for the control, shift, meta and + * function keys. Codes start after the last 7-bit ASCII code (127) + * and are assigned in an arbitrary order. + */ +#define KBD_NOKEY 128 + +#define KBD_F1 201 +#define KBD_F2 202 +#define KBD_F3 203 +#define KBD_F4 204 +#define KBD_F5 205 +#define KBD_F6 206 +#define KBD_F7 207 +#define KBD_F8 208 +#define KBD_F9 209 +#define KBD_F10 210 +#define KBD_F11 211 +#define KBD_F12 212 +#define KBD_F13 213 +#define KBD_F14 214 +#define KBD_HELP 215 +#define KBD_DO 216 +#define KBD_F17 217 +#define KBD_F18 218 +#define KBD_F19 219 +#define KBD_F20 220 + +#define KBD_FIND 221 +#define KBD_INSERT 222 +#define KBD_REMOVE 223 +#define KBD_SELECT 224 +#define KBD_PREVIOUS 225 +#define KBD_NEXT 226 + +#define KBD_KP_ENTER 227 +#define KBD_KP_F1 228 +#define KBD_KP_F2 229 +#define KBD_KP_F3 230 +#define KBD_KP_F4 231 +#define KBD_LEFT 232 +#define KBD_RIGHT 233 +#define KBD_DOWN 234 +#define KBD_UP 235 + +#define KBD_CONTROL 236 +#define KBD_SHIFT 237 +#define KBD_CAPSLOCK 238 +#define KBD_ALTERNATE 239 + + + +/* + * Definitions for the Keyboard and mouse. + */ +/* + * Special key values. + */ +#define KEY_R_SHIFT 0xab +#define KEY_SHIFT 0xae +#define KEY_CONTROL 0xaf +#define KEY_CAPSLOCK 0xb0 +#define KEY_R_ALT 0xb2 +#define KEY_UP 0xb3 +#define KEY_REPEAT 0xb4 +#define KEY_F1 0x56 +#define KEY_COMMAND KEY_F1 + +/* + * Lk201/301 keyboard + */ +#define LK_UPDOWN 0x86 /* bits for setting lk201 modes */ +#define LK_AUTODOWN 0x82 +#define LK_DOWN 0x80 +#define LK_DEFAULTS 0xd3 /* reset mode settings */ +#define LK_AR_ENABLE 0xe3 /* global auto repeat enable */ +#define LK_CL_ENABLE 0x1b /* keyclick enable */ +#define LK_KBD_ENABLE 0x8b /* keyboard enable */ +#define LK_BELL_ENABLE 0x23 /* the bell */ +#define LK_LED_ENABLE 0x13 /* light led */ +#define LK_LED_DISABLE 0x11 /* turn off led */ +#define LK_RING_BELL 0xa7 /* ring keyboard bell */ +#define LED_1 0x81 /* led bits */ +#define LED_2 0x82 +#define LED_3 0x84 +#define LED_4 0x88 +#define LED_ALL 0x8f +#define LK_HELP 0x7c /* help key */ +#define LK_DO 0x7d /* do key */ +#define LK_KDOWN_ERROR 0x3d /* key down on powerup error */ +#define LK_POWER_ERROR 0x3e /* keyboard failure on pwrup tst*/ +#define LK_OUTPUT_ERROR 0xb5 /* keystrokes lost during inhbt */ +#define LK_INPUT_ERROR 0xb6 /* garbage command to keyboard */ +#define LK_LOWEST 0x56 /* lowest significant keycode */ + +/* max volume is 0, lowest is 0x7 */ +#define LK_PARAM_VOLUME(v) (0x80|((v)&0x7)) + +/* mode command details */ +#define LK_CMD_MODE(m,div) ((m)|((div)<<3)) + + +/* + * Command characters for the mouse. + */ +#define MOUSE_SELF_TEST 'T' +#define MOUSE_INCREMENTAL 'R' + +/* + * Mouse output bits. + * + * MOUSE_START_FRAME Start of report frame bit. + * MOUSE_X_SIGN Sign bit for X. + * MOUSE_Y_SIGN Sign bit for Y. + * MOUSE_X_OFFSET X offset to start cursor at. + * MOUSE_Y_OFFSET Y offset to start cursor at. + */ +#define MOUSE_START_FRAME 0x80 +#define MOUSE_X_SIGN 0x10 +#define MOUSE_Y_SIGN 0x08 + +/* + * Definitions for mouse buttons + */ +#define EVENT_LEFT_BUTTON 0x01 +#define EVENT_MIDDLE_BUTTON 0x02 +#define EVENT_RIGHT_BUTTON 0x03 +#define RIGHT_BUTTON 0x01 +#define MIDDLE_BUTTON 0x02 +#define LEFT_BUTTON 0x04 + +#ifdef _KERNEL +extern int LKgetc __P((dev_t dev)); +extern void lkdivert __P ((int (*getc_fn)(dev_t dev), dev_t dev)); +#endif diff --git a/sys/arch/vax/dec/lk201_ws.c b/sys/arch/vax/dec/lk201_ws.c new file mode 100644 index 00000000000..0d9cfb56a5e --- /dev/null +++ b/sys/arch/vax/dec/lk201_ws.c @@ -0,0 +1,179 @@ +/* $OpenBSD: lk201_ws.c,v 1.1 2001/05/16 22:15:17 hugh Exp $ */ +/* $NetBSD: lk201_ws.c,v 1.2 1998/10/22 17:55:20 drochner Exp $ */ + +/* + * Copyright (c) 1998 + * Matthias Drochner. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed for the NetBSD Project + * by Matthias Drochner. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include +#include + +#include + +#include "../dec/lk201reg.h" +#include "../dec/lk201var.h" +#include "../dec/wskbdmap_lk201.h" /* for {MIN,MAX}_LK201_KEY */ + +#define send(lks, c) ((*((lks)->attmt.sendchar))((lks)->attmt.cookie, c)) + +int +lk201_init(lks) + struct lk201_state *lks; +{ + int i; + + send(lks, LK_LED_ENABLE); + send(lks, LK_LED_ALL); + + /* + * set all keys to updown mode; autorepeat is + * done by wskbd software + */ + for (i = 1; i <= 14; i++) + send(lks, LK_CMD_MODE(LK_UPDOWN, i)); + + send(lks, LK_CL_ENABLE); + send(lks, LK_PARAM_VOLUME(3)); + + lks->bellvol = -1; /* not yet set */ + + for (i = 0; i < LK_KLL; i++) + lks->down_keys_list[i] = -1; + send(lks, LK_KBD_ENABLE); + + send(lks, LK_LED_DISABLE); + send(lks, LK_LED_ALL); + lks->leds_state = 0; + + return (0); +} + +int +lk201_decode(lks, datain, type, dataout) + struct lk201_state *lks; + int datain; + u_int *type; + int *dataout; +{ + int i, freeslot; + + switch (datain) { + case LK_KEY_UP: + for (i = 0; i < LK_KLL; i++) + lks->down_keys_list[i] = -1; + *type = WSCONS_EVENT_ALL_KEYS_UP; + return (1); + case LK_POWER_UP: + printf("lk201_decode: powerup detected\n"); + lk201_init(lks); + return (0); + case LK_KDOWN_ERROR: + case LK_POWER_ERROR: + case LK_OUTPUT_ERROR: + case LK_INPUT_ERROR: + printf("lk201_decode: error %x\n", datain); + /* FALLTHRU */ + case LK_KEY_REPEAT: /* autorepeat handled by wskbd */ + case LK_MODE_CHANGE: /* ignore silently */ + return (0); + } + + if (datain < MIN_LK201_KEY || datain > MAX_LK201_KEY) { + printf("lk201_decode: %x\n", datain); + return (0); + } + + *dataout = datain - MIN_LK201_KEY; + + freeslot = -1; + for (i = 0; i < LK_KLL; i++) { + if (lks->down_keys_list[i] == datain) { + *type = WSCONS_EVENT_KEY_UP; + lks->down_keys_list[i] = -1; + return (1); + } + if (lks->down_keys_list[i] == -1 && freeslot == -1) + freeslot = i; + } + + if (freeslot == -1) { + printf("lk201_decode: down(%d) no free slot\n", datain); + return (0); + } + + *type = WSCONS_EVENT_KEY_DOWN; + lks->down_keys_list[freeslot] = datain; + return (1); +} + +void +lk201_bell(lks, bell) + struct lk201_state *lks; + struct wskbd_bell_data *bell; +{ + unsigned int vol; + + if (bell->which & WSKBD_BELL_DOVOLUME) { + vol = 8 - bell->volume * 8 / 100; + if (vol > 7) + vol = 7; + } else + vol = 3; + + if (vol != lks->bellvol) { + send(lks, LK_BELL_ENABLE); + send(lks, LK_PARAM_VOLUME(vol)); + lks->bellvol = vol; + } + send(lks, LK_RING_BELL); +} + +void +lk201_set_leds(lks, leds) + struct lk201_state *lks; + int leds; +{ + int newleds; + + newleds = 0; + if (leds & WSKBD_LED_SCROLL) + newleds |= LK_LED_WAIT; + if (leds & WSKBD_LED_CAPS) + newleds |= LK_LED_LOCK; + + send(lks, LK_LED_DISABLE); + send(lks, (0x80 | (~newleds & 0x0f))); + + send(lks, LK_LED_ENABLE); + send(lks, (0x80 | (newleds & 0x0f))); + + lks->leds_state = leds; +} diff --git a/sys/arch/vax/dec/lk201reg.h b/sys/arch/vax/dec/lk201reg.h new file mode 100644 index 00000000000..5bfdde2dbf4 --- /dev/null +++ b/sys/arch/vax/dec/lk201reg.h @@ -0,0 +1,64 @@ +/* $OpenBSD: lk201reg.h,v 1.1 2001/05/16 22:15:17 hugh Exp $ */ +/* $NetBSD: lk201reg.h,v 1.1 1998/09/17 20:01:57 drochner Exp $ */ + +/* + * command keycodes for Digital LK200/LK400 series keyboards. + */ + +/* + * special keycodes + */ +#define LK_POWER_UP 0x01 +#define LK_KEY_R_SHIFT 0xab +#define LK_KEY_SHIFT 0xae +#define LK_KEY_LOCK 0xb0 +#define LK_KEY_CONTROL 0xaf +#define LK_KEY_R_ALT 0xb2 +#define LK_KEY_UP 0xb3 +#define LK_KEY_REPEAT 0xb4 +#define LK_KEY_HOLD 0x56 /* F1 */ +#define LK_KDOWN_ERROR 0x3d /* key down on powerup error */ +#define LK_POWER_ERROR 0x3e /* keyboard failure on pwrup tst*/ +#define LK_OUTPUT_ERROR 0xb5 /* keystrokes lost during inhbt */ +#define LK_INPUT_ERROR 0xb6 /* garbage command to keyboard */ +#define LK_LOWEST 0x56 /* lowest significant keycode */ + +/* + * keyboard commands + */ +#define LK_UPDOWN 0x86 /* bits for setting lk201 modes */ +#define LK_AUTODOWN 0x82 +#define LK_DOWN 0x80 +#define LK_DEFAULTS 0xd3 /* reset mode settings */ +#define LK_AR_ENABLE 0xe3 /* global auto repeat enable */ +#define LK_CL_ENABLE 0x1b /* keyclick enable */ +#define LK_CL_DISABLE 0x99 /* keyclick disable */ +#define LK_CCL_ENABLE 0xbb /* enable keyclick for CTRL */ +#define LK_CCL_DISABLE 0xb9 /* disable keyclick for CTRL */ +#define LK_KBD_ENABLE 0x8b /* keyboard enable */ +#define LK_BELL_ENABLE 0x23 /* enable the bell */ +#define LK_BELL_DISABLE 0xa1 /* disable the bell */ +#define LK_LED_ENABLE 0x13 /* light led */ +#define LK_LED_DISABLE 0x11 /* turn off led */ +#define LK_RING_BELL 0xa7 /* ring keyboard bell */ +#define LK_LED_1 0x81 /* led bits */ +#define LK_LED_2 0x82 +#define LK_LED_3 0x84 +#define LK_LED_4 0x88 +#define LK_LED_WAIT 0x81 +#define LK_LED_COMP 0x82 +#define LK_LED_LOCK 0x84 +#define LK_LED_HOLD 0x88 +#define LK_LED_ALL 0x8f +#define LK_HELP 0x7c /* help key */ +#define LK_DO 0x7d /* do key */ +#define LK_DIV6_START 0xad /* start of div 6 */ +#define LK_DIV5_END 0xb2 /* end of div 5 */ +#define LK_ENABLE_401 0xe9 /* turn on LK401 mode */ +#define LK_MODE_CHANGE 0xba /* mode change ack */ + +/* max volume is 0, lowest is 0x7 */ +#define LK_PARAM_VOLUME(v) (0x80|((v)&0x7)) + +/* mode command details */ +#define LK_CMD_MODE(m,div) ((m)|((div)<<3)) diff --git a/sys/arch/vax/dec/lk201var.h b/sys/arch/vax/dec/lk201var.h new file mode 100644 index 00000000000..1bb10ca2b09 --- /dev/null +++ b/sys/arch/vax/dec/lk201var.h @@ -0,0 +1,52 @@ +/* $OpenBSD: lk201var.h,v 1.1 2001/05/16 22:15:17 hugh Exp $ */ +/* $NetBSD: lk201var.h,v 1.2 1998/10/22 17:55:20 drochner Exp $ */ + +/* + * Copyright (c) 1998 + * Matthias Drochner. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed for the NetBSD Project + * by Matthias Drochner. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +struct lk201_attachment { + int (*sendchar) __P((void *, u_char)); + void *cookie; +}; + +struct lk201_state { + struct lk201_attachment attmt; +#define LK_KLL 8 + int down_keys_list[LK_KLL]; + int bellvol; + int leds_state; +}; + +int lk201_init __P((struct lk201_state *)); +int lk201_decode __P((struct lk201_state *, int, u_int *, int *)); +void lk201_bell __P((struct lk201_state *, struct wskbd_bell_data *)); +void lk201_set_leds __P((struct lk201_state *, int)); diff --git a/sys/arch/vax/dec/wskbdmap_lk201.c b/sys/arch/vax/dec/wskbdmap_lk201.c new file mode 100644 index 00000000000..779418bc35e --- /dev/null +++ b/sys/arch/vax/dec/wskbdmap_lk201.c @@ -0,0 +1,137 @@ +/* $OpenBSD: wskbdmap_lk201.c,v 1.1 2001/05/16 22:15:17 hugh Exp $ */ +/* $NetBSD: wskbdmap_lk201.c,v 1.4 2000/12/02 16:57:41 ragge Exp $ */ + +#include +#include +#include +#include "../dec/wskbdmap_lk201.h" + +#define KC(n) KS_KEYCODE((n) - MIN_LK201_KEY) + +static const keysym_t zskbd_keydesc_us[] = { +/* pos command normal shifted */ + KC(86), KS_Cmd_Screen0, KS_f1, + KC(87), KS_Cmd_Screen1, KS_f2, + KC(88), KS_Cmd_Screen2, KS_f3, + KC(89), KS_Cmd_Screen3, KS_f4, + KC(90), KS_Cmd_Screen4, KS_f5, + KC(100), KS_Cmd_Screen5, KS_f6, + KC(101), KS_Cmd_Screen6, KS_f7, + KC(102), KS_Cmd_Screen7, KS_f8, + KC(103), KS_Cmd_Screen8, KS_f9, + KC(104), KS_Cmd_Screen9, KS_f10, + KC(113), KS_Cmd_Debugger, KS_Escape, /* F11 */ + KC(114), KS_f12, + KC(115), KS_f13, + KC(116), KS_f14, + KC(124), KS_Help, + KC(125), KS_Cmd, KS_Execute, + KC(128), KS_f17, + KC(129), KS_f18, + KC(130), KS_f19, + KC(131), KS_f20, + KC(138), KS_Find, + KC(139), KS_Insert, + KC(140), KS_KP_Delete, + KC(141), KS_Select, + KC(142), KS_Prior, + KC(143), KS_Next, + KC(146), KS_KP_0, + KC(148), KS_KP_Decimal, + KC(149), KS_KP_Enter, + KC(150), KS_KP_1, + KC(151), KS_KP_2, + KC(152), KS_KP_3, + KC(153), KS_KP_4, + KC(154), KS_KP_5, + KC(155), KS_KP_6, + KC(156), KS_KP_Separator, + KC(157), KS_KP_7, + KC(158), KS_KP_8, + KC(159), KS_KP_9, + KC(160), KS_KP_Subtract, + KC(161), KS_KP_F1, + KC(162), KS_KP_F2, + KC(163), KS_KP_F3, + KC(164), KS_KP_F4, + KC(167), KS_Left, + KC(168), KS_Right, + KC(169), KS_Down, + KC(170), KS_Up, + KC(174), KS_Shift_L, + KC(175), KS_Cmd1, KS_Control_L, + KC(176), KS_Caps_Lock, + KC(177), KS_Cmd2, KS_Multi_key, /* (left) compose */ + KC(188), KS_Delete, + KC(189), KS_Return, + KC(190), KS_Tab, + KC(191), KS_grave, KS_asciitilde, + KC(192), KS_1, KS_exclam, + KC(193), KS_q, + KC(194), KS_a, + KC(195), KS_z, + KC(197), KS_2, KS_at, + KC(198), KS_w, + KC(199), KS_s, + KC(200), KS_x, + KC(201), KS_less, KS_greater, + KC(203), KS_3, KS_numbersign, + KC(204), KS_e, + KC(205), KS_d, + KC(206), KS_c, + KC(208), KS_4, KS_dollar, + KC(209), KS_r, + KC(210), KS_f, + KC(211), KS_v, + KC(212), KS_space, + KC(214), KS_5, KS_percent, + KC(215), KS_t, + KC(216), KS_g, + KC(217), KS_b, + KC(219), KS_6, KS_asciicircum, + KC(220), KS_y, + KC(221), KS_h, + KC(222), KS_n, + KC(224), KS_7, KS_ampersand, + KC(225), KS_u, + KC(226), KS_j, + KC(227), KS_m, + KC(229), KS_8, KS_asterisk, + KC(230), KS_i, + KC(231), KS_k, + KC(232), KS_comma, KS_less, + KC(234), KS_9, KS_parenleft, + KC(235), KS_o, + KC(236), KS_l, + KC(237), KS_period, KS_greater, + KC(239), KS_0, KS_parenright, + KC(240), KS_p, + KC(242), KS_semicolon, KS_colon, + KC(243), KS_slash, KS_question, + KC(245), KS_equal, KS_plus, + KC(246), KS_bracketright, KS_braceright, + KC(247), KS_backslash, KS_bar, + KC(249), KS_minus, KS_underscore, + KC(250), KS_bracketleft, KS_braceleft, + KC(251), KS_apostrophe, KS_quotedbl, +}; + +static const keysym_t zskbd_keydesc_us_lk401[] = { + KC(171), KS_Shift_R, + KC(172), KS_Cmd2, KS_Alt_L, + KC(173), KS_Multi_key, /* right compose */ + KC(177), KS_Multi_key, /* left compose, not "cmd" */ + KC(178), KS_Alt_R, +}; + +#define KBD_MAP(name, base, map) \ + { name, base, sizeof(map)/sizeof(keysym_t), map } + +const struct wscons_keydesc zskbd_keydesctab[] = { + KBD_MAP(KB_US, 0, zskbd_keydesc_us), + KBD_MAP(KB_US | KB_LK401, KB_US, zskbd_keydesc_us_lk401), + {0, 0, 0, 0} +}; + +#undef KBD_MAP +#undef KC diff --git a/sys/arch/vax/dec/wskbdmap_lk201.h b/sys/arch/vax/dec/wskbdmap_lk201.h new file mode 100644 index 00000000000..01b965b20a7 --- /dev/null +++ b/sys/arch/vax/dec/wskbdmap_lk201.h @@ -0,0 +1,7 @@ +/* $OpenBSD: wskbdmap_lk201.h,v 1.1 2001/05/16 22:15:18 hugh Exp $ */ +/* $NetBSD: wskbdmap_lk201.h,v 1.2 1998/09/17 19:59:30 drochner Exp $ */ + +#define MIN_LK201_KEY 86 +#define MAX_LK201_KEY 251 + +extern const struct wscons_keydesc zskbd_keydesctab[]; -- cgit v1.2.3