Hey,

Any interest?

Thanks,
William Orr

On 2/4/15 9:37 AM, William Orr wrote:
> 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__
> 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to