2 * drivers/macintosh/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
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>
32 * Improve Kensington support.
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 #ifdef CONFIG_PPC_PMAC
49 #include <asm/backlight.h>
50 #include <asm/pmac_feature.h>
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 */
139 /* 0x41 */ KEY_KPDOT, /* 83 */
141 /* 0x43 */ KEY_KPASTERISK, /* 55 */
143 /* 0x45 */ KEY_KPPLUS, /* 78 */
145 /* 0x47 */ KEY_NUMLOCK, /* 69 */
149 /* 0x4b */ KEY_KPSLASH, /* 98 */
150 /* 0x4c */ KEY_KPENTER, /* 96 */
152 /* 0x4e */ KEY_KPMINUS, /* 74 */
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 */
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 */
181 /* 0x6b */ KEY_SCROLLLOCK, /* 70 */
183 /* 0x6d */ KEY_F10, /* 68 */
184 /* 0x6e */ KEY_COMPOSE, /* 127 */
185 /* 0x6f */ KEY_F12, /* 88 */
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 */
205 struct input_dev *input;
208 int original_handler_id;
209 int current_handler_id;
211 unsigned char *keycode;
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);
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
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 */
256 adbhid_keyboard_input(unsigned char *data, int nb, int apoll)
258 int id = (data[0] >> 4) & 0x0f;
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]);
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);
270 if (!(data[2] == 0xff || (data[2] == 0x7f && data[1] == 0x7f)))
271 adbhid_input_keycode(id, data[2], 0);
275 adbhid_input_keycode(int id, int keycode, int repeat)
277 struct adbhid *ahid = adbhid[id];
280 up_flag = (keycode & 0x80);
284 case ADB_KEY_CAPSLOCK: /* Generate down/up events for CapsLock everytime. */
285 input_report_key(ahid->input, KEY_CAPSLOCK, 1);
286 input_report_key(ahid->input, KEY_CAPSLOCK, 0);
287 input_sync(ahid->input);
289 #ifdef CONFIG_PPC_PMAC
290 case ADB_KEY_POWER_OLD: /* Power key on PBook 3400 needs remapping */
291 switch(pmac_call_feature(PMAC_FTR_GET_MB_INFO,
292 NULL, PMAC_MB_INFO_MODEL, 0)) {
293 case PMAC_TYPE_COMET:
294 case PMAC_TYPE_HOOPER:
295 case PMAC_TYPE_KANGA:
296 keycode = ADB_KEY_POWER;
300 /* Fn + Command will produce a bogus "power" keycode */
301 if (ahid->flags & FLAG_FN_KEY_PRESSED) {
302 keycode = ADB_KEY_CMD;
304 ahid->flags &= ~FLAG_POWER_FROM_FN;
306 ahid->flags |= FLAG_POWER_FROM_FN;
307 } else if (ahid->flags & FLAG_POWER_FROM_FN) {
308 keycode = ADB_KEY_CMD;
309 ahid->flags &= ~FLAG_POWER_FROM_FN;
313 /* Keep track of the Fn key state */
315 ahid->flags &= ~FLAG_FN_KEY_PRESSED;
316 /* Emulate Fn+delete = forward delete */
317 if (ahid->flags & FLAG_EMU_FWDEL_DOWN) {
318 ahid->flags &= ~FLAG_EMU_FWDEL_DOWN;
319 keycode = ADB_KEY_FWDEL;
323 ahid->flags |= FLAG_FN_KEY_PRESSED;
324 /* Swallow the key press */
327 /* Emulate Fn+delete = forward delete */
328 if (ahid->flags & FLAG_FN_KEY_PRESSED) {
329 keycode = ADB_KEY_FWDEL;
331 ahid->flags &= ~FLAG_EMU_FWDEL_DOWN;
333 ahid->flags |= FLAG_EMU_FWDEL_DOWN;
336 #endif /* CONFIG_PPC_PMAC */
339 if (adbhid[id]->keycode[keycode]) {
340 input_report_key(adbhid[id]->input,
341 adbhid[id]->keycode[keycode], !up_flag);
342 input_sync(adbhid[id]->input);
344 printk(KERN_INFO "Unhandled ADB key (scancode %#02x) %s.\n", keycode,
345 up_flag ? "released" : "pressed");
350 adbhid_mouse_input(unsigned char *data, int nb, int autopoll)
352 int id = (data[0] >> 4) & 0x0f;
355 printk(KERN_ERR "ADB HID on ID %d not yet registered\n", id);
360 Handler 1 -- 100cpi original Apple mouse protocol.
361 Handler 2 -- 200cpi original Apple mouse protocol.
363 For Apple's standard one-button mouse protocol the data array will
364 contain the following values:
367 data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd.
368 data[1] = bxxx xxxx First button and x-axis motion.
369 data[2] = byyy yyyy Second button and y-axis motion.
371 Handler 4 -- Apple Extended mouse protocol.
373 For Apple's 3-button mouse protocol the data array will contain the
377 data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd.
378 data[1] = bxxx xxxx Left button and x-axis motion.
379 data[2] = byyy yyyy Second button and y-axis motion.
380 data[3] = byyy bxxx Third button and fourth button. Y is additional
381 high bits of y-axis motion. XY is additional
382 high bits of x-axis motion.
384 MacAlly 2-button mouse protocol.
386 For MacAlly 2-button mouse protocol the data array will contain the
390 data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd.
391 data[1] = bxxx xxxx Left button and x-axis motion.
392 data[2] = byyy yyyy Right button and y-axis motion.
393 data[3] = ???? ???? unknown
394 data[4] = ???? ???? unknown
398 /* If it's a trackpad, we alias the second button to the first.
399 NOTE: Apple sends an ADB flush command to the trackpad when
400 the first (the real) button is released. We could do
401 this here using async flush requests.
403 switch (adbhid[id]->mouse_kind)
405 case ADBMOUSE_TRACKPAD:
406 data[1] = (data[1] & 0x7f) | ((data[1] & data[2]) & 0x80);
407 data[2] = data[2] | 0x80;
409 case ADBMOUSE_MICROSPEED:
410 data[1] = (data[1] & 0x7f) | ((data[3] & 0x01) << 7);
411 data[2] = (data[2] & 0x7f) | ((data[3] & 0x02) << 6);
412 data[3] = (data[3] & 0x77) | ((data[3] & 0x04) << 5)
415 case ADBMOUSE_TRACKBALLPRO:
416 data[1] = (data[1] & 0x7f) | (((data[3] & 0x04) << 5)
417 & ((data[3] & 0x08) << 4));
418 data[2] = (data[2] & 0x7f) | ((data[3] & 0x01) << 7);
419 data[3] = (data[3] & 0x77) | ((data[3] & 0x02) << 6);
422 data[1] = (data[1] & 0x7f) | ((data[3] & 0x01) << 7);
423 data[2] = (data[2] & 0x7f) | ((data[3] & 0x02) << 6);
424 data[3] = ((data[3] & 0x04) << 5);
426 case ADBMOUSE_MACALLY2:
427 data[3] = (data[2] & 0x80) ? 0x80 : 0x00;
428 data[2] |= 0x80; /* Right button is mapped as button 3 */
433 input_report_key(adbhid[id]->input, BTN_LEFT, !((data[1] >> 7) & 1));
434 input_report_key(adbhid[id]->input, BTN_MIDDLE, !((data[2] >> 7) & 1));
436 if (nb >= 4 && adbhid[id]->mouse_kind != ADBMOUSE_TRACKPAD)
437 input_report_key(adbhid[id]->input, BTN_RIGHT, !((data[3] >> 7) & 1));
439 input_report_rel(adbhid[id]->input, REL_X,
440 ((data[2]&0x7f) < 64 ? (data[2]&0x7f) : (data[2]&0x7f)-128 ));
441 input_report_rel(adbhid[id]->input, REL_Y,
442 ((data[1]&0x7f) < 64 ? (data[1]&0x7f) : (data[1]&0x7f)-128 ));
444 input_sync(adbhid[id]->input);
448 adbhid_buttons_input(unsigned char *data, int nb, int autopoll)
450 int id = (data[0] >> 4) & 0x0f;
453 printk(KERN_ERR "ADB HID on ID %d not yet registered\n", id);
457 switch (adbhid[id]->original_handler_id) {
459 case 0x02: /* Adjustable keyboard button device */
461 int down = (data[1] == (data[1] & 0xf));
463 switch (data[1] & 0x0f) {
464 case 0x0: /* microphone */
465 input_report_key(adbhid[id]->input, KEY_SOUND, down);
469 input_report_key(adbhid[id]->input, KEY_MUTE, down);
472 case 0x2: /* volume decrease */
473 input_report_key(adbhid[id]->input, KEY_VOLUMEDOWN, down);
476 case 0x3: /* volume increase */
477 input_report_key(adbhid[id]->input, KEY_VOLUMEUP, down);
481 printk(KERN_INFO "Unhandled ADB_MISC event %02x, %02x, %02x, %02x\n",
482 data[0], data[1], data[2], data[3]);
488 case 0x1f: /* Powerbook button device */
490 int down = (data[1] == (data[1] & 0xf));
493 * XXX: Where is the contrast control for the passive?
497 switch (data[1] & 0x0f) {
499 input_report_key(adbhid[id]->input, KEY_MUTE, down);
502 case 0x7: /* volume decrease */
503 input_report_key(adbhid[id]->input, KEY_VOLUMEDOWN, down);
506 case 0x6: /* volume increase */
507 input_report_key(adbhid[id]->input, KEY_VOLUMEUP, down);
510 case 0xb: /* eject */
511 input_report_key(adbhid[id]->input, KEY_EJECTCD, down);
514 case 0xa: /* brightness decrease */
515 #ifdef CONFIG_PMAC_BACKLIGHT
517 pmac_backlight_key_down();
519 input_report_key(adbhid[id]->input, KEY_BRIGHTNESSDOWN, down);
522 case 0x9: /* brightness increase */
523 #ifdef CONFIG_PMAC_BACKLIGHT
525 pmac_backlight_key_up();
527 input_report_key(adbhid[id]->input, KEY_BRIGHTNESSUP, down);
530 case 0xc: /* videomode switch */
531 input_report_key(adbhid[id]->input, KEY_SWITCHVIDEOMODE, down);
534 case 0xd: /* keyboard illumination toggle */
535 input_report_key(adbhid[id]->input, KEY_KBDILLUMTOGGLE, down);
538 case 0xe: /* keyboard illumination decrease */
539 input_report_key(adbhid[id]->input, KEY_KBDILLUMDOWN, down);
546 /* keyboard illumination increase */
547 input_report_key(adbhid[id]->input, KEY_KBDILLUMUP, down);
552 /* keypad overlay toogle */
556 printk(KERN_INFO "Unhandled ADB_MISC event %02x, %02x, %02x, %02x\n",
557 data[0], data[1], data[2], data[3]);
562 printk(KERN_INFO "Unhandled ADB_MISC event %02x, %02x, %02x, %02x\n",
563 data[0], data[1], data[2], data[3]);
570 input_sync(adbhid[id]->input);
573 static struct adb_request led_request;
574 static int leds_pending[16];
575 static int leds_req_pending;
576 static int pending_devs[16];
577 static int pending_led_start;
578 static int pending_led_end;
579 static DEFINE_SPINLOCK(leds_lock);
581 static void leds_done(struct adb_request *req)
583 int leds = 0, device = 0, pending = 0;
586 spin_lock_irqsave(&leds_lock, flags);
588 if (pending_led_start != pending_led_end) {
589 device = pending_devs[pending_led_start];
590 leds = leds_pending[device] & 0xff;
591 leds_pending[device] = 0;
593 pending_led_start = (pending_led_start < 16) ? pending_led_start : 0;
594 pending = leds_req_pending;
596 leds_req_pending = 0;
597 spin_unlock_irqrestore(&leds_lock, flags);
599 adb_request(&led_request, leds_done, 0, 3,
600 ADB_WRITEREG(device, KEYB_LEDREG), 0xff, ~leds);
603 static void real_leds(unsigned char leds, int device)
607 spin_lock_irqsave(&leds_lock, flags);
608 if (!leds_req_pending) {
609 leds_req_pending = 1;
610 spin_unlock_irqrestore(&leds_lock, flags);
611 adb_request(&led_request, leds_done, 0, 3,
612 ADB_WRITEREG(device, KEYB_LEDREG), 0xff, ~leds);
615 if (!(leds_pending[device] & 0x100)) {
616 pending_devs[pending_led_end] = device;
618 pending_led_end = (pending_led_end < 16) ? pending_led_end : 0;
620 leds_pending[device] = leds | 0x100;
622 spin_unlock_irqrestore(&leds_lock, flags);
626 * Event callback from the input module. Events that change the state of
627 * the hardware are processed here.
629 static int adbhid_kbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
631 struct adbhid *adbhid = input_get_drvdata(dev);
636 leds = (test_bit(LED_SCROLLL, dev->led) ? 4 : 0) |
637 (test_bit(LED_NUML, dev->led) ? 1 : 0) |
638 (test_bit(LED_CAPSL, dev->led) ? 2 : 0);
639 real_leds(leds, adbhid->id);
647 adb_message_handler(struct notifier_block *this, unsigned long code, void *x)
650 case ADB_MSG_PRE_RESET:
651 case ADB_MSG_POWERDOWN:
652 /* Stop the repeat timer. Autopoll is already off at this point */
655 for (i = 1; i < 16; i++) {
657 del_timer_sync(&adbhid[i]->input->timer);
661 /* Stop pending led requests */
662 while(leds_req_pending)
666 case ADB_MSG_POST_RESET:
674 adbhid_input_register(int id, int default_id, int original_handler_id,
675 int current_handler_id, int mouse_kind)
678 struct input_dev *input_dev;
683 printk(KERN_ERR "Trying to reregister ADB HID on ID %d\n", id);
687 adbhid[id] = hid = kzalloc(sizeof(struct adbhid), GFP_KERNEL);
688 input_dev = input_allocate_device();
689 if (!hid || !input_dev) {
694 sprintf(hid->phys, "adb%d:%d.%02x/input", id, default_id, original_handler_id);
696 hid->input = input_dev;
697 hid->id = default_id;
698 hid->original_handler_id = original_handler_id;
699 hid->current_handler_id = current_handler_id;
700 hid->mouse_kind = mouse_kind;
702 input_set_drvdata(input_dev, hid);
703 input_dev->name = hid->name;
704 input_dev->phys = hid->phys;
705 input_dev->id.bustype = BUS_ADB;
706 input_dev->id.vendor = 0x0001;
707 input_dev->id.product = (id << 12) | (default_id << 8) | original_handler_id;
708 input_dev->id.version = 0x0100;
710 switch (default_id) {
712 hid->keycode = kmalloc(sizeof(adb_to_linux_keycodes), GFP_KERNEL);
718 sprintf(hid->name, "ADB keyboard");
720 memcpy(hid->keycode, adb_to_linux_keycodes, sizeof(adb_to_linux_keycodes));
722 printk(KERN_INFO "Detected ADB keyboard, type ");
723 switch (original_handler_id) {
725 printk("<unknown>.\n");
726 input_dev->id.version = ADB_KEYBOARD_UNKNOWN;
729 case 0x01: case 0x02: case 0x03: case 0x06: case 0x08:
730 case 0x0C: case 0x10: case 0x18: case 0x1B: case 0x1C:
731 case 0xC0: case 0xC3: case 0xC6:
733 input_dev->id.version = ADB_KEYBOARD_ANSI;
736 case 0x04: case 0x05: case 0x07: case 0x09: case 0x0D:
737 case 0x11: case 0x14: case 0x19: case 0x1D: case 0xC1:
738 case 0xC4: case 0xC7:
739 printk("ISO, swapping keys.\n");
740 input_dev->id.version = ADB_KEYBOARD_ISO;
741 i = hid->keycode[10];
742 hid->keycode[10] = hid->keycode[50];
743 hid->keycode[50] = i;
746 case 0x12: case 0x15: case 0x16: case 0x17: case 0x1A:
747 case 0x1E: case 0xC2: case 0xC5: case 0xC8: case 0xC9:
749 input_dev->id.version = ADB_KEYBOARD_JIS;
753 for (i = 0; i < 128; i++)
755 set_bit(hid->keycode[i], input_dev->keybit);
757 input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
758 input_dev->ledbit[0] = BIT(LED_SCROLLL) | BIT(LED_CAPSL) | BIT(LED_NUML);
759 input_dev->event = adbhid_kbd_event;
760 input_dev->keycodemax = 127;
761 input_dev->keycodesize = 1;
765 sprintf(hid->name, "ADB mouse");
767 input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
768 input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);
769 input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);
773 switch (original_handler_id) {
774 case 0x02: /* Adjustable keyboard button device */
775 sprintf(hid->name, "ADB adjustable keyboard buttons");
776 input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
777 set_bit(KEY_SOUND, input_dev->keybit);
778 set_bit(KEY_MUTE, input_dev->keybit);
779 set_bit(KEY_VOLUMEUP, input_dev->keybit);
780 set_bit(KEY_VOLUMEDOWN, input_dev->keybit);
782 case 0x1f: /* Powerbook button device */
783 sprintf(hid->name, "ADB Powerbook buttons");
784 input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
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 set_bit(KEY_BRIGHTNESSUP, input_dev->keybit);
789 set_bit(KEY_BRIGHTNESSDOWN, input_dev->keybit);
790 set_bit(KEY_EJECTCD, input_dev->keybit);
791 set_bit(KEY_SWITCHVIDEOMODE, input_dev->keybit);
792 set_bit(KEY_KBDILLUMTOGGLE, input_dev->keybit);
793 set_bit(KEY_KBDILLUMDOWN, input_dev->keybit);
794 set_bit(KEY_KBDILLUMUP, input_dev->keybit);
799 /* else fall through */
802 printk(KERN_INFO "Trying to register unknown ADB device to input layer.\n");
807 input_dev->keycode = hid->keycode;
809 err = input_register_device(input_dev);
813 if (default_id == ADB_KEYBOARD) {
814 /* HACK WARNING!! This should go away as soon there is an utility
815 * to control that for event devices.
817 input_dev->rep[REP_DELAY] = 500; /* input layer default: 250 */
818 input_dev->rep[REP_PERIOD] = 66; /* input layer default: 33 */
823 fail: input_free_device(input_dev);
832 static void adbhid_input_unregister(int id)
834 input_unregister_device(adbhid[id]->input);
835 kfree(adbhid[id]->keycode);
842 adbhid_input_reregister(int id, int default_id, int org_handler_id,
843 int cur_handler_id, int mk)
846 if (adbhid[id]->input->id.product !=
847 ((id << 12)|(default_id << 8)|org_handler_id)) {
848 adbhid_input_unregister(id);
849 adbhid_input_register(id, default_id, org_handler_id,
853 adbhid_input_register(id, default_id, org_handler_id,
859 adbhid_input_devcleanup(u16 exist)
863 if (adbhid[i] && !(exist&(1<<i)))
864 adbhid_input_unregister(i);
870 struct adb_request req;
871 int i, default_id, org_handler_id, cur_handler_id;
874 adb_register(ADB_MOUSE, 0, &mouse_ids, adbhid_mouse_input);
875 adb_register(ADB_KEYBOARD, 0, &keyboard_ids, adbhid_keyboard_input);
876 adb_register(ADB_MISC, 0, &buttons_ids, adbhid_buttons_input);
878 for (i = 0; i < keyboard_ids.nids; i++) {
879 int id = keyboard_ids.id[i];
881 adb_get_infos(id, &default_id, &org_handler_id);
883 /* turn off all leds */
884 adb_request(&req, NULL, ADBREQ_SYNC, 3,
885 ADB_WRITEREG(id, KEYB_LEDREG), 0xff, 0xff);
887 /* Enable full feature set of the keyboard
888 ->get it to send separate codes for left and right shift,
889 control, option keys */
890 #if 0 /* handler 5 doesn't send separate codes for R modifiers */
891 if (adb_try_handler_change(id, 5))
892 printk("ADB keyboard at %d, handler set to 5\n", id);
895 if (adb_try_handler_change(id, 3))
896 printk("ADB keyboard at %d, handler set to 3\n", id);
898 printk("ADB keyboard at %d, handler 1\n", id);
900 adb_get_infos(id, &default_id, &cur_handler_id);
901 reg |= adbhid_input_reregister(id, default_id, org_handler_id,
905 for (i = 0; i < buttons_ids.nids; i++) {
906 int id = buttons_ids.id[i];
908 adb_get_infos(id, &default_id, &org_handler_id);
909 reg |= adbhid_input_reregister(id, default_id, org_handler_id,
913 /* Try to switch all mice to handler 4, or 2 for three-button
914 mode and full resolution. */
915 for (i = 0; i < mouse_ids.nids; i++) {
916 int id = mouse_ids.id[i];
919 adb_get_infos(id, &default_id, &org_handler_id);
921 if (adb_try_handler_change(id, 4)) {
922 printk("ADB mouse at %d, handler set to 4", id);
923 mouse_kind = ADBMOUSE_EXTENDED;
925 else if (adb_try_handler_change(id, 0x2F)) {
926 printk("ADB mouse at %d, handler set to 0x2F", id);
927 mouse_kind = ADBMOUSE_MICROSPEED;
929 else if (adb_try_handler_change(id, 0x42)) {
930 printk("ADB mouse at %d, handler set to 0x42", id);
931 mouse_kind = ADBMOUSE_TRACKBALLPRO;
933 else if (adb_try_handler_change(id, 0x66)) {
934 printk("ADB mouse at %d, handler set to 0x66", id);
935 mouse_kind = ADBMOUSE_MICROSPEED;
937 else if (adb_try_handler_change(id, 0x5F)) {
938 printk("ADB mouse at %d, handler set to 0x5F", id);
939 mouse_kind = ADBMOUSE_MICROSPEED;
941 else if (adb_try_handler_change(id, 3)) {
942 printk("ADB mouse at %d, handler set to 3", id);
943 mouse_kind = ADBMOUSE_MS_A3;
945 else if (adb_try_handler_change(id, 2)) {
946 printk("ADB mouse at %d, handler set to 2", id);
947 mouse_kind = ADBMOUSE_STANDARD_200;
950 printk("ADB mouse at %d, handler 1", id);
951 mouse_kind = ADBMOUSE_STANDARD_100;
954 if ((mouse_kind == ADBMOUSE_TRACKBALLPRO)
955 || (mouse_kind == ADBMOUSE_MICROSPEED)) {
957 } else if (mouse_kind == ADBMOUSE_MS_A3) {
959 } else if (mouse_kind == ADBMOUSE_EXTENDED) {
961 * Register 1 is usually used for device
962 * identification. Here, we try to identify
963 * a known device and call the appropriate
966 adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
969 if ((req.reply_len) &&
970 (req.reply[1] == 0x9a) && ((req.reply[2] == 0x21)
971 || (req.reply[2] == 0x20))) {
972 mouse_kind = ADBMOUSE_TRACKBALL;
975 else if ((req.reply_len >= 4) &&
976 (req.reply[1] == 0x74) && (req.reply[2] == 0x70) &&
977 (req.reply[3] == 0x61) && (req.reply[4] == 0x64)) {
978 mouse_kind = ADBMOUSE_TRACKPAD;
981 else if ((req.reply_len >= 4) &&
982 (req.reply[1] == 0x4b) && (req.reply[2] == 0x4d) &&
983 (req.reply[3] == 0x4c) && (req.reply[4] == 0x31)) {
984 mouse_kind = ADBMOUSE_TURBOMOUSE5;
987 else if ((req.reply_len == 9) &&
988 (req.reply[1] == 0x4b) && (req.reply[2] == 0x4f) &&
989 (req.reply[3] == 0x49) && (req.reply[4] == 0x54)) {
990 if (adb_try_handler_change(id, 0x42)) {
991 printk("\nADB MacAlly 2-button mouse at %d, handler set to 0x42", id);
992 mouse_kind = ADBMOUSE_MACALLY2;
998 adb_get_infos(id, &default_id, &cur_handler_id);
999 reg |= adbhid_input_reregister(id, default_id, org_handler_id,
1000 cur_handler_id, mouse_kind);
1002 adbhid_input_devcleanup(reg);
1006 init_trackpad(int id)
1008 struct adb_request req;
1009 unsigned char r1_buffer[8];
1011 printk(" (trackpad)");
1013 adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
1015 if (req.reply_len < 8)
1016 printk("bad length for reg. 1\n");
1019 memcpy(r1_buffer, &req.reply[1], 8);
1021 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1032 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1043 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1051 0x03, /*r1_buffer[6],*/
1054 /* Without this flush, the trackpad may be locked up */
1055 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1060 init_trackball(int id)
1062 struct adb_request req;
1064 printk(" (trackman/mouseman)");
1066 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1067 ADB_WRITEREG(id,1), 00,0x81);
1069 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1070 ADB_WRITEREG(id,1), 01,0x81);
1072 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1073 ADB_WRITEREG(id,1), 02,0x81);
1075 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1076 ADB_WRITEREG(id,1), 03,0x38);
1078 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1079 ADB_WRITEREG(id,1), 00,0x81);
1081 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1082 ADB_WRITEREG(id,1), 01,0x81);
1084 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1085 ADB_WRITEREG(id,1), 02,0x81);
1087 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1088 ADB_WRITEREG(id,1), 03,0x38);
1092 init_turbomouse(int id)
1094 struct adb_request req;
1096 printk(" (TurboMouse 5)");
1098 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1100 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3));
1102 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1113 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3));
1115 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1128 init_microspeed(int id)
1130 struct adb_request req;
1132 printk(" (Microspeed/MacPoint or compatible)");
1134 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1136 /* This will initialize mice using the Microspeed, MacPoint and
1137 other compatible firmware. Bit 12 enables extended protocol.
1139 Register 1 Listen (4 Bytes)
1140 0 - 3 Button is mouse (set also for double clicking!!!)
1141 4 - 7 Button is locking (affects change speed also)
1142 8 - 11 Button changes speed
1143 12 1 = Extended mouse mode, 0 = normal mouse mode
1145 16 - 23 normal speed
1146 24 - 31 changed speed
1148 Register 1 talk holds version and product identification information.
1149 Register 1 Talk (4 Bytes):
1151 8 - 23 undefined, reserved
1152 24 - 31 Version number
1154 Speed 0 is max. 1 to 255 set speed in increments of 1/256 of max.
1156 adb_request(&req, NULL, ADBREQ_SYNC, 5,
1158 0x20, /* alt speed = 0x20 (rather slow) */
1159 0x00, /* norm speed = 0x00 (fastest) */
1160 0x10, /* extended protocol, no speed change */
1161 0x07); /* all buttons enabled as mouse buttons, no locking */
1164 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1170 struct adb_request req;
1172 printk(" (Mouse Systems A3 Mouse, or compatible)");
1173 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1174 ADB_WRITEREG(id, 0x2),
1178 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1181 static int __init adbhid_init(void)
1184 if (!machine_is(chrp) && !machine_is(powermac))
1188 led_request.complete = 1;
1192 blocking_notifier_chain_register(&adb_client_list,
1193 &adbhid_adb_notifier);
1198 static void __exit adbhid_exit(void)
1202 module_init(adbhid_init);
1203 module_exit(adbhid_exit);