1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
diff -uNr linux-source-2.6.24/drivers/hid/hid-input.c linux-source-2.6.24-macbookair/drivers/hid/hid-input.c
--- linux-source-2.6.24/drivers/hid/hid-input.c 2008-01-24 23:58:37.000000000 +0100
+++ linux-source-2.6.24-macbookair/drivers/hid/hid-input.c 2008-02-22 07:46:21.000000000 +0100
@@ -119,6 +119,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 },
@@ -176,8 +200,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;
@@ -200,8 +226,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) {
@@ -217,6 +243,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) {
@@ -241,6 +275,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);
diff -uNr linux-source-2.6.24/drivers/hid/usbhid/hid-quirks.c linux-source-2.6.24-macbookair/drivers/hid/usbhid/hid-quirks.c
--- linux-source-2.6.24/drivers/hid/usbhid/hid-quirks.c 2008-01-24 23:58:37.000000000 +0100
+++ linux-source-2.6.24-macbookair/drivers/hid/usbhid/hid-quirks.c 2008-02-22 10:23:07.000000000 +0100
@@ -59,6 +59,25 @@
#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
+
+/* macbookair1,1 keyboards */
+#define USB_DEVICE_ID_APPLE_GEYSER5_HF_ANSI 0x0224
+
+/* 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_IRCONTROL4 0x8242
@@ -551,6 +570,25 @@
{ 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},
+
+ /* macbookair1,1 keyboards */
+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER5_HF_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | 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 },
diff -uNr linux-source-2.6.24/include/linux/hid.h linux-source-2.6.24-macbookair/include/linux/hid.h
--- linux-source-2.6.24/include/linux/hid.h 2008-01-24 23:58:37.000000000 +0100
+++ linux-source-2.6.24-macbookair/include/linux/hid.h 2008-02-22 07:46:21.000000000 +0100
@@ -281,6 +281,7 @@
#define HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL 0x00400000
#define HID_QUIRK_LOGITECH_EXPANDED_KEYMAP 0x00800000
#define HID_QUIRK_IGNORE_HIDINPUT 0x01000000
+#define HID_QUIRK_APPLE_KEYBOARD 0x02000000
/*
* Separate quirks for runtime report descriptor fixup
|