Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/adb Add ISO and JIS keyboard layouts for ADB to USB ...
details: https://anonhg.NetBSD.org/src/rev/975021e21807
branches: trunk
changeset: 366082:975021e21807
user: manu <manu%NetBSD.org@localhost>
date: Sat May 14 01:16:55 2022 +0000
description:
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.
diffstat:
sys/dev/adb/adb_kbd.c | 90 +++++++++++--
sys/dev/adb/adb_keymap.h | 11 +-
sys/dev/adb/adb_usb_map.c | 297 +++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 377 insertions(+), 21 deletions(-)
diffs (truncated from 504 to 300 lines):
diff -r 8e16f6c1acff -r 975021e21807 sys/dev/adb/adb_kbd.c
--- a/sys/dev/adb/adb_kbd.c Fri May 13 21:42:30 2022 +0000
+++ b/sys/dev/adb/adb_kbd.c Sat May 14 01:16:55 2022 +0000
@@ -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 @@
#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 @@
*/
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 @@
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 @@
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 @@
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 @@
node.sysctl_data = ®
if (sysctl_lookup(SYSCTLFN_CALL(&node)) == 0) {
- sc->sc_emul_usb = *(bool *)node.sysctl_data;
- if (sc->sc_emul_usb) {
+ 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, 128);
- } else {
- wskbd_set_evtrans(sc->sc_wskbddev, NULL, 0);
+ 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 @@
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,
diff -r 8e16f6c1acff -r 975021e21807 sys/dev/adb/adb_keymap.h
--- a/sys/dev/adb/adb_keymap.h Fri May 13 21:42:30 2022 +0000
+++ b/sys/dev/adb/adb_keymap.h Sat May 14 01:16:55 2022 +0000
@@ -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 @@
#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[];
diff -r 8e16f6c1acff -r 975021e21807 sys/dev/adb/adb_usb_map.c
--- a/sys/dev/adb/adb_usb_map.c Fri May 13 21:42:30 2022 +0000
+++ b/sys/dev/adb/adb_usb_map.c Sat May 14 01:16:55 2022 +0000
@@ -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,300 @@
*/
#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,
+/* 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, /* Should be 49 */
+/* 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,
Home |
Main Index |
Thread Index |
Old Index