Module Name:    src
Committed By:   macallan
Date:           Wed Aug 29 02:44:07 UTC 2012

Modified Files:
        src/sys/dev/adb: adb_kbd.c adb_keymap.h files.adb
Added Files:
        src/sys/dev/adb: adb_usb_map.c

Log Message:
when in event mode, optionally pretend to be a USB keyboard
with this USB and ADB keyboards can coexist at the same mux, with X just
listening to /dev/wskbd instead of having to open each one separately
this can be controlled via sysctl, defaults to off for now
needs testing with non-US keyboards


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/dev/adb/adb_kbd.c
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/adb/adb_keymap.h
cvs rdiff -u -r0 -r1.1 src/sys/dev/adb/adb_usb_map.c
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/adb/files.adb

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/adb/adb_kbd.c
diff -u src/sys/dev/adb/adb_kbd.c:1.17 src/sys/dev/adb/adb_kbd.c:1.18
--- src/sys/dev/adb/adb_kbd.c:1.17	Sat Jun  2 21:36:43 2012
+++ src/sys/dev/adb/adb_kbd.c	Wed Aug 29 02:44:07 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: adb_kbd.c,v 1.17 2012/06/02 21:36:43 dsl Exp $	*/
+/*	$NetBSD: adb_kbd.c,v 1.18 2012/08/29 02:44:07 macallan Exp $	*/
 
 /*
  * Copyright (C) 1998	Colin Wood
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: adb_kbd.c,v 1.17 2012/06/02 21:36:43 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: adb_kbd.c,v 1.18 2012/08/29 02:44:07 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -86,6 +86,8 @@ struct adbkbd_softc {
 #ifdef WSDISPLAY_COMPAT_RAWKBD
 	int sc_rawkbd;
 #endif
+	bool sc_emul_usb;
+
 	uint8_t sc_buffer[16];
 	uint8_t sc_pollbuf[16];
 	uint8_t sc_us;
@@ -151,6 +153,7 @@ const struct wsmouse_accessops adbkms_ac
 
 static int  adbkbd_sysctl_mid(SYSCTLFN_ARGS);
 static int  adbkbd_sysctl_right(SYSCTLFN_ARGS);
+static int  adbkbd_sysctl_usb(SYSCTLFN_ARGS);
 static void adbkbd_setup_sysctl(struct adbkbd_softc *);
 
 #endif /* NWSMOUSE > 0 */
