Add FN key support for new wired aluminum Apple USB Keyboard. From: Martin Szulecki Added delete, pageup/down, home/end (not labelled on this kb, but on all others), and support for macbook3,1 . From: Chris Irwin --- --- a/drivers/hid/hid-input.c 2007-10-22 19:51:16.000000000 +0200 +++ b/drivers/hid/hid-input.c 2007-10-22 22:18:09.000000000 +0200 @@ -102,6 +102,30 @@ { } }; +static struct hidinput_key_translation apple_keyboard_fn_keys[] = { + { KEY_BACKSPACE, KEY_DELETE }, + { KEY_F1, KEY_BRIGHTNESSDOWN, POWERBOOK_FLAG_FKEY }, + { KEY_F2, KEY_BRIGHTNESSUP, POWERBOOK_FLAG_FKEY }, + { KEY_F3, KEY_CYCLEWINDOWS, POWERBOOK_FLAG_FKEY }, + { KEY_F4, KEY_CONFIG, POWERBOOK_FLAG_FKEY }, + { KEY_F7, KEY_PREVIOUSSONG, POWERBOOK_FLAG_FKEY }, + { KEY_F8, KEY_PLAYPAUSE, POWERBOOK_FLAG_FKEY }, + { KEY_F9, KEY_NEXTSONG, POWERBOOK_FLAG_FKEY }, + { KEY_F10, KEY_MUTE, POWERBOOK_FLAG_FKEY }, + { KEY_F11, KEY_VOLUMEDOWN, POWERBOOK_FLAG_FKEY }, + { KEY_F12, KEY_VOLUMEUP, POWERBOOK_FLAG_FKEY }, + { KEY_UP, KEY_PAGEUP }, + { KEY_DOWN, KEY_PAGEDOWN }, + { KEY_LEFT, KEY_HOME }, + { KEY_RIGHT, KEY_END }, + { } +}; + +static struct hidinput_key_translation apple_keyboard[] = { + { KEY_VOLUMEUP, KEY_EJECTCD }, + { } +}; + static struct hidinput_key_translation powerbook_numlock_keys[] = { { KEY_J, KEY_KP1 }, { KEY_K, KEY_KP2 }, @@ -159,8 +178,10 @@ if (hid_pb_fnmode) { int do_translate; - - trans = find_translation(powerbook_fn_keys, usage->code); + if (hid->quirks & HID_QUIRK_APPLE_KEYBOARD) + trans = find_translation(apple_keyboard_fn_keys, usage->code); + else + trans = find_translation(powerbook_fn_keys, usage->code); if (trans) { if (test_bit(usage->code, hid->pb_pressed_fn)) do_translate = 1; @@ -183,8 +204,8 @@ } } - if (test_bit(usage->code, hid->pb_pressed_numlock) || - test_bit(LED_NUML, input->led)) { + if (!(hid->quirks & HID_QUIRK_APPLE_KEYBOARD) && (test_bit(usage->code, hid->pb_pressed_numlock) || + test_bit(LED_NUML, input->led))) { trans = find_translation(powerbook_numlock_keys, usage->code); if (trans) { @@ -200,6 +221,14 @@ } } + if (hid->quirks & HID_QUIRK_APPLE_KEYBOARD) { + trans = find_translation(apple_keyboard, usage->code); + if (trans) { + input_event(input, usage->type, trans->to, value); + return 1; + } + } + if (hid->quirks & HID_QUIRK_POWERBOOK_ISO_KEYBOARD) { trans = find_translation(powerbook_iso_keyboard, usage->code); if (trans) { @@ -224,6 +253,12 @@ for (trans = powerbook_numlock_keys; trans->from; trans++) set_bit(trans->to, input->keybit); + for (trans = apple_keyboard_fn_keys; trans->from; trans++) + set_bit(trans->to, input->keybit); + + for (trans = apple_keyboard; trans->from; trans++) + set_bit(trans->to, input->keybit); + for (trans = powerbook_iso_keyboard; trans->from; trans++) set_bit(trans->to, input->keybit); --- a/include/linux/hid.h 2007-10-22 22:29:07.000000000 +0200 +++ b/include/linux/hid.h 2007-10-22 22:24:07.000000000 +0200 @@ -276,6 +276,7 @@ #define HID_QUIRK_DUPLICATE_USAGES 0x00200000 #define HID_QUIRK_RESET_LEDS 0x00400000 #define HID_QUIRK_SWAPPED_MIN_MAX 0x00800000 +#define HID_QUIRK_APPLE_KEYBOARD 0x01000000 /* * This is the global environment of the parser. This information is --- a/drivers/hid/usbhid/hid-quirks.c 2007-10-22 20:06:47.000000000 +0200 +++ b/drivers/hid/usbhid/hid-quirks.c 2007-10-22 22:19:57.000000000 +0200 @@ -59,6 +59,22 @@ #define USB_DEVICE_ID_APPLE_GEYSER4_ANSI 0x021a #define USB_DEVICE_ID_APPLE_GEYSER4_ISO 0x021b #define USB_DEVICE_ID_APPLE_GEYSER4_JIS 0x021c + +/* Apple 2007 Wired keyboards */ +#define USB_DEVICE_ID_APPLE_KEYBOARD_ANSI 0x0220 +#define USB_DEVICE_ID_APPLE_KEYBOARD_ISO 0x0221 +#define USB_DEVICE_ID_APPLE_KEYBOARD_JIS 0x0222 + +/* macbook3,1 keyboards */ +#define USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI 0x0229 +#define USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO 0x022a +#define USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS 0x022b + +/* Apple 2007 Wireless keyboards */ +#define USB_DEVICE_ID_APPLE_WIRELESS_KEYBOARD_ANSI 0x022c +#define USB_DEVICE_ID_APPLE_WIRELESS_KEYBOARD_ISO 0x022d +#define USB_DEVICE_ID_APPLE_WIRELESS_KEYBOARD_JIS 0x022e + #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b #define USB_DEVICE_ID_APPLE_IR 0x8240 @@ -444,6 +445,22 @@ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, + + /* Apple 2007 Wired keyboards */ + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_KEYBOARD_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD}, + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_KEYBOARD_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_KEYBOARD_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD}, + + /* macbook3,1 keyboards */ + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD}, + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD}, + + /* Apple 2007 Wireless keyboards */ + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WIRELESS_KEYBOARD_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD}, + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WIRELESS_KEYBOARD_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WIRELESS_KEYBOARD_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD}, + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },