move most of the key combination translation code out of ukbd(4)
authorrobert <robert@openbsd.org>
Fri, 16 Sep 2022 16:30:10 +0000 (16:30 +0000)
committerrobert <robert@openbsd.org>
Fri, 16 Sep 2022 16:30:10 +0000 (16:30 +0000)
to hidkbd so that it can be re-used by apldc(4) and aplhidev(4) as well

this also adds support for apple fn key combinations to aplhidev(4)

ok miod@

sys/arch/arm64/dev/apldc.c
sys/arch/arm64/dev/aplhidev.c
sys/dev/hid/hidkbd.c
sys/dev/hid/hidkbdsc.h
sys/dev/usb/ukbd.c

index 09a03c7..6cd8e5a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: apldc.c,v 1.3 2022/09/15 14:45:49 tobhe Exp $ */
+/*     $OpenBSD: apldc.c,v 1.4 2022/09/16 16:30:10 robert Exp $        */
 /*
  * Copyright (c) 2022 Mark Kettenis <kettenis@openbsd.org>
  *
@@ -1066,22 +1066,6 @@ struct apldckbd_softc {
        struct apldchidev_softc *sc_hidev;
        struct hidkbd           sc_kbd;
        int                     sc_spl;
-       struct hid_location     sc_fn;
-       int                     sc_has_fn;
-};
-
-struct apldckbd_translation {
-       uint8_t original;
-       uint8_t translation;
-};
-
-static const struct apldckbd_translation apldckbd_trans_table[] = {
-       { 40, 73 },     /* return -> insert */
-       { 42, 76 },     /* backspace -> delete */
-       { 79, 77 },     /* right -> end */
-       { 80, 74 },     /* left -> home */
-       { 81, 78 },     /* down -> page down */
-       { 82, 75 }      /* up -> page up */
 };
 
 void   apldckbd_cngetc(void *, u_int *, int *);
@@ -1138,8 +1122,9 @@ apldckbd_attach(struct device *parent, struct device *self, void *aux)
 
        printf("\n");
 
-       sc->sc_has_fn = hid_locate(aa->aa_desc, aa->aa_desclen,
-           HID_USAGE2(HUP_APPLE, HUG_FN_KEY), 1, hid_input, &sc->sc_fn, NULL);
+       if (hid_locate(aa->aa_desc, aa->aa_desclen, HID_USAGE2(HUP_APPLE, HUG_FN_KEY),
+           1, hid_input, &kbd->sc_fn, NULL))
+               kbd->sc_munge = hidkbd_apple_munge;
 
        if (kbd->sc_console_keyboard) {
                extern struct wskbd_mapdata ukbd_keymapdata;
@@ -1152,41 +1137,14 @@ apldckbd_attach(struct device *parent, struct device *self, void *aux)
        hidkbd_attach_wskbd(kbd, KB_US | KB_DEFAULT, &apldckbd_accessops);
 }
 
-void
-apldckbd_munge(void *v, uint8_t *ibuf, size_t ilen)
-{
-       struct apldckbd_softc *sc = v;
-       struct hidkbd *kbd = &sc->sc_kbd;
-       uint8_t *pos, *spos, *epos;
-       const struct apldckbd_translation *tbl;
-       size_t tsize;
-
-       if (!hid_get_data(ibuf, ilen, &sc->sc_fn))
-               return;
-
-       spos = ibuf + kbd->sc_keycodeloc.pos / 8;
-       epos = spos + kbd->sc_nkeycode;
-
-       for (pos = spos; pos != epos; pos++) {
-               tbl = apldckbd_trans_table;
-               tsize = nitems(apldckbd_trans_table);
-               for (; tsize != 0; tbl++, tsize--)
-                       if (tbl->original == *pos)
-                               *pos = tbl->translation;
-       }
-}
-
 void
 apldckbd_intr(struct device *self, uint8_t *packet, size_t packetlen)
 {
        struct apldckbd_softc *sc = (struct apldckbd_softc *)self;
        struct hidkbd *kbd = &sc->sc_kbd;
 
-       if (kbd->sc_enabled) {
-               if (sc->sc_has_fn)
-                       apldckbd_munge(sc, &packet[1], packetlen - 1);
+       if (kbd->sc_enabled)
                hidkbd_input(kbd, &packet[1], packetlen - 1);
-       }
 }
 
 int
