Module Name: src
Committed By: bsh
Date: Wed Apr 4 01:40:57 UTC 2012
Modified Files:
src/sys/arch/evbarm/conf: TWINTAIL
src/sys/arch/evbarm/g42xxeb: g42xxeb_kmkbd.c
Log Message:
support WSDISPLAY_COMPAT_RAWKBD for TWINTAIL's on-board matrix keys.
To generate a diff of this commit:
cvs rdiff -u -r1.48 -r1.49 src/sys/arch/evbarm/conf/TWINTAIL
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/evbarm/g42xxeb/g42xxeb_kmkbd.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/evbarm/conf/TWINTAIL
diff -u src/sys/arch/evbarm/conf/TWINTAIL:1.48 src/sys/arch/evbarm/conf/TWINTAIL:1.49
--- src/sys/arch/evbarm/conf/TWINTAIL:1.48 Sun Dec 18 05:49:26 2011
+++ src/sys/arch/evbarm/conf/TWINTAIL Wed Apr 4 01:40:57 2012
@@ -1,4 +1,4 @@
-# $NetBSD: TWINTAIL,v 1.48 2011/12/18 05:49:26 dholland Exp $
+# $NetBSD: TWINTAIL,v 1.49 2012/04/04 01:40:57 bsh Exp $
#
# TWINTAIL -- Genetec corp. G4255EB-X002 Evaluation Board Kernel
#
@@ -193,7 +193,8 @@ options G4250_LCD_TOSHIBA_LTM035
#options G4250_LCD_NEC_NL3224BC35
kmkbd* at obio?
-wskbd* at kmkbd? # console ?
+wskbd* at kmkbd? # mux 1 # console ?
+options WSDISPLAY_COMPAT_RAWKBD
# GB-225 option board
opio0 at obio? intr 2
@@ -410,6 +411,6 @@ pseudo-device pty # pseudo-terminals
pseudo-device clockctl # user control of clock subsystem
# wscons pseudo-devices
-#pseudo-device wsmux # mouse & keyboard multiplexor
+pseudo-device wsmux # mouse & keyboard multiplexor
#pseudo-device wsfont
pseudo-device ksyms # /dev/ksyms
Index: src/sys/arch/evbarm/g42xxeb/g42xxeb_kmkbd.c
diff -u src/sys/arch/evbarm/g42xxeb/g42xxeb_kmkbd.c:1.12 src/sys/arch/evbarm/g42xxeb/g42xxeb_kmkbd.c:1.13
--- src/sys/arch/evbarm/g42xxeb/g42xxeb_kmkbd.c:1.12 Fri Jul 1 20:38:17 2011
+++ src/sys/arch/evbarm/g42xxeb/g42xxeb_kmkbd.c Wed Apr 4 01:40:57 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: g42xxeb_kmkbd.c,v 1.12 2011/07/01 20:38:17 dyoung Exp $ */
+/* $NetBSD: g42xxeb_kmkbd.c,v 1.13 2012/04/04 01:40:57 bsh Exp $ */
/*-
* Copyright (c) 2002, 2003, 2005 Genetec corp.
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: g42xxeb_kmkbd.c,v 1.12 2011/07/01 20:38:17 dyoung Exp $" );
+__KERNEL_RCSID(0, "$NetBSD: g42xxeb_kmkbd.c,v 1.13 2012/04/04 01:40:57 bsh Exp $" );
#include <sys/param.h>
#include <sys/systm.h>
@@ -57,13 +57,13 @@ __KERNEL_RCSID(0, "$NetBSD: g42xxeb_kmkb
#include <arch/evbarm/g42xxeb/g42xxeb_var.h>
#include "locators.h"
-
-/*#include "opt_pckbd_layout.h"*/
-/*#include "opt_wsdisplay_compat.h"*/
+#include "opt_wsdisplay_compat.h"
#define DEBOUNCE_TICKS ((hz<=50)?1:hz/50) /* 20ms */
#define RELEASE_WATCH_TICKS (hz/10) /* 100ms */
+#define NUMKEYS (4*5) /* the number of keys */
+
struct kmkbd_softc {
device_t dev;
@@ -76,6 +76,7 @@ struct kmkbd_softc {
u_char debounce_counter;
#define DEBOUNCE_COUNT 3
u_char polling;
+ u_char rawkbd;
enum kmkbd_state {
ST_INIT,
ST_DISABLED,
@@ -211,6 +212,9 @@ kmkbd_attach(device_t parent, device_t s
state0 = ST_DISABLED;
}
+#ifdef WSDISPLAY_COMPAT_RAWKBD
+ sc->rawkbd = 0;
+#endif
callout_init(&sc->callout, 0);
s = spltty();
@@ -266,7 +270,9 @@ kmkbd_set_leds(void *v, int leds)
static int
kmkbd_ioctl(void *v, u_long cmd, void *data, int flag, struct lwp *l)
{
- /*struct kmkbd_softc *sc = v;*/
+#ifdef WSDISPLAY_COMPAT_RAWKBD
+ struct kmkbd_softc *sc = v;
+#endif
switch (cmd) {
case WSKBDIO_GTYPE:
@@ -435,6 +441,39 @@ kmkbd_report(struct kmkbd_softc *sc, u_i
sc->notified_bits = bitset;
}
+#ifdef WSDISPLAY_COMPAT_RAWKBD
+static void
+kmkbd_report_raw(struct kmkbd_softc *sc, u_int bitset)
+{
+ int i, nc;
+ char cbuf[NUMKEYS];
+ u_int changed;
+
+ if (bitset == sc->notified_bits)
+ return;
+
+ nc = 0;
+ changed = bitset ^ sc->notified_bits;
+
+ while (changed) {
+ i = ffs(changed) - 1;
+ if (nc < NUMKEYS) {
+ cbuf[nc] = i + 1;
+ if (0 == (bitset & (1<<i))) {
+ /* the key is released */
+ cbuf[nc] |= 0x80;
+ }
+ ++nc;
+ }
+
+ changed &= ~(1<<i);
+ }
+
+ wskbd_rawinput(sc->wskbddev, cbuf, nc);
+ sc->notified_bits = bitset;
+}
+#endif
+
static int
kmkbd_intr(void *arg)
{
@@ -468,7 +507,12 @@ kmkbd_debounce(void *arg)
}
else if( ++(sc->debounce_counter) >= DEBOUNCE_COUNT ){
new_state = newbits == 0 ? ST_ALL_UP : ST_KEY_PRESSED;
- kmkbd_report(sc, newbits);
+#ifdef WSDISPLAY_COMPAT_RAWKBD
+ if (sc->rawkbd)
+ kmkbd_report_raw(sc, newbits);
+ else
+#endif
+ kmkbd_report(sc, newbits);
}
kmkbd_new_state(sc, new_state);