@@ -215,6 +218,7 @@ adbkbd_attach(device_t parent, device_t 
 	sc->sc_trans[2] = 111;	/* F12 */
 	sc->sc_power = 0x7f;
 	sc->sc_timestamp = 0;
+	sc->sc_emul_usb = FALSE;
 
 	printf(" addr %d: ", sc->sc_adbdev->current_addr);
 
@@ -340,9 +344,8 @@ adbkbd_attach(device_t parent, device_t 
 	sc->sc_wsmousedev = config_found_ia(self, "wsmousedev", &am, 
 	    wsmousedevprint);
 
-	if (sc->sc_wsmousedev != NULL)
-		adbkbd_setup_sysctl(sc);
 #endif
+	adbkbd_setup_sysctl(sc);
 
 	/* finally register the power button */
 	sysmon_task_queue_init();
@@ -573,7 +576,11 @@ adbkbd_ioctl(void *v, u_long cmd, void *
 	switch (cmd) {
 
 	case WSKBDIO_GTYPE:
-		*(int *)data = WSKBD_TYPE_ADB;
+		if (sc->sc_emul_usb) {
+			*(int *)data = WSKBD_TYPE_USB;
+		} else {
+			*(int *)data = WSKBD_TYPE_ADB;
+		}
 		return 0;
 	case WSKBDIO_SETLEDS:
 		adbkbd_set_leds(sc, *(int *)data);
@@ -674,34 +681,6 @@ adbkms_disable(void *v)
 {
 }
 
-static void
-adbkbd_setup_sysctl(struct adbkbd_softc *sc)
-{
-	const struct sysctlnode *me, *node;
-	int ret;
-
-	DPRINTF("%s: sysctl setup\n", device_xname(sc->sc_dev));
-	ret = sysctl_createv(NULL, 0, NULL, &me,
-	       CTLFLAG_READWRITE,
-	       CTLTYPE_NODE, device_xname(sc->sc_dev), NULL,
-	       NULL, 0, NULL, 0,
-	       CTL_MACHDEP, CTL_CREATE, CTL_EOL);
-
-	ret = sysctl_createv(NULL, 0, NULL,
-	    (void *)&node, 
-	    CTLFLAG_READWRITE | CTLFLAG_OWNDESC,
-	    CTLTYPE_INT, "middle", "middle mouse button", adbkbd_sysctl_mid, 
-		    1, (void *)sc, 0, CTL_MACHDEP, me->sysctl_num, CTL_CREATE, 
-		    CTL_EOL);
-
-	ret = sysctl_createv(NULL, 0, NULL, 
-	    (void *)&node, 
-	    CTLFLAG_READWRITE | CTLFLAG_OWNDESC,
-	    CTLTYPE_INT, "right", "right mouse button", adbkbd_sysctl_right, 
-		    2, (void *)sc, 0, CTL_MACHDEP, me->sysctl_num, CTL_CREATE, 
-		    CTL_EOL);
-}
-
 static int
 adbkbd_sysctl_mid(SYSCTLFN_ARGS)
 {
@@ -754,6 +733,77 @@ adbkbd_sysctl_right(SYSCTLFN_ARGS)
 	}
 }
 
+#endif /* NWSMOUSE > 0 */
+
+static int
+adbkbd_sysctl_usb(SYSCTLFN_ARGS)
+{
+	struct sysctlnode node = *rnode;
+	struct adbkbd_softc *sc=(struct adbkbd_softc *)node.sysctl_data;
+	const int *np = newp;
+	bool reg;
+
+	DPRINTF("%s\n", __func__);
+	reg = sc->sc_emul_usb;
+	if (np) {
+		/* we're asked to write */	
+		node.sysctl_data = &reg;
+		if (sysctl_lookup(SYSCTLFN_CALL(&node)) == 0) {
+			
+			sc->sc_emul_usb = *(bool *)node.sysctl_data;
+			if (sc->sc_emul_usb) {
+				wskbd_set_evtrans(sc->sc_wskbddev,
+				    adb_to_usb, 128);
+			} else {
+				wskbd_set_evtrans(sc->sc_wskbddev, NULL, 0);
+			}
+			return 0;
+		}
+		return EINVAL;
+	} else {
+		node.sysctl_data = &reg;
+		node.sysctl_size = sizeof(reg);
+		return (sysctl_lookup(SYSCTLFN_CALL(&node)));
+	}
+}
+
+static void
+adbkbd_setup_sysctl(struct adbkbd_softc *sc)
+{
+	const struct sysctlnode *me, *node;
+	int ret;
+
+	DPRINTF("%s: sysctl setup\n", device_xname(sc->sc_dev));
+	ret = sysctl_createv(NULL, 0, NULL, &me,
+	       CTLFLAG_READWRITE,
+	       CTLTYPE_NODE, device_xname(sc->sc_dev), NULL,
+	       NULL, 0, NULL, 0,
+	       CTL_MACHDEP, CTL_CREATE, CTL_EOL);
+	ret = sysctl_createv(NULL, 0, NULL,
+	    (void *)&node, 
+	    CTLFLAG_READWRITE | CTLFLAG_OWNDESC,
+	    CTLTYPE_BOOL, "emulate_usb", "USB keyboard emulation", 
+	    adbkbd_sysctl_usb, 1, (void *)sc, 0, CTL_MACHDEP, 
+	    me->sysctl_num, CTL_CREATE, CTL_EOL);
+#if NWSMOUSE > 0
+	if (sc->sc_wsmousedev != NULL) {
+		ret = sysctl_createv(NULL, 0, NULL,
+		    (void *)&node, 
+		    CTLFLAG_READWRITE | CTLFLAG_OWNDESC,
+		    CTLTYPE_INT, "middle", "middle mouse button", 
+		    adbkbd_sysctl_mid, 1, (void *)sc, 0, CTL_MACHDEP, 
+		    me->sysctl_num, CTL_CREATE, CTL_EOL);
+
+		ret = sysctl_createv(NULL, 0, NULL, 
+		    (void *)&node, 
+		    CTLFLAG_READWRITE | CTLFLAG_OWNDESC,
+		    CTLTYPE_INT, "right", "right mouse button", 
+		    adbkbd_sysctl_right, 2, (void *)sc, 0, CTL_MACHDEP, 
+		    me->sysctl_num, CTL_CREATE, CTL_EOL);
+	}
+#endif /* NWSMOUSE > 0 */
+}
+
 SYSCTL_SETUP(sysctl_adbkbdtrans_setup, "adbkbd translator setup")
 {
 
@@ -763,4 +813,3 @@ SYSCTL_SETUP(sysctl_adbkbdtrans_setup, "
 		       NULL, 0, NULL, 0,
 		       CTL_MACHDEP, CTL_EOL);
 }
-#endif /* NWSMOUSE > 0 */

Index: src/sys/dev/adb/adb_keymap.h
diff -u src/sys/dev/adb/adb_keymap.h:1.3 src/sys/dev/adb/adb_keymap.h:1.4
--- src/sys/dev/adb/adb_keymap.h:1.3	Mon Apr 28 20:23:47 2008
+++ src/sys/dev/adb/adb_keymap.h	Wed Aug 29 02:44:07 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: adb_keymap.h,v 1.3 2008/04/28 20:23:47 martin Exp $	*/
+/*	$NetBSD: adb_keymap.h,v 1.4 2012/08/29 02:44:07 macallan Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -421,3 +421,4 @@ static const struct wscons_keydesc akbd_
 #undef KBD_MAP
 #undef KC
 
+extern keysym_t adb_to_usb[];

Index: src/sys/dev/adb/files.adb
diff -u src/sys/dev/adb/files.adb:1.5 src/sys/dev/adb/files.adb:1.6
--- src/sys/dev/adb/files.adb:1.5	Mon Apr 16 23:34:43 2007
+++ src/sys/dev/adb/files.adb	Wed Aug 29 02:44:07 2012
@@ -1,5 +1,5 @@
 # 
-#	$NetBSD: files.adb,v 1.5 2007/04/16 23:34:43 macallan Exp $
+#	$NetBSD: files.adb,v 1.6 2012/08/29 02:44:07 macallan Exp $
 #
 # Apple Desktop Bus protocol and drivers
 
@@ -18,6 +18,7 @@ file dev/adb/adb_bus.c		nadb needs-flag
 device adbkbd : wskbddev, wsmousedev, sysmon_power, sysmon_taskq
 attach adbkbd at nadb
 file dev/adb/adb_kbd.c		adbkbd needs-flag
+file dev/adb/adb_usb_map.c	adbkbd
 
 device adbbt : wskbddev
 attach adbbt at nadb

Added files:

Index: src/sys/dev/adb/adb_usb_map.c
diff -u /dev/null src/sys/dev/adb/adb_usb_map.c:1.1
--- /dev/null	Wed Aug 29 02:44:07 2012
+++ src/sys/dev/adb/adb_usb_map.c	Wed Aug 29 02:44:07 2012
@@ -0,0 +1,166 @@
+/*	$NetBSD: adb_usb_map.c,v 1.1 2012/08/29 02:44:07 macallan Exp $ */
+
+/*-
+ * Copyright (c) 2006 Michael Lorenz
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: adb_usb_map.c,v 1.1 2012/08/29 02:44:07 macallan Exp $");
+
+#include <sys/param.h>
+#include <sys/device.h>
+
+#include <dev/wscons/wsksymvar.h>
+
+keysym_t adb_to_usb[] = {
+/*   0, KS_a 		*/		4,
+/*   1, KS_s 		*/		22,
+/*   2, KS_d 		*/		7,
+/*   3, KS_f 		*/		9,
+/*   4, KS_h 		*/		11,
+/*   5, KS_g 		*/		10,
+/*   6, KS_z 		*/		29,
+/*   7, KS_x 		*/		27,
+/*   8, KS_c 		*/		6,
+/*   9, KS_v		*/		25,
+/*  10, KS_paragraph	*/		53,
+/*  11, KS_b		*/		5,
+/*  12, KS_q		*/		20,
+/*  13, KS_w		*/		26,
+/*  14, KS_e		*/		8,
+/*  15, KS_r		*/		21,
+/*  16, KS_y		*/		28,
+/*  17, KS_t		*/		23,
+/*  18, KS_1		*/		30,
+/*  19, KS_2		*/		31,
+/*  20, KS_3		*/		32,
+/*  21, KS_4		*/		33,
+/*  22, KS_6		*/		35,
+/*  23, KS_5		*/		34,
+/*  24, KS_equal	*/		46,
+/*  25, KS_9		*/		38,
+/*  26, KS_7		*/		36,
+/*  27, KS_minus	*/		45,
+/*  28, KS_8		*/		37,
+/*  29, KS_0		*/		39,
+/*  30, KS_bracketright	*/		48,
+/*  31, KS_o		*/		18,
+/*  32, KS_u		*/		24,
+/*  33, KS_bracketleft	*/		47,
+/*  34, KS_i		*/		12,
+/*  35, KS_p		*/		19,
+/*  36, KS_Return	*/		40,
+/*  37, KS_l		*/		15,
+/*  38, KS_j		*/		13,
+/*  39, KS_apostrophe	*/		52,
+/*  40, KS_k		*/		14,
+/*  41, KS_semicolon	*/		51,
+/*  42, KS_backslash	*/		50,
+/*  43, KS_comma	*/		54,
+/*  44, KS_slash	*/		56,
+/*  45, KS_n		*/		17,
+/*  46, KS_m		*/		16,
+/*  47, KS_period	*/		55,
+/*  48, KS_Tab		*/		43,
+/*  49, KS_space	*/		44,
+/*  50, KS_grave	*/		53,
+/*  51, KS_Delete	*/		42,
+/*  52, KS_KP_Enter	*/		88,
+/*  53, KS_Escape	*/		41,
+/*  54, KS_Control_L	*/		224,
+/*  55, KS_Cmd		*/		227,	/* left meta */
+/*  56, KS_Shift_L	*/		225,
+/*  57, KS_Caps_Lock	*/		57,
+/*  58, KS_Option	*/		226,
+/*  59, KS_Left		*/		80,
+/*  60, KS_Right	*/		79,
+/*  61, KS_Down		*/		81,
+/*  62, KS_Up		*/		82,
+/*  63			*/		0,
+/*  64			*/		0,
+/*  65, KS_KP_Decimal	*/		99,
+/*  66			*/		0,
+/*  67, KS_KP_Multiply	*/		85,
+/*  68			*/		0,
+/*  69, KS_KP_Add	*/		87,
+/*  70			*/		0,
+/*  71, KS_Num_Lock	*/		83,
+/*  72			*/		0,
+/*  73			*/		0,
+/*  74			*/		0,
+/*  75, KS_KP_Divide	*/		84,
+/*  76, KS_KP_Enter	*/		88,
+/*  77			*/		0,
+/*  78, KS_KP_Subtract	*/		86,
+/*  79			*/		0,
+/*  80			*/		0,
+/*  81, KS_KP_Equal	*/		46,	/* no KP_EQUAL on USB? */
+/*  82, KS_KP_Insert, 0	*/		98,
+/*  83, KS_KP_End,    1	*/		89,
+/*  84, KS_KP_Down,   2	*/		90,
+/*  85, KS_KP_Next,   3	*/		91,
+/*  86, KS_KP_Left,   4	*/		92,
+/*  87, KS_KP_Begin   5	*/		93,
+/*  88, KS_KP_Right   6	*/		94,
+/*  89, KS_KP_Home    7	*/		95,
+/*  90			*/		0,
+/*  91, KS_KP_Up      8	*/		96,
+/*  92, KS_KP_Prior   9	*/		97,
+/*  93, KS_backslash	*/		100,
+/*  94, KS_underscore	*/		45,
+/*  95, KS_KP_Delete  . */		99,
+/*  96, KS_f5		*/		62,
+/*  97, KS_f6		*/		63,
+/*  98, KS_f7		*/		64,
+/*  99, KS_f3		*/		60,
+/* 100, KS_f8		*/		65,
+/* 101, KS_f9		*/		66,
+/* 102			*/		0,
+/* 103, KS_f11		*/		68,
+/* 104			*/		0,
+/* 105, KS_Print_Screen	*/		70,
+/* 106, KS_KP_Enter	*/		88,
+/* 107, KS_Hold_Screen	*/		71,
+/* 108			*/		0,
+/* 109, KS_f10		*/		67,
+/* 110			*/		0,
+/* 111, KS_f12		*/		69,
+/* 112			*/		0,
+/* 113, KS_Pause	*/		72,
+/* 114, KS_Insert	*/		73,
+/* 115, KS_Home		*/		74,
+/* 116, KS_Prior	*/		75,
+/* 117, KS_BackSpace	*/		76,
+/* 118, KS_f4		*/		61,
+/* 119, KS_End		*/		77,
+/* 120, KS_f2		*/		59,
+/* 121, KS_Next		*/		78,
+/* 122, KS_f1		*/		58,
+/* 123			*/		0,
+/* 124			*/		0,
+/* 125			*/		0,
+/* 126			*/		0,
+/* 127, KS_Cmd_Debugger	*/		102
+};

Reply via email to