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 = ® + 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 = ® + 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 +};