From 87fea0705b29206bc2136c0ff5b9a9f23895fee8 Mon Sep 17 00:00:00 2001 From: augustss Date: Wed, 30 Dec 1998 18:03:37 +0000 Subject: [PATCH] Implement raw keyboard mode for X. --- sys/dev/usb/ukbd.c | 46 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/sys/dev/usb/ukbd.c b/sys/dev/usb/ukbd.c index 39b1a921a5fc..427e8568e5a5 100644 --- a/sys/dev/usb/ukbd.c +++ b/sys/dev/usb/ukbd.c @@ -1,4 +1,4 @@ -/* $NetBSD: ukbd.c,v 1.18 1998/12/29 15:42:30 augustss Exp $ */ +/* $NetBSD: ukbd.c,v 1.19 1998/12/30 18:03:37 augustss Exp $ */ /* * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -126,7 +126,10 @@ static struct { }; #define NN 0 /* no translation */ -/* Translate USB keycodes to US keyboard AT scancodes. */ +/* + * Translate USB keycodes to US keyboard AT scancodes. + * Scancodes >= 128 represent EXTENDED keycodes. + */ static u_int8_t ukbd_trtab[256] = { 0, 0, 0, 0, 30, 48, 46, 32, /* 00 - 07 */ 18, 33, 34, 35, 23, 36, 37, 38, /* 08 - 0F */ @@ -215,6 +218,9 @@ const struct wskbd_accessops ukbd_accessops = { ukbd_enable, ukbd_set_leds, ukbd_ioctl, +#if 0 + ukbd_cnattach, +#endif }; const struct wskbd_mapdata ukbd_keymapdata = { @@ -307,7 +313,7 @@ USB_ATTACH(ukbd) sc->sc_disconnected = 0; #if defined(__NetBSD__) - a.console = 0; /* XXX */ + a.console = 0; a.keymap = &ukbd_keymapdata; @@ -316,6 +322,11 @@ USB_ATTACH(ukbd) sc->sc_wskbddev = config_found(self, &a, wskbddevprint); + /* Flash the leds; no real purpose, just shows we're alive. */ + ukbd_set_leds(sc, WSKBD_LED_SCROLL | WSKBD_LED_NUM | WSKBD_LED_CAPS); + usbd_delay_ms(uaa->device, 300); + ukbd_set_leds(sc, 0); + #elif defined(__FreeBSD__) /* XXX why waste CPU in delay() ? */ /* It's alive! IT'S ALIVE! Do a little song and dance. */ @@ -397,6 +408,8 @@ ukbd_enable(v, on) return (0); } +#define MAXKEYS (NMOD+2*NKEYCODE) + void ukbd_intr(reqh, addr, status) usbd_request_handle reqh; @@ -406,7 +419,7 @@ ukbd_intr(reqh, addr, status) struct ukbd_softc *sc = addr; struct ukbd_data *ud = &sc->sc_ndata; int mod, omod; - int ibuf[NMOD+2*NKEYCODE]; /* chars events */ + int ibuf[MAXKEYS]; /* chars events */ int nkeys, i, j; int key, c; #define ADDKEY(c) ibuf[nkeys++] = (c) @@ -472,10 +485,27 @@ ukbd_intr(reqh, addr, status) sc->sc_odata = *ud; if (sc->sc_polling) { + DPRINTFN(1,("ukbd_intr: pollchar = 0x%02x\n", ibuf[0])); if (nkeys > 0) sc->sc_pollchar = ibuf[0]; /* XXX lost keys? */ return; } +#if defined(__NetBSD__) + if (sc->sc_rawkbd) { + char cbuf[MAXKEYS * 2]; + for (i = j = 0; i < nkeys; i++, j++) { + c = ibuf[i]; + if (c & 0x80) + cbuf[j++] = 0xe0; + cbuf[j] = c & 0x7f; + if (c & RELEASE) + cbuf[j] |= 0x80; + } + wskbd_rawinput(sc->sc_wskbddev, cbuf, j); + return; + } +#endif + for (i = 0; i < nkeys; i++) { c = ibuf[i]; #if defined(__NetBSD__) @@ -544,6 +574,7 @@ ukbd_ioctl(v, cmd, data, flag, p) return (0); #ifdef WSDISPLAY_COMPAT_RAWKBD case WSKBDIO_SETMODE: + DPRINTF(("ukbd_ioctl: set raw = %d\n", *(int *)data)); sc->sc_rawkbd = *(int *)data == WSKBD_RAW; return (0); #endif @@ -552,7 +583,6 @@ ukbd_ioctl(v, cmd, data, flag, p) } /* Console interface. */ -/* XXX does not work. */ void ukbd_cngetc(v, type, data) void *v; @@ -584,23 +614,21 @@ ukbd_cnpollc(v, on) { struct ukbd_softc *sc = v; - DPRINTFN(1,("ukbd_cnpollc: sc=%p on=%d\n", v, on)); + DPRINTFN(2,("ukbd_cnpollc: sc=%p on=%d\n", v, on)); usbd_set_polling(sc->sc_iface, on); } -#if 0 -/* XXX We're not ready for this yet... */ int ukbd_cnattach(v) void *v; { struct ukbd_softc *sc = v; + DPRINTF(("ukbd_cnattach: sc=%p\n", sc)); wskbd_cnattach(&ukbd_consops, sc, &ukbd_keymapdata); return (0); } -#endif #endif