Linux v2.6.18-rc5
[pohmelfs.git] / drivers / macintosh / adbhid.c
blobc69d23bb255e54683357eed0026aaa0040e999d7
1 /*
2 * drivers/input/adbhid.c
4 * ADB HID driver for Power Macintosh computers.
6 * Adapted from drivers/macintosh/mac_keyb.c by Franz Sirl.
7 * drivers/macintosh/mac_keyb.c was Copyright (C) 1996 Paul Mackerras
8 * with considerable contributions from Ben Herrenschmidt and others.
10 * Copyright (C) 2000 Franz Sirl.
12 * Adapted to ADB changes and support for more devices by
13 * Benjamin Herrenschmidt. Adapted from code in MkLinux
14 * and reworked.
16 * Supported devices:
18 * - Standard 1 button mouse
19 * - All standard Apple Extended protocol (handler ID 4)
20 * - mouseman and trackman mice & trackballs
21 * - PowerBook Trackpad (default setup: enable tapping)
22 * - MicroSpeed mouse & trackball (needs testing)
23 * - CH Products Trackball Pro (needs testing)
24 * - Contour Design (Contour Mouse)
25 * - Hunter digital (NoHandsMouse)
26 * - Kensignton TurboMouse 5 (needs testing)
27 * - Mouse Systems A3 mice and trackballs <aidan@kublai.com>
28 * - MacAlly 2-buttons mouse (needs testing) <pochini@denise.shiny.it>
30 * To do:
32 * Improve Kensington support.
33 * Split mouse/kbd
34 * Move to syfs
37 #include <linux/module.h>
38 #include <linux/slab.h>
39 #include <linux/init.h>
40 #include <linux/notifier.h>
41 #include <linux/input.h>
43 #include <linux/adb.h>
44 #include <linux/cuda.h>
45 #include <linux/pmu.h>
47 #include <asm/machdep.h>
48 #include <asm/backlight.h>
49 #ifdef CONFIG_PPC_PMAC
50 #include <asm/pmac_feature.h>
51 #endif
53 MODULE_AUTHOR("Franz Sirl <Franz.Sirl-kernel@lauterbach.com>");
55 #define KEYB_KEYREG 0 /* register # for key up/down data */
56 #define KEYB_LEDREG 2 /* register # for leds on ADB keyboard */
57 #define MOUSE_DATAREG 0 /* reg# for movement/button codes from mouse */
59 static int adb_message_handler(struct notifier_block *, unsigned long, void *);
60 static struct notifier_block adbhid_adb_notifier = {
61 .notifier_call = adb_message_handler,
64 /* Some special keys */
65 #define ADB_KEY_DEL 0x33
66 #define ADB_KEY_CMD 0x37
67 #define ADB_KEY_CAPSLOCK 0x39
68 #define ADB_KEY_FN 0x3f
69 #define ADB_KEY_FWDEL 0x75
70 #define ADB_KEY_POWER_OLD 0x7e
71 #define ADB_KEY_POWER 0x7f
73 u8 adb_to_linux_keycodes[128] = {
74 /* 0x00 */ KEY_A, /* 30 */
75 /* 0x01 */ KEY_S, /* 31 */
76 /* 0x02 */ KEY_D, /* 32 */
77 /* 0x03 */ KEY_F, /* 33 */
78 /* 0x04 */ KEY_H, /* 35 */
79 /* 0x05 */ KEY_G, /* 34 */
80 /* 0x06 */ KEY_Z, /* 44 */
81 /* 0x07 */ KEY_X, /* 45 */
82 /* 0x08 */ KEY_C, /* 46 */
83 /* 0x09 */ KEY_V, /* 47 */
84 /* 0x0a */ KEY_102ND, /* 86 */
85 /* 0x0b */ KEY_B, /* 48 */
86 /* 0x0c */ KEY_Q, /* 16 */
87 /* 0x0d */ KEY_W, /* 17 */
88 /* 0x0e */ KEY_E, /* 18 */
89 /* 0x0f */ KEY_R, /* 19 */
90 /* 0x10 */ KEY_Y, /* 21 */
91 /* 0x11 */ KEY_T, /* 20 */
92 /* 0x12 */ KEY_1, /* 2 */
93 /* 0x13 */ KEY_2, /* 3 */
94 /* 0x14 */ KEY_3, /* 4 */
95 /* 0x15 */ KEY_4, /* 5 */
96 /* 0x16 */ KEY_6, /* 7 */
97 /* 0x17 */ KEY_5, /* 6 */
98 /* 0x18 */ KEY_EQUAL, /* 13 */
99 /* 0x19 */ KEY_9, /* 10 */
100 /* 0x1a */ KEY_7, /* 8 */
101 /* 0x1b */ KEY_MINUS, /* 12 */
102 /* 0x1c */ KEY_8, /* 9 */
103 /* 0x1d */ KEY_0, /* 11 */
104 /* 0x1e */ KEY_RIGHTBRACE, /* 27 */
105 /* 0x1f */ KEY_O, /* 24 */
106 /* 0x20 */ KEY_U, /* 22 */
107 /* 0x21 */ KEY_LEFTBRACE, /* 26 */
108 /* 0x22 */ KEY_I, /* 23 */
109 /* 0x23 */ KEY_P, /* 25 */
110 /* 0x24 */ KEY_ENTER, /* 28 */
111 /* 0x25 */ KEY_L, /* 38 */
112 /* 0x26 */ KEY_J, /* 36 */
113 /* 0x27 */ KEY_APOSTROPHE, /* 40 */
114 /* 0x28 */ KEY_K, /* 37 */
115 /* 0x29 */ KEY_SEMICOLON, /* 39 */
116 /* 0x2a */ KEY_BACKSLASH, /* 43 */
117 /* 0x2b */ KEY_COMMA, /* 51 */
118 /* 0x2c */ KEY_SLASH, /* 53 */
119 /* 0x2d */ KEY_N, /* 49 */
120 /* 0x2e */ KEY_M, /* 50 */
121 /* 0x2f */ KEY_DOT, /* 52 */
122 /* 0x30 */ KEY_TAB, /* 15 */
123 /* 0x31 */ KEY_SPACE, /* 57 */
124 /* 0x32 */ KEY_GRAVE, /* 41 */
125 /* 0x33 */ KEY_BACKSPACE, /* 14 */
126 /* 0x34 */ KEY_KPENTER, /* 96 */
127 /* 0x35 */ KEY_ESC, /* 1 */
128 /* 0x36 */ KEY_LEFTCTRL, /* 29 */
129 /* 0x37 */ KEY_LEFTMETA, /* 125 */
130 /* 0x38 */ KEY_LEFTSHIFT, /* 42 */
131 /* 0x39 */ KEY_CAPSLOCK, /* 58 */
132 /* 0x3a */ KEY_LEFTALT, /* 56 */
133 /* 0x3b */ KEY_LEFT, /* 105 */
134 /* 0x3c */ KEY_RIGHT, /* 106 */
135 /* 0x3d */ KEY_DOWN, /* 108 */
136 /* 0x3e */ KEY_UP, /* 103 */
137 /* 0x3f */ 0,
138 /* 0x40 */ 0,
139 /* 0x41 */ KEY_KPDOT, /* 83 */
140 /* 0x42 */ 0,
141 /* 0x43 */ KEY_KPASTERISK, /* 55 */
142 /* 0x44 */ 0,
143 /* 0x45 */ KEY_KPPLUS, /* 78 */
144 /* 0x46 */ 0,
145 /* 0x47 */ KEY_NUMLOCK, /* 69 */
146 /* 0x48 */ 0,
147 /* 0x49 */ 0,
148 /* 0x4a */ 0,
149 /* 0x4b */ KEY_KPSLASH, /* 98 */
150 /* 0x4c */ KEY_KPENTER, /* 96 */
151 /* 0x4d */ 0,
152 /* 0x4e */ KEY_KPMINUS, /* 74 */
153 /* 0x4f */ 0,
154 /* 0x50 */ 0,
155 /* 0x51 */ KEY_KPEQUAL, /* 117 */
156 /* 0x52 */ KEY_KP0, /* 82 */
157 /* 0x53 */ KEY_KP1, /* 79 */
158 /* 0x54 */ KEY_KP2, /* 80 */
159 /* 0x55 */ KEY_KP3, /* 81 */
160 /* 0x56 */ KEY_KP4, /* 75 */
161 /* 0x57 */ KEY_KP5, /* 76 */
162 /* 0x58 */ KEY_KP6, /* 77 */
163 /* 0x59 */ KEY_KP7, /* 71 */
164 /* 0x5a */ 0,
165 /* 0x5b */ KEY_KP8, /* 72 */
166 /* 0x5c */ KEY_KP9, /* 73 */
167 /* 0x5d */ KEY_YEN, /* 124 */
168 /* 0x5e */ KEY_RO, /* 89 */
169 /* 0x5f */ KEY_KPCOMMA, /* 121 */
170 /* 0x60 */ KEY_F5, /* 63 */
171 /* 0x61 */ KEY_F6, /* 64 */
172 /* 0x62 */ KEY_F7, /* 65 */
173 /* 0x63 */ KEY_F3, /* 61 */
174 /* 0x64 */ KEY_F8, /* 66 */
175 /* 0x65 */ KEY_F9, /* 67 */
176 /* 0x66 */ KEY_HANJA, /* 123 */
177 /* 0x67 */ KEY_F11, /* 87 */
178 /* 0x68 */ KEY_HANGEUL, /* 122 */
179 /* 0x69 */ KEY_SYSRQ, /* 99 */
180 /* 0x6a */ 0,
181 /* 0x6b */ KEY_SCROLLLOCK, /* 70 */
182 /* 0x6c */ 0,
183 /* 0x6d */ KEY_F10, /* 68 */
184 /* 0x6e */ KEY_COMPOSE, /* 127 */
185 /* 0x6f */ KEY_F12, /* 88 */
186 /* 0x70 */ 0,
187 /* 0x71 */ KEY_PAUSE, /* 119 */
188 /* 0x72 */ KEY_INSERT, /* 110 */
189 /* 0x73 */ KEY_HOME, /* 102 */
190 /* 0x74 */ KEY_PAGEUP, /* 104 */
191 /* 0x75 */ KEY_DELETE, /* 111 */
192 /* 0x76 */ KEY_F4, /* 62 */
193 /* 0x77 */ KEY_END, /* 107 */
194 /* 0x78 */ KEY_F2, /* 60 */
195 /* 0x79 */ KEY_PAGEDOWN, /* 109 */
196 /* 0x7a */ KEY_F1, /* 59 */
197 /* 0x7b */ KEY_RIGHTSHIFT, /* 54 */
198 /* 0x7c */ KEY_RIGHTALT, /* 100 */
199 /* 0x7d */ KEY_RIGHTCTRL, /* 97 */
200 /* 0x7e */ KEY_RIGHTMETA, /* 126 */
201 /* 0x7f */ KEY_POWER, /* 116 */
204 struct adbhid {
205 struct input_dev *input;
206 int id;
207 int default_id;
208 int original_handler_id;
209 int current_handler_id;
210 int mouse_kind;
211 unsigned char *keycode;
212 char name[64];
213 char phys[32];
214 int flags;
217 #define FLAG_FN_KEY_PRESSED 0x00000001
218 #define FLAG_POWER_FROM_FN 0x00000002
219 #define FLAG_EMU_FWDEL_DOWN 0x00000004
221 static struct adbhid *adbhid[16];
223 static void adbhid_probe(void);
225 static void adbhid_input_keycode(int, int, int, struct pt_regs *);
227 static void init_trackpad(int id);
228 static void init_trackball(int id);
229 static void init_turbomouse(int id);
230 static void init_microspeed(int id);
231 static void init_ms_a3(int id);
233 static struct adb_ids keyboard_ids;
234 static struct adb_ids mouse_ids;
235 static struct adb_ids buttons_ids;
237 /* Kind of keyboard, see Apple technote 1152 */
238 #define ADB_KEYBOARD_UNKNOWN 0
239 #define ADB_KEYBOARD_ANSI 0x0100
240 #define ADB_KEYBOARD_ISO 0x0200
241 #define ADB_KEYBOARD_JIS 0x0300
243 /* Kind of mouse */
244 #define ADBMOUSE_STANDARD_100 0 /* Standard 100cpi mouse (handler 1) */
245 #define ADBMOUSE_STANDARD_200 1 /* Standard 200cpi mouse (handler 2) */
246 #define ADBMOUSE_EXTENDED 2 /* Apple Extended mouse (handler 4) */
247 #define ADBMOUSE_TRACKBALL 3 /* TrackBall (handler 4) */
248 #define ADBMOUSE_TRACKPAD 4 /* Apple's PowerBook trackpad (handler 4) */
249 #define ADBMOUSE_TURBOMOUSE5 5 /* Turbomouse 5 (previously req. mousehack) */
250 #define ADBMOUSE_MICROSPEED 6 /* Microspeed mouse (&trackball ?), MacPoint */
251 #define ADBMOUSE_TRACKBALLPRO 7 /* Trackball Pro (special buttons) */
252 #define ADBMOUSE_MS_A3 8 /* Mouse systems A3 trackball (handler 3) */
253 #define ADBMOUSE_MACALLY2 9 /* MacAlly 2-button mouse */
255 static void
256 adbhid_keyboard_input(unsigned char *data, int nb, struct pt_regs *regs, int apoll)
258 int id = (data[0] >> 4) & 0x0f;
260 if (!adbhid[id]) {
261 printk(KERN_ERR "ADB HID on ID %d not yet registered, packet %#02x, %#02x, %#02x, %#02x\n",
262 id, data[0], data[1], data[2], data[3]);
263 return;
266 /* first check this is from register 0 */
267 if (nb != 3 || (data[0] & 3) != KEYB_KEYREG)
268 return; /* ignore it */
269 adbhid_input_keycode(id, data[1], 0, regs);
270 if (!(data[2] == 0xff || (data[2] == 0x7f && data[1] == 0x7f)))
271 adbhid_input_keycode(id, data[2], 0, regs);
274 static void
275 adbhid_input_keycode(int id, int keycode, int repeat, struct pt_regs *regs)
277 struct adbhid *ahid = adbhid[id];
278 int up_flag;
280 up_flag = (keycode & 0x80);
281 keycode &= 0x7f;
283 switch (keycode) {
284 case ADB_KEY_CAPSLOCK: /* Generate down/up events for CapsLock everytime. */
285 input_regs(ahid->input, regs);
286 input_report_key(ahid->input, KEY_CAPSLOCK, 1);
287 input_report_key(ahid->input, KEY_CAPSLOCK, 0);
288 input_sync(ahid->input);
289 return;
290 #ifdef CONFIG_PPC_PMAC
291 case ADB_KEY_POWER_OLD: /* Power key on PBook 3400 needs remapping */
292 switch(pmac_call_feature(PMAC_FTR_GET_MB_INFO,
293 NULL, PMAC_MB_INFO_MODEL, 0)) {
294 case PMAC_TYPE_COMET:
295 case PMAC_TYPE_HOOPER:
296 case PMAC_TYPE_KANGA:
297 keycode = ADB_KEY_POWER;
299 break;
300 case ADB_KEY_POWER:
301 /* Fn + Command will produce a bogus "power" keycode */
302 if (ahid->flags & FLAG_FN_KEY_PRESSED) {
303 keycode = ADB_KEY_CMD;
304 if (up_flag)
305 ahid->flags &= ~FLAG_POWER_FROM_FN;
306 else
307 ahid->flags |= FLAG_POWER_FROM_FN;
308 } else if (ahid->flags & FLAG_POWER_FROM_FN) {
309 keycode = ADB_KEY_CMD;
310 ahid->flags &= ~FLAG_POWER_FROM_FN;
312 break;
313 case ADB_KEY_FN:
314 /* Keep track of the Fn key state */
315 if (up_flag) {
316 ahid->flags &= ~FLAG_FN_KEY_PRESSED;
317 /* Emulate Fn+delete = forward delete */
318 if (ahid->flags & FLAG_EMU_FWDEL_DOWN) {
319 ahid->flags &= ~FLAG_EMU_FWDEL_DOWN;
320 keycode = ADB_KEY_FWDEL;
321 break;
323 } else
324 ahid->flags |= FLAG_FN_KEY_PRESSED;
325 /* Swallow the key press */
326 return;
327 case ADB_KEY_DEL:
328 /* Emulate Fn+delete = forward delete */
329 if (ahid->flags & FLAG_FN_KEY_PRESSED) {
330 keycode = ADB_KEY_FWDEL;
331 if (up_flag)
332 ahid->flags &= ~FLAG_EMU_FWDEL_DOWN;
333 else
334 ahid->flags |= FLAG_EMU_FWDEL_DOWN;
336 break;
337 #endif /* CONFIG_PPC_PMAC */
340 if (adbhid[id]->keycode[keycode]) {
341 input_regs(adbhid[id]->input, regs);
342 input_report_key(adbhid[id]->input,
343 adbhid[id]->keycode[keycode], !up_flag);
344 input_sync(adbhid[id]->input);
345 } else
346 printk(KERN_INFO "Unhandled ADB key (scancode %#02x) %s.\n", keycode,
347 up_flag ? "released" : "pressed");
351 static void
352 adbhid_mouse_input(unsigned char *data, int nb, struct pt_regs *regs, int autopoll)
354 int id = (data[0] >> 4) & 0x0f;
356 if (!adbhid[id]) {
357 printk(KERN_ERR "ADB HID on ID %d not yet registered\n", id);
358 return;
362 Handler 1 -- 100cpi original Apple mouse protocol.
363 Handler 2 -- 200cpi original Apple mouse protocol.
365 For Apple's standard one-button mouse protocol the data array will
366 contain the following values:
368 BITS COMMENTS
369 data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd.
370 data[1] = bxxx xxxx First button and x-axis motion.
371 data[2] = byyy yyyy Second button and y-axis motion.
373 Handler 4 -- Apple Extended mouse protocol.
375 For Apple's 3-button mouse protocol the data array will contain the
376 following values:
378 BITS COMMENTS
379 data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd.
380 data[1] = bxxx xxxx Left button and x-axis motion.
381 data[2] = byyy yyyy Second button and y-axis motion.
382 data[3] = byyy bxxx Third button and fourth button. Y is additional
383 high bits of y-axis motion. XY is additional
384 high bits of x-axis motion.
386 MacAlly 2-button mouse protocol.
388 For MacAlly 2-button mouse protocol the data array will contain the
389 following values:
391 BITS COMMENTS
392 data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd.
393 data[1] = bxxx xxxx Left button and x-axis motion.
394 data[2] = byyy yyyy Right button and y-axis motion.
395 data[3] = ???? ???? unknown
396 data[4] = ???? ???? unknown
400 /* If it's a trackpad, we alias the second button to the first.
401 NOTE: Apple sends an ADB flush command to the trackpad when
402 the first (the real) button is released. We could do
403 this here using async flush requests.
405 switch (adbhid[id]->mouse_kind)
407 case ADBMOUSE_TRACKPAD:
408 data[1] = (data[1] & 0x7f) | ((data[1] & data[2]) & 0x80);
409 data[2] = data[2] | 0x80;
410 break;
411 case ADBMOUSE_MICROSPEED:
412 data[1] = (data[1] & 0x7f) | ((data[3] & 0x01) << 7);
413 data[2] = (data[2] & 0x7f) | ((data[3] & 0x02) << 6);
414 data[3] = (data[3] & 0x77) | ((data[3] & 0x04) << 5)
415 | (data[3] & 0x08);
416 break;
417 case ADBMOUSE_TRACKBALLPRO:
418 data[1] = (data[1] & 0x7f) | (((data[3] & 0x04) << 5)
419 & ((data[3] & 0x08) << 4));
420 data[2] = (data[2] & 0x7f) | ((data[3] & 0x01) << 7);
421 data[3] = (data[3] & 0x77) | ((data[3] & 0x02) << 6);
422 break;
423 case ADBMOUSE_MS_A3:
424 data[1] = (data[1] & 0x7f) | ((data[3] & 0x01) << 7);
425 data[2] = (data[2] & 0x7f) | ((data[3] & 0x02) << 6);
426 data[3] = ((data[3] & 0x04) << 5);
427 break;
428 case ADBMOUSE_MACALLY2:
429 data[3] = (data[2] & 0x80) ? 0x80 : 0x00;
430 data[2] |= 0x80; /* Right button is mapped as button 3 */
431 nb=4;
432 break;
435 input_regs(adbhid[id]->input, regs);
437 input_report_key(adbhid[id]->input, BTN_LEFT, !((data[1] >> 7) & 1));
438 input_report_key(adbhid[id]->input, BTN_MIDDLE, !((data[2] >> 7) & 1));
440 if (nb >= 4 && adbhid[id]->mouse_kind != ADBMOUSE_TRACKPAD)
441 input_report_key(adbhid[id]->input, BTN_RIGHT, !((data[3] >> 7) & 1));
443 input_report_rel(adbhid[id]->input, REL_X,
444 ((data[2]&0x7f) < 64 ? (data[2]&0x7f) : (data[2]&0x7f)-128 ));
445 input_report_rel(adbhid[id]->input, REL_Y,
446 ((data[1]&0x7f) < 64 ? (data[1]&0x7f) : (data[1]&0x7f)-128 ));
448 input_sync(adbhid[id]->input);
451 static void
452 adbhid_buttons_input(unsigned char *data, int nb, struct pt_regs *regs, int autopoll)
454 int id = (data[0] >> 4) & 0x0f;
456 if (!adbhid[id]) {
457 printk(KERN_ERR "ADB HID on ID %d not yet registered\n", id);
458 return;
461 input_regs(adbhid[id]->input, regs);
463 switch (adbhid[id]->original_handler_id) {
464 default:
465 case 0x02: /* Adjustable keyboard button device */
467 int down = (data[1] == (data[1] & 0xf));
469 switch (data[1] & 0x0f) {
470 case 0x0: /* microphone */
471 input_report_key(adbhid[id]->input, KEY_SOUND, down);
472 break;
474 case 0x1: /* mute */
475 input_report_key(adbhid[id]->input, KEY_MUTE, down);
476 break;
478 case 0x2: /* volume decrease */
479 input_report_key(adbhid[id]->input, KEY_VOLUMEDOWN, down);
480 break;
482 case 0x3: /* volume increase */
483 input_report_key(adbhid[id]->input, KEY_VOLUMEUP, down);
484 break;
486 default:
487 printk(KERN_INFO "Unhandled ADB_MISC event %02x, %02x, %02x, %02x\n",
488 data[0], data[1], data[2], data[3]);
489 break;
492 break;
494 case 0x1f: /* Powerbook button device */
496 int down = (data[1] == (data[1] & 0xf));
499 * XXX: Where is the contrast control for the passive?
500 * -- Cort
503 switch (data[1] & 0x0f) {
504 case 0x8: /* mute */
505 input_report_key(adbhid[id]->input, KEY_MUTE, down);
506 break;
508 case 0x7: /* volume decrease */
509 input_report_key(adbhid[id]->input, KEY_VOLUMEDOWN, down);
510 break;
512 case 0x6: /* volume increase */
513 input_report_key(adbhid[id]->input, KEY_VOLUMEUP, down);
514 break;
516 case 0xb: /* eject */
517 input_report_key(adbhid[id]->input, KEY_EJECTCD, down);
518 break;
520 case 0xa: /* brightness decrease */
521 #ifdef CONFIG_PMAC_BACKLIGHT
522 if (down)
523 pmac_backlight_key_down();
524 #endif
525 input_report_key(adbhid[id]->input, KEY_BRIGHTNESSDOWN, down);
526 break;
528 case 0x9: /* brightness increase */
529 #ifdef CONFIG_PMAC_BACKLIGHT
530 if (down)
531 pmac_backlight_key_up();
532 #endif
533 input_report_key(adbhid[id]->input, KEY_BRIGHTNESSUP, down);
534 break;
536 case 0xc: /* videomode switch */
537 input_report_key(adbhid[id]->input, KEY_SWITCHVIDEOMODE, down);
538 break;
540 case 0xd: /* keyboard illumination toggle */
541 input_report_key(adbhid[id]->input, KEY_KBDILLUMTOGGLE, down);
542 break;
544 case 0xe: /* keyboard illumination decrease */
545 input_report_key(adbhid[id]->input, KEY_KBDILLUMDOWN, down);
546 break;
548 case 0xf:
549 switch (data[1]) {
550 case 0x8f:
551 case 0x0f:
552 /* keyboard illumination increase */
553 input_report_key(adbhid[id]->input, KEY_KBDILLUMUP, down);
554 break;
556 case 0x7f:
557 case 0xff:
558 /* keypad overlay toogle */
559 break;
561 default:
562 printk(KERN_INFO "Unhandled ADB_MISC event %02x, %02x, %02x, %02x\n",
563 data[0], data[1], data[2], data[3]);
564 break;
566 break;
567 default:
568 printk(KERN_INFO "Unhandled ADB_MISC event %02x, %02x, %02x, %02x\n",
569 data[0], data[1], data[2], data[3]);
570 break;
573 break;
576 input_sync(adbhid[id]->input);
579 static struct adb_request led_request;
580 static int leds_pending[16];
581 static int leds_req_pending;
582 static int pending_devs[16];
583 static int pending_led_start=0;
584 static int pending_led_end=0;
585 static DEFINE_SPINLOCK(leds_lock);
587 static void leds_done(struct adb_request *req)
589 int leds = 0, device = 0, pending = 0;
590 unsigned long flags;
592 spin_lock_irqsave(&leds_lock, flags);
594 if (pending_led_start != pending_led_end) {
595 device = pending_devs[pending_led_start];
596 leds = leds_pending[device] & 0xff;
597 leds_pending[device] = 0;
598 pending_led_start++;
599 pending_led_start = (pending_led_start < 16) ? pending_led_start : 0;
600 pending = leds_req_pending;
601 } else
602 leds_req_pending = 0;
603 spin_unlock_irqrestore(&leds_lock, flags);
604 if (pending)
605 adb_request(&led_request, leds_done, 0, 3,
606 ADB_WRITEREG(device, KEYB_LEDREG), 0xff, ~leds);
609 static void real_leds(unsigned char leds, int device)
611 unsigned long flags;
613 spin_lock_irqsave(&leds_lock, flags);
614 if (!leds_req_pending) {
615 leds_req_pending = 1;
616 spin_unlock_irqrestore(&leds_lock, flags);
617 adb_request(&led_request, leds_done, 0, 3,
618 ADB_WRITEREG(device, KEYB_LEDREG), 0xff, ~leds);
619 return;
620 } else {
621 if (!(leds_pending[device] & 0x100)) {
622 pending_devs[pending_led_end] = device;
623 pending_led_end++;
624 pending_led_end = (pending_led_end < 16) ? pending_led_end : 0;
626 leds_pending[device] = leds | 0x100;
628 spin_unlock_irqrestore(&leds_lock, flags);
632 * Event callback from the input module. Events that change the state of
633 * the hardware are processed here.
635 static int adbhid_kbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
637 struct adbhid *adbhid = dev->private;
638 unsigned char leds;
640 switch (type) {
641 case EV_LED:
642 leds = (test_bit(LED_SCROLLL, dev->led) ? 4 : 0)
643 | (test_bit(LED_NUML, dev->led) ? 1 : 0)
644 | (test_bit(LED_CAPSL, dev->led) ? 2 : 0);
645 real_leds(leds, adbhid->id);
646 return 0;
649 return -1;
652 static int
653 adb_message_handler(struct notifier_block *this, unsigned long code, void *x)
655 switch (code) {
656 case ADB_MSG_PRE_RESET:
657 case ADB_MSG_POWERDOWN:
658 /* Stop the repeat timer. Autopoll is already off at this point */
660 int i;
661 for (i = 1; i < 16; i++) {
662 if (adbhid[i])
663 del_timer_sync(&adbhid[i]->input->timer);
667 /* Stop pending led requests */
668 while(leds_req_pending)
669 adb_poll();
670 break;
672 case ADB_MSG_POST_RESET:
673 adbhid_probe();
674 break;
676 return NOTIFY_DONE;
679 static int
680 adbhid_input_register(int id, int default_id, int original_handler_id,
681 int current_handler_id, int mouse_kind)
683 struct adbhid *hid;
684 struct input_dev *input_dev;
685 int err;
686 int i;
688 if (adbhid[id]) {
689 printk(KERN_ERR "Trying to reregister ADB HID on ID %d\n", id);
690 return -EEXIST;
693 adbhid[id] = hid = kzalloc(sizeof(struct adbhid), GFP_KERNEL);
694 input_dev = input_allocate_device();
695 if (!hid || !input_dev) {
696 err = -ENOMEM;
697 goto fail;
701 sprintf(hid->phys, "adb%d:%d.%02x/input", id, default_id, original_handler_id);
703 hid->input = input_dev;
704 hid->id = default_id;
705 hid->original_handler_id = original_handler_id;
706 hid->current_handler_id = current_handler_id;
707 hid->mouse_kind = mouse_kind;
708 hid->flags = 0;
709 input_dev->private = hid;
710 input_dev->name = hid->name;
711 input_dev->phys = hid->phys;
712 input_dev->id.bustype = BUS_ADB;
713 input_dev->id.vendor = 0x0001;
714 input_dev->id.product = (id << 12) | (default_id << 8) | original_handler_id;
715 input_dev->id.version = 0x0100;
717 switch (default_id) {
718 case ADB_KEYBOARD:
719 hid->keycode = kmalloc(sizeof(adb_to_linux_keycodes), GFP_KERNEL);
720 if (!hid->keycode) {
721 err = -ENOMEM;
722 goto fail;
725 sprintf(hid->name, "ADB keyboard");
727 memcpy(hid->keycode, adb_to_linux_keycodes, sizeof(adb_to_linux_keycodes));
729 printk(KERN_INFO "Detected ADB keyboard, type ");
730 switch (original_handler_id) {
731 default:
732 printk("<unknown>.\n");
733 input_dev->id.version = ADB_KEYBOARD_UNKNOWN;
734 break;
736 case 0x01: case 0x02: case 0x03: case 0x06: case 0x08:
737 case 0x0C: case 0x10: case 0x18: case 0x1B: case 0x1C:
738 case 0xC0: case 0xC3: case 0xC6:
739 printk("ANSI.\n");
740 input_dev->id.version = ADB_KEYBOARD_ANSI;
741 break;
743 case 0x04: case 0x05: case 0x07: case 0x09: case 0x0D:
744 case 0x11: case 0x14: case 0x19: case 0x1D: case 0xC1:
745 case 0xC4: case 0xC7:
746 printk("ISO, swapping keys.\n");
747 input_dev->id.version = ADB_KEYBOARD_ISO;
748 i = hid->keycode[10];
749 hid->keycode[10] = hid->keycode[50];
750 hid->keycode[50] = i;
751 break;
753 case 0x12: case 0x15: case 0x16: case 0x17: case 0x1A:
754 case 0x1E: case 0xC2: case 0xC5: case 0xC8: case 0xC9:
755 printk("JIS.\n");
756 input_dev->id.version = ADB_KEYBOARD_JIS;
757 break;
760 for (i = 0; i < 128; i++)
761 if (hid->keycode[i])
762 set_bit(hid->keycode[i], input_dev->keybit);
764 input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
765 input_dev->ledbit[0] = BIT(LED_SCROLLL) | BIT(LED_CAPSL) | BIT(LED_NUML);
766 input_dev->event = adbhid_kbd_event;
767 input_dev->keycodemax = 127;
768 input_dev->keycodesize = 1;
769 break;
771 case ADB_MOUSE:
772 sprintf(hid->name, "ADB mouse");
774 input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
775 input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);
776 input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);
777 break;
779 case ADB_MISC:
780 switch (original_handler_id) {
781 case 0x02: /* Adjustable keyboard button device */
782 sprintf(hid->name, "ADB adjustable keyboard buttons");
783 input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
784 set_bit(KEY_SOUND, input_dev->keybit);
785 set_bit(KEY_MUTE, input_dev->keybit);
786 set_bit(KEY_VOLUMEUP, input_dev->keybit);
787 set_bit(KEY_VOLUMEDOWN, input_dev->keybit);
788 break;
789 case 0x1f: /* Powerbook button device */
790 sprintf(hid->name, "ADB Powerbook buttons");
791 input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
792 set_bit(KEY_MUTE, input_dev->keybit);
793 set_bit(KEY_VOLUMEUP, input_dev->keybit);
794 set_bit(KEY_VOLUMEDOWN, input_dev->keybit);
795 set_bit(KEY_BRIGHTNESSUP, input_dev->keybit);
796 set_bit(KEY_BRIGHTNESSDOWN, input_dev->keybit);
797 set_bit(KEY_EJECTCD, input_dev->keybit);
798 set_bit(KEY_SWITCHVIDEOMODE, input_dev->keybit);
799 set_bit(KEY_KBDILLUMTOGGLE, input_dev->keybit);
800 set_bit(KEY_KBDILLUMDOWN, input_dev->keybit);
801 set_bit(KEY_KBDILLUMUP, input_dev->keybit);
802 break;
804 if (hid->name[0])
805 break;
806 /* else fall through */
808 default:
809 printk(KERN_INFO "Trying to register unknown ADB device to input layer.\n");
810 err = -ENODEV;
811 goto fail;
814 input_dev->keycode = hid->keycode;
816 input_register_device(input_dev);
818 if (default_id == ADB_KEYBOARD) {
819 /* HACK WARNING!! This should go away as soon there is an utility
820 * to control that for event devices.
822 input_dev->rep[REP_DELAY] = 500; /* input layer default: 250 */
823 input_dev->rep[REP_PERIOD] = 66; /* input layer default: 33 */
826 return 0;
828 fail: input_free_device(input_dev);
829 kfree(hid);
830 adbhid[id] = NULL;
831 return err;
834 static void adbhid_input_unregister(int id)
836 input_unregister_device(adbhid[id]->input);
837 kfree(adbhid[id]->keycode);
838 kfree(adbhid[id]);
839 adbhid[id] = NULL;
843 static u16
844 adbhid_input_reregister(int id, int default_id, int org_handler_id,
845 int cur_handler_id, int mk)
847 if (adbhid[id]) {
848 if (adbhid[id]->input->id.product !=
849 ((id << 12)|(default_id << 8)|org_handler_id)) {
850 adbhid_input_unregister(id);
851 adbhid_input_register(id, default_id, org_handler_id,
852 cur_handler_id, mk);
854 } else
855 adbhid_input_register(id, default_id, org_handler_id,
856 cur_handler_id, mk);
857 return 1<<id;
860 static void
861 adbhid_input_devcleanup(u16 exist)
863 int i;
864 for(i=1; i<16; i++)
865 if (adbhid[i] && !(exist&(1<<i)))
866 adbhid_input_unregister(i);
869 static void
870 adbhid_probe(void)
872 struct adb_request req;
873 int i, default_id, org_handler_id, cur_handler_id;
874 u16 reg = 0;
876 adb_register(ADB_MOUSE, 0, &mouse_ids, adbhid_mouse_input);
877 adb_register(ADB_KEYBOARD, 0, &keyboard_ids, adbhid_keyboard_input);
878 adb_register(ADB_MISC, 0, &buttons_ids, adbhid_buttons_input);
880 for (i = 0; i < keyboard_ids.nids; i++) {
881 int id = keyboard_ids.id[i];
883 adb_get_infos(id, &default_id, &org_handler_id);
885 /* turn off all leds */
886 adb_request(&req, NULL, ADBREQ_SYNC, 3,
887 ADB_WRITEREG(id, KEYB_LEDREG), 0xff, 0xff);
889 /* Enable full feature set of the keyboard
890 ->get it to send separate codes for left and right shift,
891 control, option keys */
892 #if 0 /* handler 5 doesn't send separate codes for R modifiers */
893 if (adb_try_handler_change(id, 5))
894 printk("ADB keyboard at %d, handler set to 5\n", id);
895 else
896 #endif
897 if (adb_try_handler_change(id, 3))
898 printk("ADB keyboard at %d, handler set to 3\n", id);
899 else
900 printk("ADB keyboard at %d, handler 1\n", id);
902 adb_get_infos(id, &default_id, &cur_handler_id);
903 reg |= adbhid_input_reregister(id, default_id, org_handler_id,
904 cur_handler_id, 0);
907 for (i = 0; i < buttons_ids.nids; i++) {
908 int id = buttons_ids.id[i];
910 adb_get_infos(id, &default_id, &org_handler_id);
911 reg |= adbhid_input_reregister(id, default_id, org_handler_id,
912 org_handler_id, 0);
915 /* Try to switch all mice to handler 4, or 2 for three-button
916 mode and full resolution. */
917 for (i = 0; i < mouse_ids.nids; i++) {
918 int id = mouse_ids.id[i];
919 int mouse_kind;
921 adb_get_infos(id, &default_id, &org_handler_id);
923 if (adb_try_handler_change(id, 4)) {
924 printk("ADB mouse at %d, handler set to 4", id);
925 mouse_kind = ADBMOUSE_EXTENDED;
927 else if (adb_try_handler_change(id, 0x2F)) {
928 printk("ADB mouse at %d, handler set to 0x2F", id);
929 mouse_kind = ADBMOUSE_MICROSPEED;
931 else if (adb_try_handler_change(id, 0x42)) {
932 printk("ADB mouse at %d, handler set to 0x42", id);
933 mouse_kind = ADBMOUSE_TRACKBALLPRO;
935 else if (adb_try_handler_change(id, 0x66)) {
936 printk("ADB mouse at %d, handler set to 0x66", id);
937 mouse_kind = ADBMOUSE_MICROSPEED;
939 else if (adb_try_handler_change(id, 0x5F)) {
940 printk("ADB mouse at %d, handler set to 0x5F", id);
941 mouse_kind = ADBMOUSE_MICROSPEED;
943 else if (adb_try_handler_change(id, 3)) {
944 printk("ADB mouse at %d, handler set to 3", id);
945 mouse_kind = ADBMOUSE_MS_A3;
947 else if (adb_try_handler_change(id, 2)) {
948 printk("ADB mouse at %d, handler set to 2", id);
949 mouse_kind = ADBMOUSE_STANDARD_200;
951 else {
952 printk("ADB mouse at %d, handler 1", id);
953 mouse_kind = ADBMOUSE_STANDARD_100;
956 if ((mouse_kind == ADBMOUSE_TRACKBALLPRO)
957 || (mouse_kind == ADBMOUSE_MICROSPEED)) {
958 init_microspeed(id);
959 } else if (mouse_kind == ADBMOUSE_MS_A3) {
960 init_ms_a3(id);
961 } else if (mouse_kind == ADBMOUSE_EXTENDED) {
963 * Register 1 is usually used for device
964 * identification. Here, we try to identify
965 * a known device and call the appropriate
966 * init function.
968 adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
969 ADB_READREG(id, 1));
971 if ((req.reply_len) &&
972 (req.reply[1] == 0x9a) && ((req.reply[2] == 0x21)
973 || (req.reply[2] == 0x20))) {
974 mouse_kind = ADBMOUSE_TRACKBALL;
975 init_trackball(id);
977 else if ((req.reply_len >= 4) &&
978 (req.reply[1] == 0x74) && (req.reply[2] == 0x70) &&
979 (req.reply[3] == 0x61) && (req.reply[4] == 0x64)) {
980 mouse_kind = ADBMOUSE_TRACKPAD;
981 init_trackpad(id);
983 else if ((req.reply_len >= 4) &&
984 (req.reply[1] == 0x4b) && (req.reply[2] == 0x4d) &&
985 (req.reply[3] == 0x4c) && (req.reply[4] == 0x31)) {
986 mouse_kind = ADBMOUSE_TURBOMOUSE5;
987 init_turbomouse(id);
989 else if ((req.reply_len == 9) &&
990 (req.reply[1] == 0x4b) && (req.reply[2] == 0x4f) &&
991 (req.reply[3] == 0x49) && (req.reply[4] == 0x54)) {
992 if (adb_try_handler_change(id, 0x42)) {
993 printk("\nADB MacAlly 2-button mouse at %d, handler set to 0x42", id);
994 mouse_kind = ADBMOUSE_MACALLY2;
998 printk("\n");
1000 adb_get_infos(id, &default_id, &cur_handler_id);
1001 reg |= adbhid_input_reregister(id, default_id, org_handler_id,
1002 cur_handler_id, mouse_kind);
1004 adbhid_input_devcleanup(reg);
1007 static void
1008 init_trackpad(int id)
1010 struct adb_request req;
1011 unsigned char r1_buffer[8];
1013 printk(" (trackpad)");
1015 adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
1016 ADB_READREG(id,1));
1017 if (req.reply_len < 8)
1018 printk("bad length for reg. 1\n");
1019 else
1021 memcpy(r1_buffer, &req.reply[1], 8);
1023 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1024 ADB_WRITEREG(id,1),
1025 r1_buffer[0],
1026 r1_buffer[1],
1027 r1_buffer[2],
1028 r1_buffer[3],
1029 r1_buffer[4],
1030 r1_buffer[5],
1031 0x0d,
1032 r1_buffer[7]);
1034 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1035 ADB_WRITEREG(id,2),
1036 0x99,
1037 0x94,
1038 0x19,
1039 0xff,
1040 0xb2,
1041 0x8a,
1042 0x1b,
1043 0x50);
1045 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1046 ADB_WRITEREG(id,1),
1047 r1_buffer[0],
1048 r1_buffer[1],
1049 r1_buffer[2],
1050 r1_buffer[3],
1051 r1_buffer[4],
1052 r1_buffer[5],
1053 0x03, /*r1_buffer[6],*/
1054 r1_buffer[7]);
1056 /* Without this flush, the trackpad may be locked up */
1057 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1061 static void
1062 init_trackball(int id)
1064 struct adb_request req;
1066 printk(" (trackman/mouseman)");
1068 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1069 ADB_WRITEREG(id,1), 00,0x81);
1071 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1072 ADB_WRITEREG(id,1), 01,0x81);
1074 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1075 ADB_WRITEREG(id,1), 02,0x81);
1077 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1078 ADB_WRITEREG(id,1), 03,0x38);
1080 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1081 ADB_WRITEREG(id,1), 00,0x81);
1083 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1084 ADB_WRITEREG(id,1), 01,0x81);
1086 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1087 ADB_WRITEREG(id,1), 02,0x81);
1089 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1090 ADB_WRITEREG(id,1), 03,0x38);
1093 static void
1094 init_turbomouse(int id)
1096 struct adb_request req;
1098 printk(" (TurboMouse 5)");
1100 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1102 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3));
1104 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1105 ADB_WRITEREG(3,2),
1106 0xe7,
1107 0x8c,
1111 0xff,
1112 0xff,
1113 0x94);
1115 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3));
1117 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1118 ADB_WRITEREG(3,2),
1119 0xa5,
1120 0x14,
1123 0x69,
1124 0xff,
1125 0xff,
1126 0x27);
1129 static void
1130 init_microspeed(int id)
1132 struct adb_request req;
1134 printk(" (Microspeed/MacPoint or compatible)");
1136 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1138 /* This will initialize mice using the Microspeed, MacPoint and
1139 other compatible firmware. Bit 12 enables extended protocol.
1141 Register 1 Listen (4 Bytes)
1142 0 - 3 Button is mouse (set also for double clicking!!!)
1143 4 - 7 Button is locking (affects change speed also)
1144 8 - 11 Button changes speed
1145 12 1 = Extended mouse mode, 0 = normal mouse mode
1146 13 - 15 unused 0
1147 16 - 23 normal speed
1148 24 - 31 changed speed
1150 Register 1 talk holds version and product identification information.
1151 Register 1 Talk (4 Bytes):
1152 0 - 7 Product code
1153 8 - 23 undefined, reserved
1154 24 - 31 Version number
1156 Speed 0 is max. 1 to 255 set speed in increments of 1/256 of max.
1158 adb_request(&req, NULL, ADBREQ_SYNC, 5,
1159 ADB_WRITEREG(id,1),
1160 0x20, /* alt speed = 0x20 (rather slow) */
1161 0x00, /* norm speed = 0x00 (fastest) */
1162 0x10, /* extended protocol, no speed change */
1163 0x07); /* all buttons enabled as mouse buttons, no locking */
1166 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1169 static void
1170 init_ms_a3(int id)
1172 struct adb_request req;
1174 printk(" (Mouse Systems A3 Mouse, or compatible)");
1175 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1176 ADB_WRITEREG(id, 0x2),
1177 0x00,
1178 0x07);
1180 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1183 static int __init adbhid_init(void)
1185 #ifndef CONFIG_MAC
1186 if (!machine_is(chrp) && !machine_is(powermac))
1187 return 0;
1188 #endif
1190 led_request.complete = 1;
1192 adbhid_probe();
1194 blocking_notifier_chain_register(&adb_client_list,
1195 &adbhid_adb_notifier);
1197 return 0;
1200 static void __exit adbhid_exit(void)
1204 module_init(adbhid_init);
1205 module_exit(adbhid_exit);