Module Name: src Committed By: manu Date: Sat May 14 01:16:55 UTC 2022
Modified Files: src/sys/dev/adb: adb_kbd.c adb_keymap.h adb_usb_map.c Log Message: Add ISO and JIS keyboard layouts for ADB to USB emulation The layout is configurable using sysctl machdep.adbkbdX.emulate_usb: 0 = no emulation 1 = ANSI 2 = ISO (new with this change) 3 = JIS (new with this change) Default value is detected using the ADB keyboard handler id. JIS default is disabled until it is tested. To generate a diff of this commit: cvs rdiff -u -r1.32 -r1.33 src/sys/dev/adb/adb_kbd.c cvs rdiff -u -r1.9 -r1.10 src/sys/dev/adb/adb_keymap.h cvs rdiff -u -r1.2 -r1.3 src/sys/dev/adb/adb_usb_map.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/dev/adb/adb_kbd.c diff -u src/sys/dev/adb/adb_kbd.c:1.32 src/sys/dev/adb/adb_kbd.c:1.33 --- src/sys/dev/adb/adb_kbd.c:1.32 Sat Aug 7 16:19:09 2021 +++ src/sys/dev/adb/adb_kbd.c Sat May 14 01:16:55 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: adb_kbd.c,v 1.32 2021/08/07 16:19:09 thorpej Exp $ */ +/* $NetBSD: adb_kbd.c,v 1.33 2022/05/14 01:16:55 manu Exp $ */ /* * Copyright (C) 1998 Colin Wood @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: adb_kbd.c,v 1.32 2021/08/07 16:19:09 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: adb_kbd.c,v 1.33 2022/05/14 01:16:55 manu Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" @@ -93,7 +93,7 @@ struct adbkbd_softc { #ifdef WSDISPLAY_COMPAT_RAWKBD int sc_rawkbd; #endif - bool sc_emul_usb; + int sc_emul_usb; bool sc_power_dbg; uint32_t sc_power; @@ -235,7 +235,7 @@ adbkbd_attach(device_t parent, device_t */ sc->sc_power = 0xffff; sc->sc_timestamp = 0; - sc->sc_emul_usb = FALSE; + sc->sc_emul_usb = ADB_EMUL_USB_NONE; #ifdef ADBKBD_POWER_DDB sc->sc_power_dbg = TRUE; #else @@ -386,8 +386,56 @@ adbkbd_attach(device_t parent, device_t sc->sc_wskbddev = config_found(self, &a, wskbddevprint, CFARGS(.iattr = "wskbddev")); #ifdef ADBKBD_EMUL_USB - sc->sc_emul_usb = TRUE; - wskbd_set_evtrans(sc->sc_wskbddev, adb_to_usb, 128); + /* Values from Linux's drivers/macintosh/adbhud.c */ + switch (sc->sc_adbdev->handler_id) { + case ADB_ISOKBD: /* FALLTHROUGH */ + case ADB_EXTISOKBD: /* FALLTHROUGH */ + case 0x07: /* FALLTHROUGH */ + case ADB_ISOKBDII: /* FALLTHROUGH */ + case ADB_PBISOKBD: /* FALLTHROUGH */ + case ADB_ADJISOKBD: /* FALLTHROUGH */ + case ADB_PBEXTISOKBD: /* FALLTHROUGH */ + case 0x19: /* FALLTHROUGH */ + case 0x1d: /* FALLTHROUGH */ + case 0xc1: /* FALLTHROUGH */ + case ADB_IBOOKKBD: /* FALLTHROUGH */ + case 0xc7: + sc->sc_emul_usb = ADB_EMUL_USB_ISO; + wskbd_set_evtrans(sc->sc_wskbddev, adb_to_usb_iso, 128); + break; +#ifdef notyet + case ADB_ADJJAPKBD: /* FALLTHROUGH */ + case ADB_PBEXTJAPKBD: /* FALLTHROUGH */ + case ADB_JPKBDII: /* FALLTHROUGH */ + case 0x17: /* FALLTHROUGH */ + case 0x1a: /* FALLTHROUGH */ + case ADB_PBJPKBD: /* FALLTHROUGH */ + case 0xc2: /* FALLTHROUGH */ + case 0xc5: /* FALLTHROUGH */ + case 0xc8: /* FALLTHROUGH */ + case 0xc9: + sc->sc_emul_usb = ADB_EMUL_USB_JIS; + wskbd_set_evtrans(sc->sc_wskbddev, adb_to_usb_jis, 128); + break; +#endif + case ADB_STDKBD: /* FALLTHROUGH */ + case ADB_EXTKBD: /* FALLTHROUGH */ + case 0x03: /* FALLTHROUGH */ + case 0x06: /* FALLTHROUGH */ + case ADB_KBDII: /* FALLTHROUGH */ + case ADB_PBKBD: /* FALLTHROUGH */ + case ADB_ADJKBD: /* FALLTHROUGH */ + case ADB_PBEXTKBD: /* FALLTHROUGH */ + case ADB_DESIGNKBD: /* FALLTHROUGH */ + case 0x1c: /* FALLTHROUGH */ + case 0xc0: /* FALLTHROUGH */ + case ADB_PBG3KBD: /* FALLTHROUGH */ + case 0xc6: /* FALLTHROUGH */ + default: /* default to ANSI for unknown values */ + sc->sc_emul_usb = ADB_EMUL_USB_ANSI; + wskbd_set_evtrans(sc->sc_wskbddev, adb_to_usb_ansi, 128); + break; + } #endif /* ADBKBD_EMUL_USB */ #if NWSMOUSE > 0 @@ -633,7 +681,7 @@ adbkbd_ioctl(void *v, u_long cmd, void * switch (cmd) { case WSKBDIO_GTYPE: - if (sc->sc_emul_usb) { + if (sc->sc_emul_usb != ADB_EMUL_USB_NONE) { *(int *)data = WSKBD_TYPE_USB; } else { *(int *)data = WSKBD_TYPE_ADB; @@ -798,7 +846,7 @@ 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; + int reg; DPRINTF("%s\n", __func__); reg = sc->sc_emul_usb; @@ -807,12 +855,26 @@ adbkbd_sysctl_usb(SYSCTLFN_ARGS) 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 { + sc->sc_emul_usb = *(int *)node.sysctl_data; + switch (sc->sc_emul_usb) { + case ADB_EMUL_USB_NONE: wskbd_set_evtrans(sc->sc_wskbddev, NULL, 0); + break; + case ADB_EMUL_USB_ANSI: + wskbd_set_evtrans(sc->sc_wskbddev, + adb_to_usb_ansi, 128); + break; + case ADB_EMUL_USB_ISO: + wskbd_set_evtrans(sc->sc_wskbddev, + adb_to_usb_iso, 128); + break; + case ADB_EMUL_USB_JIS: + wskbd_set_evtrans(sc->sc_wskbddev, + adb_to_usb_jis, 128); + break; + default: + return EINVAL; + break; } return 0; } @@ -865,7 +927,7 @@ adbkbd_setup_sysctl(struct adbkbd_softc ret = sysctl_createv(NULL, 0, NULL, (void *)&node, CTLFLAG_READWRITE | CTLFLAG_OWNDESC, - CTLTYPE_BOOL, "emulate_usb", "USB keyboard emulation", + CTLTYPE_INT, "emulate_usb", "USB keyboard emulation", adbkbd_sysctl_usb, 1, (void *)sc, 0, CTL_MACHDEP, me->sysctl_num, CTL_CREATE, CTL_EOL); ret = sysctl_createv(NULL, 0, NULL, Index: src/sys/dev/adb/adb_keymap.h diff -u src/sys/dev/adb/adb_keymap.h:1.9 src/sys/dev/adb/adb_keymap.h:1.10 --- src/sys/dev/adb/adb_keymap.h:1.9 Wed Apr 6 17:14:42 2022 +++ src/sys/dev/adb/adb_keymap.h Sat May 14 01:16:55 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: adb_keymap.h,v 1.9 2022/04/06 17:14:42 macallan Exp $ */ +/* $NetBSD: adb_keymap.h,v 1.10 2022/05/14 01:16:55 manu Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -492,4 +492,11 @@ static const struct wscons_keydesc akbd_ #undef KBD_MAP #undef KC -extern keysym_t adb_to_usb[]; +#define ADB_EMUL_USB_NONE 0 +#define ADB_EMUL_USB_ANSI 1 +#define ADB_EMUL_USB_ISO 2 +#define ADB_EMUL_USB_JIS 3 + +extern keysym_t adb_to_usb_ansi[]; +extern keysym_t adb_to_usb_iso[]; +extern keysym_t adb_to_usb_jis[]; Index: src/sys/dev/adb/adb_usb_map.c diff -u src/sys/dev/adb/adb_usb_map.c:1.2 src/sys/dev/adb/adb_usb_map.c:1.3 --- src/sys/dev/adb/adb_usb_map.c:1.2 Sat Nov 8 16:52:35 2014 +++ src/sys/dev/adb/adb_usb_map.c Sat May 14 01:16:55 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: adb_usb_map.c,v 1.2 2014/11/08 16:52:35 macallan Exp $ */ +/* $NetBSD: adb_usb_map.c,v 1.3 2022/05/14 01:16:55 manu Exp $ */ /*- * Copyright (c) 2006 Michael Lorenz @@ -27,14 +27,38 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: adb_usb_map.c,v 1.2 2014/11/08 16:52:35 macallan Exp $"); +__KERNEL_RCSID(0, "$NetBSD: adb_usb_map.c,v 1.3 2022/05/14 01:16:55 manu Exp $"); #include <sys/param.h> #include <sys/device.h> #include <dev/wscons/wsksymvar.h> -keysym_t adb_to_usb[] = { +/* + * Explanation of the differences between ANSI, ISO and JIS: + * https://github.com/tmk/tmk_keyboard/blob/master/converter/adb_usb/matrix.c + * Summary: + * ADB scan code USB scan code + * ANSI ISO JIS ANSI ISO JIS + * 50 10 50 GRAVE/53 GRAVE/53 GRAVE/53 + * ---- 50 ---- ---- NUBS/100 ---- + * 42 112 42 BSLS/49 NUHS/50 NUHS/50 + * ---- ---- 93 ---- ---- JPY/137 + * ---- ---- 94 ---- ---- RO/135 + * + * With: + * NUBS = Non-US Backslash + * NUHS = Non-US Hash + * BSLS = Backslash + * JPY = Japaneese Yen + * RO = ? + * + * ANSI backslash should be USB scancode 49 but is 50 in the + * array below. For most encoding in sys/dev/hid/hidkbdmap.c + * (all used for ADB?), 49 and 50 have the same definition. + */ + +keysym_t adb_to_usb_ansi[] = { /* 0, KS_a */ 4, /* 1, KS_s */ 22, /* 2, KS_d */ 7, @@ -77,7 +101,7 @@ keysym_t adb_to_usb[] = { /* 39, KS_apostrophe */ 52, /* 40, KS_k */ 14, /* 41, KS_semicolon */ 51, -/* 42, KS_backslash */ 50, +/* 42, KS_backslash */ 50, /* Should be 49 */ /* 43, KS_comma */ 54, /* 44, KS_slash */ 56, /* 45, KS_n */ 17, @@ -164,3 +188,266 @@ keysym_t adb_to_usb[] = { /* 126 */ 0, /* 127, KS_Cmd_Debugger */ 102 }; + +keysym_t adb_to_usb_iso[] = { +/* 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 */ 100, +/* 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, KS_Shift_R */ 229, +/* 124, KS_Alt_R */ 230, +/* 125, KS_Control_R */ 228, +/* 126 */ 0, +/* 127, KS_Cmd_Debugger */ 102 +}; + +keysym_t adb_to_usb_jis[] = { /* XXX not updated from ansi yet */ +/* 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 */ 137, /* JPY */ +/* 94, KS_underscore */ 135, /* RO */ +/* 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, KS_Shift_R */ 229, +/* 124, KS_Alt_R */ 230, +/* 125, KS_Control_R */ 228, +/* 126 */ 0, +/* 127, KS_Cmd_Debugger */ 102 +}; +