Skip to content

Commit

Permalink
ukbd: Enable ukbd_apple_swap for all Apple ISO keyboards
Browse files Browse the repository at this point in the history
Key code swapping between [<>] and [^°] key is enabled for all Apple ISO type keyboards.
Before, swapping was enabled when the Eject key was detected in HID usage.
This did not correlate well with the swapped keys presence.

usbdevs file is extended by several Apple keyboard models to support ISO model identification.
  • Loading branch information
frarohi committed Nov 3, 2024
1 parent 2416be5 commit 7398806
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 7 deletions.
74 changes: 67 additions & 7 deletions sys/dev/usb/input/ukbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@

#include <dev/usb/quirk/usb_quirk.h>

#include "usbdevs.h"

#ifdef EVDEV_SUPPORT
#include <dev/evdev/input.h>
#include <dev/evdev/evdev.h>
Expand Down Expand Up @@ -173,13 +175,19 @@ struct ukbd_softc {
#define UKBD_FLAG_ATTACHED 0x00000010
#define UKBD_FLAG_GONE 0x00000020

#define UKBD_FLAG_HID_MASK 0x003fffc0
#define UKBD_FLAG_APPLE_EJECT 0x00000040
#define UKBD_FLAG_APPLE_FN 0x00000080
#define UKBD_FLAG_APPLE_SWAP 0x00000100
/* set in ukbd_attach */
#define UKBD_FLAG_APPLE_SWAP 0x00000040
/* set in ukbd_parse_hid */
#define UKBD_FLAG_APPLE_EJECT 0x00000080
#define UKBD_FLAG_APPLE_FN 0x00000100
#define UKBD_FLAG_NUMLOCK 0x00080000
#define UKBD_FLAG_CAPSLOCK 0x00100000
#define UKBD_FLAG_SCROLLLOCK 0x00200000
#define UKBD_FLAG_HID_MASK UKBD_FLAG_APPLE_EJECT | \
UKBD_FLAG_APPLE_FN | \
UKBD_FLAG_NUMLOCK | \
UKBD_FLAG_CAPSLOCK | \
UKBD_FLAG_SCROLLLOCK

int sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */
int sc_state; /* shift/lock key state */
Expand Down Expand Up @@ -240,7 +248,7 @@ struct ukbd_softc {
* 0x68: F13
* 0x69: F14
* 0x6a: F15
*
*
* USB Apple Keyboard JIS generates:
* 0x90: Kana
* 0x91: Eisu
Expand Down Expand Up @@ -296,6 +304,48 @@ static const uint8_t ukbd_boot_desc[] = {
0xff, 0x00, 0x81, 0x00, 0xc0
};

static const STRUCT_USB_HOST_ID ukbd_apple_iso_models[] = {
/* PowerBooks Feb 2005, iBooks G4 */
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_FOUNTAIN_ISO) },
/* PowerBooks Oct 2005 */
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_GEYSER_ISO) },
/* Core Duo MacBook & MacBook Pro */
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_GEYSER3_ISO) },
/* Core2 Duo MacBook & MacBook Pro */
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_GEYSER4_ISO) },
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_GEYSER4_HF_ISO) },
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_ALU_MINI_ISO) },
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_ALU_ISO) },
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_ALU_REVB_ISO) },
/* MacbookAir, aka wellspring */
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_WELLSPRING_ISO) },
/* MacbookProPenryn, aka wellspring2 */
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_WELLSPRING2_ISO) },
/* Macbook5,1 (unibody), aka wellspring3 */
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_WELLSPRING3_ISO) },
/* MacbookAir3,2 (unibody), aka wellspring4 */
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_WELLSPRING4_ISO) },
/* MacbookAir3,1 (unibody), aka wellspring4 */
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_WELLSPRING4A_ISO) },
/* Macbook8 (unibody, March 2011) */
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_WELLSPRING5_ISO) },
/* Macbook8,2 (unibody) */
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_WELLSPRING5A_ISO) },
/* MacbookAir4,2 (unibody, July 2011) */
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_WELLSPRING6_ISO) },
/* MacbookAir4,1 (unibody, July 2011) */
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_WELLSPRING6A_ISO) },
/* MacbookPro10,1 (unibody, June 2012) */
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_WELLSPRING7_ISO) },
/* MacbookPro10,2 (unibody, October 2012) */
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_WELLSPRING7A_ISO) },
/* MacbookAir6,2 (unibody, June 2013) */
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_WELLSPRING8_ISO) },
/* MacbookPro12,1 */
{ USB_VP(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_WELLSPRING9_ISO) },
};


