Hey,

This implements some of Alexey's comments as well as munging the grave key for
macbook airs. Tested on a mba with a WELLSPRING ANSI keyboard.

Thanks,
William Orr

Index: sys/dev/usb/ukbd.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/ukbd.c,v
retrieving revision 1.70
diff -u -b -w -p -r1.70 ukbd.c
--- sys/dev/usb/ukbd.c  19 Jan 2015 20:16:10 -0000      1.70
+++ sys/dev/usb/ukbd.c  4 Feb 2015 05:18:47 -0000
@@ -182,6 +182,11 @@ void       ukbd_gdium_munge(void *, uint8_t *,
 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
@@ -244,14 +249,16 @@ ukbd_attach(struct device *parent, struc
                                case USB_PRODUCT_APPLE_GEYSER_ISO:
                                        sc->sc_munge = ukbd_apple_iso_munge;
                                        break;
-                               case USB_PRODUCT_APPLE_WELLSPRING4A_ANSI:
                                case USB_PRODUCT_APPLE_WELLSPRING4A_ISO:
+                               case USB_PRODUCT_APPLE_WELLSPRING4_ISO:
+                               case USB_PRODUCT_APPLE_WELLSPRING_ISO:
+                                       sc->sc_munge = ukbd_apple_iso_mba_munge;
+                                       break;
+                               case USB_PRODUCT_APPLE_WELLSPRING4A_ANSI:
                                case USB_PRODUCT_APPLE_WELLSPRING4A_JIS:
                                case USB_PRODUCT_APPLE_WELLSPRING4_ANSI:
-                               case USB_PRODUCT_APPLE_WELLSPRING4_ISO:
                                case USB_PRODUCT_APPLE_WELLSPRING4_JIS:
                                case USB_PRODUCT_APPLE_WELLSPRING_ANSI:
-                               case USB_PRODUCT_APPLE_WELLSPRING_ISO:
                                case USB_PRODUCT_APPLE_WELLSPRING_JIS:
                                        sc->sc_munge = ukbd_apple_mba_munge;
                                        break;
@@ -461,12 +468,28 @@ ukbd_translate(const struct ukbd_transla
 }
 
 void
-ukbd_apple_munge(void *vsc, uint8_t *ibuf, u_int ilen)
+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 */
@@ -499,23 +522,14 @@ ukbd_apple_munge(void *vsc, uint8_t *ibu
        if (!hid_get_data(ibuf, ilen, &sc->sc_apple_fn))
                return;
 
-       spos = ibuf + kbd->sc_keycodeloc.pos / 8;
-       epos = spos + kbd->sc_nkeycode;
-
-       for (pos = spos; pos != epos; pos++) {
-               xlat = ukbd_translate(apple_fn_trans,
-                   nitems(apple_fn_trans), *pos);
-               if (xlat != 0)
-                       *pos = xlat;
-       }
+       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;
-       struct hidkbd *kbd = &sc->sc_kbd;
-       uint8_t *pos, *spos, *epos, xlat;
 
        static const struct ukbd_translation apple_fn_trans[] = {
                { 40, 73 },     /* return -> insert */
@@ -545,40 +559,34 @@ ukbd_apple_mba_munge(void *vsc, uint8_t 
        if (!hid_get_data(ibuf, ilen, &sc->sc_apple_fn))
                return;
 
-       spos = ibuf + kbd->sc_keycodeloc.pos / 8;
-       epos = spos + kbd->sc_nkeycode;
-
-       for (pos = spos; pos != epos; pos++) {
-               xlat = ukbd_translate(apple_fn_trans,
-                   nitems(apple_fn_trans), *pos);
-               if (xlat != 0)
-                       *pos = xlat;
-       }
+       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)
 {
-       struct ukbd_softc *sc = vsc;
-       struct hidkbd *kbd = &sc->sc_kbd;
-       uint8_t *pos, *spos, *epos, xlat;
-
        static const struct ukbd_translation apple_iso_trans[] = {
                { 53, 100 },    /* less -> grave */
                { 100, 53 },
        };
 
-       spos = ibuf + kbd->sc_keycodeloc.pos / 8;
-       epos = spos + kbd->sc_nkeycode;
-
-       for (pos = spos; pos != epos; pos++) {
-               xlat = ukbd_translate(apple_iso_trans,
-                   nitems(apple_iso_trans), *pos);
-               if (xlat != 0)
-                       *pos = xlat;
+       ukbd_apple_translate(vsc, ibuf, ilen, apple_iso_trans,
+                            nitems(apple_iso_trans));
+       ukbd_apple_munge(vsc, ibuf, ilen);
        }
 
-       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__

Reply via email to