index 2b00f7e..fdefe5b 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: aplhidev.c,v 1.6 2022/04/06 18:59:26 naddy Exp $      */
+/*     $OpenBSD: aplhidev.c,v 1.7 2022/09/16 16:30:10 robert Exp $     */
 /*
  * Copyright (c) 2021 Mark Kettenis <kettenis@openbsd.org>
  * Copyright (c) 2013-2014 joshua stein <jcs@openbsd.org>
@@ -459,6 +459,10 @@ aplkbd_attach(struct device *parent, struct device *self, void *aux)
 
        printf("\n");
 
+       if (hid_locate(aa->aa_desc, aa->aa_desclen, HID_USAGE2(HUP_APPLE, HUG_FN_KEY),
+           1, hid_input, &kbd->sc_fn, NULL))
+               kbd->sc_munge = hidkbd_apple_munge;
+
        if (kbd->sc_console_keyboard) {
                extern struct wskbd_mapdata ukbd_keymapdata;
 
index a3053ec..08e02c4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: hidkbd.c,v 1.6 2020/11/02 19:45:18 tobhe Exp $        */
+/*     $OpenBSD: hidkbd.c,v 1.7 2022/09/16 16:30:10 robert Exp $       */
 /*      $NetBSD: ukbd.c,v 1.85 2003/03/11 16:44:00 augustss Exp $        */
 
 /*
@@ -108,6 +108,67 @@ const u_int8_t hidkbd_trtab[256] = {
 };
 #endif /* defined(WSDISPLAY_COMPAT_RAWKBD) */
 
+static const struct hidkbd_translation apple_fn_trans[] = {
+       { 40, 73 },     /* return -> insert */
+       { 42, 76 },     /* backspace -> delete */
+#ifdef notyet
+       { 58, 0 },      /* F1 -> screen brightness down */
+       { 59, 0 },      /* F2 -> screen brightness up */
+       { 60, 0 },      /* F3 */
+       { 61, 0 },      /* F4 */
+       { 62, 0 },      /* F5 -> keyboard backlight down */
+       { 63, 0 },      /* F6 -> keyboard backlight up */
+       { 64, 0 },      /* F7 -> audio back */
+       { 65, 0 },      /* F8 -> audio pause/play */
+       { 66, 0 },      /* F9 -> audio next */
+#endif
+#ifdef __macppc__
+       { 58, 233 },    /* F1 -> screen brightness down */
+       { 59, 232 },    /* F2 -> screen brightness up */
+       { 60, 127 },    /* F3 -> audio mute */
+       { 61, 129 },    /* F4 -> audio lower */
+       { 62, 128 },    /* F5 -> audio raise */
+#else
+       { 67, 127 },    /* F10 -> audio mute */
+       { 68, 129 },    /* F11 -> audio lower */
+       { 69, 128 },    /* F12 -> audio raise */
+#endif
+       { 79, 77 },     /* right -> end */
+       { 80, 74 },     /* left -> home */
+       { 81, 78 },     /* down -> page down */
+       { 82, 75 }      /* up -> page up */
+};
+
+static const struct hidkbd_translation apple_mba_trans[] = {
+       { 40, 73 },     /* return -> insert */
+       { 42, 76 },     /* backspace -> delete */
+#ifdef notyet
+       { 58, 0 },      /* F1 -> screen brightness down */
+       { 59, 0 },      /* F2 -> screen brightness up */
+       { 60, 0 },      /* F3 */
+       { 61, 0 },      /* F4 */
+       { 62, 0 },      /* F5 */
+       { 63, 0 },      /* F6 -> audio back */
+       { 64, 0 },      /* F7 -> audio pause/play */
+       { 65, 0 },      /* F8 -> audio next */
+#endif
+       { 66, 127 },    /* F9 -> audio mute */
+       { 67, 129 },    /* F10 -> audio lower */
+       { 68, 128 },    /* F11 -> audio raise */
+#ifdef notyet
+       { 69, 0 },      /* F12 -> eject */
+#endif
+       { 79, 77 },     /* right -> end */
+       { 80, 74 },     /* left -> home */
+       { 81, 78 },     /* down -> page down */
+       { 82, 75 }      /* up -> page up */
+};
+
+static const struct hidkbd_translation apple_iso_trans[] = {
+       { 53, 100 },    /* less -> grave */
+       { 100, 53 }
+};
+
 #define KEY_ERROR 0x01
 
 #ifdef HIDKBD_DEBUG
