On Tue, Dec 08, 2015 at 10:12:38PM +0100, Joerg Jung wrote:
> On Thu, Aug 06, 2015 at 09:58:56PM +0200, Joerg Jung wrote:
> > On Wed, Feb 18, 2015 at 10:33:57PM -0800, William Orr wrote:
> > > 
> > > Any interest?
> > 
> > I'm interested in this. Your diff looks reasonable, so I applied it and 
> > it compiled fine, but the less and grave keys are still wrong exchanged
> > on my MacBookAir4,2. Looks like usbdevs says I have a 
> > USB_PRODUCT_APPLE_WELLSPRING6_ISO:
> > 
> >    port 2 addr 7: full speed, power 40 mA, config 1, Apple Internal
> >       Keyboard / Trackpad(0x024d), Apple Inc.(0x05ac), rev 2.09   
> > 
> > So I guess some more case's are required in the diff below?
> >  
> > > On 2/4/15 9:37 AM, William Orr wrote:
> > > > 
> > > > 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.
> 
> Please find below an updated diff which also includes a case for the ISO
> keyboard found in my older MacbookAir4,2.
> 
> This newer diff also includes some minor KNF and whitespace cleanup.
> 
> I would really like to commit this, as this fixes a real bug (exchanged
> grave/less key). So no longer fiddling with xmodmap required.

Slightly updated diff below, sorting the switch cases in the same order
as found in usbdevs.
 
OK, anyone?


Index: sys/dev/usb/ukbd.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/ukbd.c,v
retrieving revision 1.71
diff -u -p -r1.71 ukbd.c
--- sys/dev/usb/ukbd.c  14 Mar 2015 03:38:50 -0000      1.71
+++ sys/dev/usb/ukbd.c  8 Dec 2015 22:40:12 -0000
@@ -158,13 +158,13 @@ const struct wskbd_accessops ukbd_access
        ukbd_ioctl,
 };
 
-int ukbd_match(struct device *, void *, void *); 
-void ukbd_attach(struct device *, struct device *, void *); 
-int ukbd_detach(struct device *, int); 
-
-struct cfdriver ukbd_cd = { 
-       NULL, "ukbd", DV_DULL 
-}; 
+int    ukbd_match(struct device *, void *, void *);
+void   ukbd_attach(struct device *, struct device *, void *);
+int    ukbd_detach(struct device *, int);
+
+struct cfdriver ukbd_cd = {
+       NULL, "ukbd", DV_DULL
+};
 
 const struct cfattach ukbd_ca = {
        sizeof(struct ukbd_softc), ukbd_match, ukbd_attach, ukbd_detach
@@ -181,6 +181,9 @@ 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
@@ -241,17 +244,20 @@ ukbd_attach(struct device *parent, struc
                                switch (uha->uaa->product) {
                                case USB_PRODUCT_APPLE_FOUNTAIN_ISO:
                                case USB_PRODUCT_APPLE_GEYSER_ISO:
+                               case USB_PRODUCT_APPLE_WELLSPRING6_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_WELLSPRING4A_JIS:
-                               case USB_PRODUCT_APPLE_WELLSPRING4_ANSI:
+                               case USB_PRODUCT_APPLE_WELLSPRING_ISO:
                                case USB_PRODUCT_APPLE_WELLSPRING4_ISO:
-                               case USB_PRODUCT_APPLE_WELLSPRING4_JIS:
+                               case USB_PRODUCT_APPLE_WELLSPRING4A_ISO:
+                                       sc->sc_munge = ukbd_apple_iso_mba_munge;
+                                       break;
                                case USB_PRODUCT_APPLE_WELLSPRING_ANSI:
-                               case USB_PRODUCT_APPLE_WELLSPRING_ISO:
                                case USB_PRODUCT_APPLE_WELLSPRING_JIS:
+                               case USB_PRODUCT_APPLE_WELLSPRING4_ANSI:
+                               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;
                                        break;
                                default:
@@ -431,15 +437,14 @@ ukbd_cnpollc(void *v, int on)
 }
 
 void
-ukbd_cnbell(void *v, u_int pitch, u_int period, u_int volume) 
+ukbd_cnbell(void *v, u_int pitch, u_int period, u_int volume)
 {
        hidkbd_bell(pitch, period, volume, 1);
-}      
+}
 
 int
 ukbd_cnattach(void)
 {
-
        /*
         * XXX USB requires too many parts of the kernel to be running
         * XXX in order to work, so we can't do much for the console
@@ -460,12 +465,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 */
@@ -498,23 +519,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 */
@@ -544,40 +556,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;
+       ukbd_apple_translate(vsc, ibuf, ilen, apple_iso_trans,
+           nitems(apple_iso_trans));
+       ukbd_apple_munge(vsc, ibuf, ilen);
+}
 
-       for (pos = spos; pos != epos; pos++) {
-               xlat = ukbd_translate(apple_iso_trans,
-                   nitems(apple_iso_trans), *pos);
-               if (xlat != 0)
-                       *pos = xlat;
-       }
+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_munge(vsc, ibuf, ilen);
+       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