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__
>
signature.asc
Description: OpenPGP digital signature