@@ -236,12 +297,82 @@ hidkbd_detach(struct hidkbd *kbd, int flags)
        return (rv);
 }
 
+uint8_t
+hidkbd_translate(const struct hidkbd_translation *table, size_t tsize,
+    uint8_t keycode)
+{
+       for (; tsize != 0; table++, tsize--)
+               if (table->original == keycode)
+                       return table->translation;
+       return 0;
+}
+
+void
+hidkbd_apple_translate(void *vsc, uint8_t *ibuf, u_int ilen,
+    const struct hidkbd_translation* trans, u_int tlen)
+{
+       struct hidkbd *kbd = vsc;
+       uint8_t *pos, *spos, *epos, xlat;
+
+       spos = ibuf + kbd->sc_keycodeloc.pos / 8;
+       epos = spos + kbd->sc_nkeycode;
+
+       for (pos = spos; pos != epos; pos++) {
+               xlat = hidkbd_translate(trans, tlen, *pos);
+               if (xlat != 0)
+                       *pos = xlat;
+       }
+}
+
+void
+hidkbd_apple_munge(void *vsc, uint8_t *ibuf, u_int ilen)
+{
+       struct hidkbd *kbd = vsc;
+
+       if (!hid_get_data(ibuf, ilen, &kbd->sc_fn))
+               return;
+
+       hidkbd_apple_translate(vsc, ibuf, ilen, apple_fn_trans,
+           nitems(apple_fn_trans));
+}
+
+void
+hidkbd_apple_iso_munge(void *vsc, uint8_t *ibuf, u_int ilen)
+{
+       hidkbd_apple_translate(vsc, ibuf, ilen, apple_iso_trans,
+           nitems(apple_iso_trans));
+       hidkbd_apple_munge(vsc, ibuf, ilen);
+}
+
+void
+hidkbd_apple_mba_munge(void *vsc, uint8_t *ibuf, u_int ilen)
+{
+       struct hidkbd *kbd = vsc;
+
+       if (!hid_get_data(ibuf, ilen, &kbd->sc_fn))
+               return;
+
+       hidkbd_apple_translate(vsc, ibuf, ilen, apple_mba_trans,
+           nitems(apple_mba_trans));
+}
+
+void
+hidkbd_apple_iso_mba_munge(void *vsc, uint8_t *ibuf, u_int ilen)
+{
+       hidkbd_apple_translate(vsc, ibuf, ilen, apple_iso_trans,
+           nitems(apple_iso_trans));
+       hidkbd_apple_mba_munge(vsc, ibuf, ilen);
+}
+
 void
 hidkbd_input(struct hidkbd *kbd, uint8_t *data, u_int len)
 {
        struct hidkbd_data *ud = &kbd->sc_ndata;
        int i;
 
+       if (kbd->sc_munge != NULL)
+               (*kbd->sc_munge)(kbd, (uint8_t *)data, len);
+
 #ifdef HIDKBD_DEBUG
        if (hidkbddebug > 5) {
                printf("hidkbd_input: data");
index 02c67fb..f8efc80 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: hidkbdsc.h,v 1.1 2016/01/08 15:54:13 jcs Exp $        */
+/*     $OpenBSD: hidkbdsc.h,v 1.2 2022/09/16 16:30:10 robert Exp $     */
 /*      $NetBSD: ukbd.c,v 1.85 2003/03/11 16:44:00 augustss Exp $        */
 
 /*
@@ -69,6 +69,9 @@ struct hidkbd {
        struct hid_location sc_compose;
        int sc_leds;
 
+       /* optional extra input source used by sc_munge */
+       struct hid_location sc_fn;
+
        /* state information */
        struct device *sc_device;
        struct device *sc_wskbddev;
@@ -88,6 +91,13 @@ struct hidkbd {
        int sc_polling;
        int sc_npollchar;
        u_int16_t sc_pollchars[MAXKEYS];
+
+       void (*sc_munge)(void *, uint8_t *, u_int);
+};
+
+struct hidkbd_translation {
+       uint8_t original;
+       uint8_t translation;
 };
 
 int    hidkbd_attach(struct device *, struct hidkbd *, int, uint32_t,
@@ -101,5 +111,10 @@ int        hidkbd_enable(struct hidkbd *, int);
 void   hidkbd_input(struct hidkbd *, uint8_t *, u_int);
 int    hidkbd_ioctl(struct hidkbd *, u_long, caddr_t, int, struct proc *);
 int    hidkbd_set_leds(struct hidkbd *, int, uint8_t *);
+uint8_t        hidkbd_translate(const struct hidkbd_translation *, size_t, uint8_t);
+void   hidkbd_apple_munge(void *, uint8_t *, u_int);
+void   hidkbd_apple_iso_munge(void *, uint8_t *, u_int);
+void   hidkbd_apple_mba_munge(void *, uint8_t *, u_int);
+void   hidkbd_apple_iso_mba_munge(void *, uint8_t *, u_int);
 
 extern int hidkbd_is_console;
index 5214fdd..4847b1d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ukbd.c,v 1.86 2022/01/09 05:43:00 jsg Exp $   */
+/*     $OpenBSD: ukbd.c,v 1.87 2022/09/16 16:30:10 robert Exp $        */
 /*      $NetBSD: ukbd.c,v 1.85 2003/03/11 16:44:00 augustss Exp $        */
 
 /*
@@ -132,7 +132,6 @@ struct ukbd_softc {
        struct hidkbd           sc_kbd;
        int                     sc_spl;
        struct hid_location     sc_apple_fn;
-       void                    (*sc_munge)(void *, uint8_t *, u_int);
 
 #ifdef DDB
        struct timeout          sc_ddb; /* for entering DDB */
@@ -178,21 +177,9 @@ const struct cfattach ukbd_ca = {
        sizeof(struct ukbd_softc), ukbd_match, ukbd_attach, ukbd_detach
 };
 
-struct ukbd_translation {
-       uint8_t original;
-       uint8_t translation;
-};
-
 #ifdef __loongson__
 void   ukbd_gdium_munge(void *, uint8_t *, u_int);
 #endif
-void   ukbd_apple_munge(void *, uint8_t *, u_int);
-void   ukbd_apple_mba_munge(void *, uint8_t *, u_int);
-void   ukbd_apple_iso_munge(void *, uint8_t *, u_int);
-void   ukbd_apple_iso_mba_munge(void *, uint8_t *, u_int);
-void   ukbd_apple_translate(void *, uint8_t *, u_int,
-           const struct ukbd_translation *, u_int);
-uint8_t        ukbd_translate(const struct ukbd_translation *, size_t, uint8_t);
 
 int
 ukbd_match(struct device *parent, void *match, void *aux)
@@ -263,12 +250,12 @@ ukbd_attach(struct device *parent, struct device *self, void *aux)
                                case USB_PRODUCT_APPLE_GEYSER3_ISO:
                                case USB_PRODUCT_APPLE_WELLSPRING6_ISO:
                                case USB_PRODUCT_APPLE_WELLSPRING8_ISO:
-                                       sc->sc_munge = ukbd_apple_iso_munge;
+                                       kbd->sc_munge = hidkbd_apple_iso_munge;
                                        break;
                                case USB_PRODUCT_APPLE_WELLSPRING_ISO:
                                case USB_PRODUCT_APPLE_WELLSPRING4_ISO:
                                case USB_PRODUCT_APPLE_WELLSPRING4A_ISO:
-                                       sc->sc_munge = ukbd_apple_iso_mba_munge;
+                                       kbd->sc_munge = hidkbd_apple_iso_mba_munge;
                                        break;
                                case USB_PRODUCT_APPLE_WELLSPRING_ANSI:
                                case USB_PRODUCT_APPLE_WELLSPRING_JIS:
@@ -276,10 +263,10 @@ ukbd_attach(struct device *parent, struct device *self, void *aux)
                                case USB_PRODUCT_APPLE_WELLSPRING4_JIS:
                                case USB_PRODUCT_APPLE_WELLSPRING4A_ANSI:
                                case USB_PRODUCT_APPLE_WELLSPRING4A_JIS:
-                                       sc->sc_munge = ukbd_apple_mba_munge;
+                                       kbd->sc_munge = hidkbd_apple_mba_munge;
                                        break;
                                default:
-                                       sc->sc_munge = ukbd_apple_munge;
+                                       kbd->sc_munge = hidkbd_apple_munge;
                                        break;
                                }
                        }
@@ -315,7 +302,7 @@ ukbd_attach(struct device *parent, struct device *self, void *aux)
 #ifdef __loongson__
        if (uha->uaa->vendor == USB_VENDOR_CYPRESS &&
            uha->uaa->product == USB_PRODUCT_CYPRESS_LPRDK)
-               sc->sc_munge = ukbd_gdium_munge;
+               kbd->sc_munge = ukbd_gdium_munge;
 #endif
 
        if (kbd->sc_console_keyboard) {
@@ -362,11 +349,8 @@ ukbd_intr(struct uhidev *addr, void *ibuf, u_int len)
        struct ukbd_softc *sc = (struct ukbd_softc *)addr;
        struct hidkbd *kbd = &sc->sc_kbd;
 
-       if (kbd->sc_enabled != 0) {
-               if (sc->sc_munge != NULL)
-                       (*sc->sc_munge)(sc, (uint8_t *)ibuf, len);
+       if (kbd->sc_enabled != 0)
                hidkbd_input(kbd, (uint8_t *)ibuf, len);
-       }
 }
 
 int
@@ -515,140 +499,6 @@ ukbd_cnattach(void)
        return (0);
 }
 
