summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorRobert Nagy <robert@cvs.openbsd.org>2022-09-16 16:30:11 +0000
committerRobert Nagy <robert@cvs.openbsd.org>2022-09-16 16:30:11 +0000
commit2da6b17245a6bf27a9aaacecf717b044a03c1163 (patch)
tree1b6d8f110c899fc49058ab9952a638e3f6b2220b /sys/dev
parentc7db1a0c27fbe158e610096b03f73c69c5c4c5bd (diff)
move most of the key combination translation code out of ukbd(4)
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@
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/hid/hidkbd.c133
-rw-r--r--sys/dev/hid/hidkbdsc.h17
-rw-r--r--sys/dev/usb/ukbd.c168
3 files changed, 157 insertions, 161 deletions
diff --git a/sys/dev/hid/hidkbd.c b/sys/dev/hid/hidkbd.c
index a3053ec2aba..08e02c4f9c5 100644
--- a/sys/dev/hid/hidkbd.c
+++ b/sys/dev/hid/hidkbd.c
@@ -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");
diff --git a/sys/dev/hid/hidkbdsc.h b/sys/dev/hid/hidkbdsc.h
index 02c67fb2ff0..f8efc80fe45 100644
--- a/sys/dev/hid/hidkbdsc.h
+++ b/sys/dev/hid/hidkbdsc.h
@@ -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;
diff --git a/sys/dev/usb/ukbd.c b/sys/dev/usb/ukbd.c
index 5214fdda16d..4847b1d95ca 100644
--- a/sys/dev/usb/ukbd.c
+++ b/sys/dev/usb/ukbd.c
@@ -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;