/* prototypes */
static void ukbd_timeout(void *);
static void ukbd_set_leds(struct ukbd_softc *, uint8_t);
Expand Down Expand Up @@ -1001,8 +1051,7 @@ ukbd_parse_hid(struct ukbd_softc *sc, const uint8_t *ptr, uint32_t len)
hid_input, 0, &sc->sc_loc_apple_eject, &flags,
&sc->sc_id_apple_eject)) {
if (flags & HIO_VARIABLE)
sc->sc_flags |= UKBD_FLAG_APPLE_EJECT |
UKBD_FLAG_APPLE_SWAP;
sc->sc_flags |= UKBD_FLAG_APPLE_EJECT;
DPRINTFN(1, "Found Apple eject-key\n");
}
if (hid_locate(ptr, len,
Expand Down Expand Up @@ -1138,6 +1187,17 @@ ukbd_attach(device_t dev)
sc->sc_fkeymap[n] = fkey_tab[n];
}

/* check if this is an Apple keyboard with swapped key codes
* apparently, these are the ISO layout models
*/
DPRINTF("uaa vendor: 0x%04x, uaa product 0x%04x\n", uaa->info.idVendor, uaa->info.idProduct );
if (usbd_lookup_id_by_uaa(ukbd_apple_iso_models, sizeof(ukbd_apple_iso_models), uaa) == 0) {
sc->sc_flags |= UKBD_FLAG_APPLE_SWAP;
DPRINTF("UKBD_FLAG_APPLE_SWAP set\n");
} else {
DPRINTF("UKBD_FLAG_APPLE_SWAP not set\n");
}

kbd_set_maps(kbd, &sc->sc_keymap, &sc->sc_accmap,
sc->sc_fkeymap, UKBD_NFKEY);

Expand Down
42 changes: 42 additions & 0 deletions sys/dev/usb/usbdevs
Original file line number Diff line number Diff line change
Expand Up @@ -1141,10 +1141,38 @@ product AOX USB101 0x0008 Ethernet
product APPLE IMAC_KBD 0x0201 USB iMac Keyboard
product APPLE KBD 0x0202 USB Keyboard M2452
product APPLE EXT_KBD 0x020c Apple Extended USB Keyboard
/* PowerBooks Feb 2005, iBooks G4 */
product APPLE FOUNTAIN_ANSI 0x020e Apple Internal Keyboard/Trackpad
product APPLE FOUNTAIN_ISO 0x020f Apple Internal Keyboard/Trackpad
/* 17 inch PowerBook */
product APPLE GEYSER_17 0x020d Apple Internal Keyboard/Trackpad
/* PowerBooks Oct 2005 */
product APPLE GEYSER_ANSI 0x0214 Apple Internal Keyboard/Trackpad
product APPLE GEYSER_ISO 0x0215 Apple Internal Keyboard/Trackpad
product APPLE GEYSER_JIS 0x0216 Apple Internal Keyboard/Trackpad
/* Core Duo MacBook & MacBook Pro */
product APPLE GEYSER3_ANSI 0x0217 Apple Internal Keyboard/Trackpad
product APPLE GEYSER3_ISO 0x0218 Apple Internal Keyboard/Trackpad
product APPLE GEYSER3_JIS 0x0219 Apple Internal Keyboard/Trackpad
/* Core2 Duo MacBook & MacBook Pro */
product APPLE GEYSER4_ANSI 0x021a Apple Internal Keyboard/Trackpad
product APPLE GEYSER4_ISO 0x021b Apple Internal Keyboard/Trackpad
product APPLE GEYSER4_JIS 0x021c Apple Internal Keyboard/Trackpad
/* External */
product APPLE ALU_MINI_ANSI 0x021d Apple Keyboard/Trackpad
product APPLE ALU_MINI_ISO 0x021e Apple Keyboard/Trackpad
product APPLE ALU_MINI_JIS 0x021f Apple Keyboard/Trackpad
product APPLE ALU_ANSI 0x0220 Apple Keyboard/Trackpad
product APPLE ALU_ISO 0x0221 Apple Keyboard/Trackpad
product APPLE ALU_JIS 0x0222 Apple Keyboard/Trackpad
/* MacbookAir, aka wellspring */
product APPLE WELLSPRING_ANSI 0x0223 Apple Internal Keyboard/Trackpad
product APPLE WELLSPRING_ISO 0x0224 Apple Internal Keyboard/Trackpad
product APPLE WELLSPRING_JIS 0x0225 Apple Internal Keyboard/Trackpad
/* Core2 Duo MacBook3,1 */
product APPLE GEYSER4_HF_ANSI 0x0229 Apple Internal Keyboard/Trackpad
product APPLE GEYSER4_HF_ISO 0x022a Apple Internal Keyboard/Trackpad
product APPLE GEYSER4_HF_JIS 0x022b Apple Internal Keyboard/Trackpad
/* MacbookProPenryn, aka wellspring2 */
product APPLE WELLSPRING2_ANSI 0x0230 Apple Internal Keyboard/Trackpad
product APPLE WELLSPRING2_ISO 0x0231 Apple Internal Keyboard/Trackpad
Expand Down Expand Up @@ -1173,6 +1201,10 @@ product APPLE WELLSPRING6A_JIS 0x024b Apple Internal Keyboard/Trackpad
product APPLE WELLSPRING6_ANSI 0x024c Apple Internal Keyboard/Trackpad
product APPLE WELLSPRING6_ISO 0x024d Apple Internal Keyboard/Trackpad
product APPLE WELLSPRING6_JIS 0x024e Apple Internal Keyboard/Trackpad
/* External */
product APPLE ALU_REVB_ANSI 0x024f Apple Keyboard/Trackpad
product APPLE ALU_REVB_ISO 0x0250 Apple Keyboard/Trackpad
product APPLE ALU_REVB_JIS 0x0251 Apple Keyboard/Trackpad
/* Macbook8,2 (unibody) */
product APPLE WELLSPRING5A_ANSI 0x0252 Apple Internal Keyboard/Trackpad
product APPLE WELLSPRING5A_ISO 0x0253 Apple Internal Keyboard/Trackpad
Expand All @@ -1193,6 +1225,16 @@ product APPLE WELLSPRING8_JIS 0x0292 Apple Internal Keyboard/Trackpad
product APPLE WELLSPRING9_ANSI 0x0272 Apple Internal Keyboard/Trackpad
product APPLE WELLSPRING9_ISO 0x0273 Apple Internal Keyboard/Trackpad
product APPLE WELLSPRING9_JIS 0x0274 Apple Internal Keyboard/Trackpad
product APPLE WELLSPRINGT2_J140K 0x027a Apple Internal Keyboard/Trackpad
product APPLE WELLSPRINGT2_J132 0x027b Apple Internal Keyboard/Trackpad
product APPLE WELLSPRINGT2_J680 0x027c Apple Internal Keyboard/Trackpad
product APPLE WELLSPRINGT2_J213 0x027d Apple Internal Keyboard/Trackpad
product APPLE WELLSPRINGT2_J214K 0x027e Apple Internal Keyboard/Trackpad
product APPLE WELLSPRINGT2_J223 0x027f Apple Internal Keyboard/Trackpad
product APPLE WELLSPRINGT2_J230K 0x0280 Apple Internal Keyboard/Trackpad
product APPLE WELLSPRINGT2_J152F 0x0340 Apple Internal Keyboard/Trackpad
product APPLE MAGIC_KEYBOARD_2021 0x029c Apple Internal Keyboard/Trackpad
product APPLE MAGIC_KEYBOARD_FINGERPRINT_2021 0x029a Apple Keyboard/Trackpad
product APPLE MAGIC_TRACKPAD2 0x0265 Apple Magic Trackpad 2
product APPLE MOUSE 0x0301 Mouse M4848
product APPLE OPTMOUSE 0x0302 Optical mouse
Expand Down

0 comments on commit 7398806

Please sign in to comment.