-uint8_t
-ukbd_translate(const struct ukbd_translation *table, size_t tsize,
-    uint8_t keycode)
-{
-       for (; tsize != 0; table++, tsize--)
-               if (table->original == keycode)
-                       return table->translation;
-       return 0;
-}
-
-void
-ukbd_apple_translate(void *vsc, uint8_t *ibuf, u_int ilen,
-    const struct ukbd_translation* trans, u_int tlen)
-{
-       struct ukbd_softc *sc = vsc;
-       struct hidkbd *kbd = &sc->sc_kbd;
-       uint8_t *pos, *spos, *epos, xlat;
-
-       spos = ibuf + kbd->sc_keycodeloc.pos / 8;
-       epos = spos + kbd->sc_nkeycode;
-
-       for (pos = spos; pos != epos; pos++) {
-               xlat = ukbd_translate(trans, tlen, *pos);
-               if (xlat != 0)
-                       *pos = xlat;
-       }
-}
-
-void
-ukbd_apple_munge(void *vsc, uint8_t *ibuf, u_int ilen)
-{
-       struct ukbd_softc *sc = vsc;
-
-       static const struct ukbd_translation apple_fn_trans[] = {
-               { 40, 73 },     /* return -> insert */
-               { 42, 76 },     /* backspace -> delete */
-#ifdef notyet
-               { 58, 0 },      /* F1 -> screen brightness down */
-               { 59, 0 },      /* F2 -> screen brightness up */
-               { 60, 0 },      /* F3 */
-               { 61, 0 },      /* F4 */
-               { 62, 0 },      /* F5 -> keyboard backlight down */
-               { 63, 0 },      /* F6 -> keyboard backlight up */
-               { 64, 0 },      /* F7 -> audio back */
-               { 65, 0 },      /* F8 -> audio pause/play */
-               { 66, 0 },      /* F9 -> audio next */
-#endif
-#ifdef __macppc__
-               { 58, 233 },    /* F1 -> screen brightness down */
-               { 59, 232 },    /* F2 -> screen brightness up */
-               { 60, 127 },    /* F3 -> audio mute */
-               { 61, 129 },    /* F4 -> audio lower */
-               { 62, 128 },    /* F5 -> audio raise */
-#else
-               { 67, 127 },    /* F10 -> audio mute */
-               { 68, 129 },    /* F11 -> audio lower */
-               { 69, 128 },    /* F12 -> audio raise */
-#endif
-               { 79, 77 },     /* right -> end */
-               { 80, 74 },     /* left -> home */
-               { 81, 78 },     /* down -> page down */
-               { 82, 75 }      /* up -> page up */
-       };
-
-       if (!hid_get_data(ibuf, ilen, &sc->sc_apple_fn))
-               return;
-
-       ukbd_apple_translate(vsc, ibuf, ilen, apple_fn_trans,
-           nitems(apple_fn_trans));
-}
-
-void
-ukbd_apple_mba_munge(void *vsc, uint8_t *ibuf, u_int ilen)
-{
-       struct ukbd_softc *sc = vsc;
-
-       static const struct ukbd_translation apple_fn_trans[] = {
-               { 40, 73 },     /* return -> insert */
-               { 42, 76 },     /* backspace -> delete */
-#ifdef notyet
-               { 58, 0 },      /* F1 -> screen brightness down */
-               { 59, 0 },      /* F2 -> screen brightness up */
-               { 60, 0 },      /* F3 */
-               { 61, 0 },      /* F4 */
-               { 62, 0 },      /* F5 */
-               { 63, 0 },      /* F6 -> audio back */
-               { 64, 0 },      /* F7 -> audio pause/play */
-               { 65, 0 },      /* F8 -> audio next */
-#endif
-               { 66, 127 },    /* F9 -> audio mute */
-               { 67, 129 },    /* F10 -> audio lower */
-               { 68, 128 },    /* F11 -> audio raise */
-#ifdef notyet
-               { 69, 0 },      /* F12 -> eject */
-#endif
-               { 79, 77 },     /* right -> end */
-               { 80, 74 },     /* left -> home */
-               { 81, 78 },     /* down -> page down */
-               { 82, 75 }      /* up -> page up */
-       };
-
-       if (!hid_get_data(ibuf, ilen, &sc->sc_apple_fn))
-               return;
-
-       ukbd_apple_translate(vsc, ibuf, ilen, apple_fn_trans,
-           nitems(apple_fn_trans));
-}
-
-void
-ukbd_apple_iso_munge(void *vsc, uint8_t *ibuf, u_int ilen)
-{
-       static const struct ukbd_translation apple_iso_trans[] = {
-               { 53, 100 },    /* less -> grave */
-               { 100, 53 },
-       };
-
-       ukbd_apple_translate(vsc, ibuf, ilen, apple_iso_trans,
-           nitems(apple_iso_trans));
-       ukbd_apple_munge(vsc, ibuf, ilen);
-}
-
-void
-ukbd_apple_iso_mba_munge(void *vsc, uint8_t *ibuf, u_int ilen)
-{
-       static const struct ukbd_translation apple_iso_trans[] = {
-               { 53, 100 },    /* less -> grave */
-               { 100, 53 },
-       };
-
-       ukbd_apple_translate(vsc, ibuf, ilen, apple_iso_trans,
-           nitems(apple_iso_trans));
-       ukbd_apple_mba_munge(vsc, ibuf, ilen);
-}
-
 #ifdef __loongson__
 /*
  * Software Fn- translation for Gdium Liberty keyboard.
@@ -662,7 +512,7 @@ ukbd_gdium_munge(void *vsc, uint8_t *ibuf, u_int ilen)
        uint8_t *pos, *spos, *epos, xlat;
        int fn;
 
-       static const struct ukbd_translation gdium_fn_trans[] = {
+       static const struct hidkbd_translation gdium_fn_trans[] = {
 #ifdef notyet
                { 58, 0 },      /* F1 -> toggle camera */
                { 59, 0 },      /* F2 -> toggle wireless */
@@ -707,7 +557,7 @@ ukbd_gdium_munge(void *vsc, uint8_t *ibuf, u_int ilen)
 
        if (fn != 0)
                for (pos = spos; pos != epos; pos++) {
-                       xlat = ukbd_translate(gdium_fn_trans,
+                       xlat = hidkbd_translate(gdium_fn_trans,
                            nitems(gdium_fn_trans), *pos);
                        if (xlat != 0)
                                *pos = xlat;