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 = &reg;
                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