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=0;
578 static int pending_led_end=0;
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 = dev->private;
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) {
695 sprintf(hid->phys, "adb%d:%d.%02x/input", id, default_id, original_handler_id);
697 hid->input = input_dev;
698 hid->id = default_id;
699 hid->original_handler_id = original_handler_id;
700 hid->current_handler_id = current_handler_id;
701 hid->mouse_kind = mouse_kind;
703 input_dev->private = hid;
704 input_dev->name = hid->name;
705 input_dev->phys = hid->phys;
706 input_dev->id.bustype = BUS_ADB;
707 input_dev->id.vendor = 0x0001;
708 input_dev->id.product = (id << 12) | (default_id << 8) | original_handler_id;
709 input_dev->id.version = 0x0100;
711 switch (default_id) {
713 hid->keycode = kmalloc(sizeof(adb_to_linux_keycodes), GFP_KERNEL);
719 sprintf(hid->name, "ADB keyboard");
721 memcpy(hid->keycode, adb_to_linux_keycodes, sizeof(adb_to_linux_keycodes));
723 printk(KERN_INFO "Detected ADB keyboard, type ");
724 switch (original_handler_id) {
726 printk("<unknown>.\n");
727 input_dev->id.version = ADB_KEYBOARD_UNKNOWN;
730 case 0x01: case 0x02: case 0x03: case 0x06: case 0x08:
731 case 0x0C: case 0x10: case 0x18: case 0x1B: case 0x1C:
732 case 0xC0: case 0xC3: case 0xC6:
734 input_dev->id.version = ADB_KEYBOARD_ANSI;
737 case 0x04: case 0x05: case 0x07: case 0x09: case 0x0D:
738 case 0x11: case 0x14: case 0x19: case 0x1D: case 0xC1:
739 case 0xC4: case 0xC7:
740 printk("ISO, swapping keys.\n");
741 input_dev->id.version = ADB_KEYBOARD_ISO;
742 i = hid->keycode[10];
743 hid->keycode[10] = hid->keycode[50];
744 hid->keycode[50] = i;
747 case 0x12: case 0x15: case 0x16: case 0x17: case 0x1A:
748 case 0x1E: case 0xC2: case 0xC5: case 0xC8: case 0xC9:
750 input_dev->id.version = ADB_KEYBOARD_JIS;
754 for (i = 0; i < 128; i++)
756 set_bit(hid->keycode[i], input_dev->keybit);
758 input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
759 input_dev->ledbit[0] = BIT(LED_SCROLLL) | BIT(LED_CAPSL) | BIT(LED_NUML);
760 input_dev->event = adbhid_kbd_event;
761 input_dev->keycodemax = 127;
762 input_dev->keycodesize = 1;
766 sprintf(hid->name, "ADB mouse");
768 input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
769 input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);
770 input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);
774 switch (original_handler_id) {
775 case 0x02: /* Adjustable keyboard button device */
776 sprintf(hid->name, "ADB adjustable keyboard buttons");
777 input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
778 set_bit(KEY_SOUND, input_dev->keybit);
779 set_bit(KEY_MUTE, input_dev->keybit);
780 set_bit(KEY_VOLUMEUP, input_dev->keybit);
781 set_bit(KEY_VOLUMEDOWN, input_dev->keybit);
783 case 0x1f: /* Powerbook button device */
784 sprintf(hid->name, "ADB Powerbook buttons");
785 input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
786 set_bit(KEY_MUTE, input_dev->keybit);
787 set_bit(KEY_VOLUMEUP, input_dev->keybit);
788 set_bit(KEY_VOLUMEDOWN, input_dev->keybit);
789 set_bit(KEY_BRIGHTNESSUP, input_dev->keybit);
790 set_bit(KEY_BRIGHTNESSDOWN, input_dev->keybit);
791 set_bit(KEY_EJECTCD, input_dev->keybit);
792 set_bit(KEY_SWITCHVIDEOMODE, input_dev->keybit);
793 set_bit(KEY_KBDILLUMTOGGLE, input_dev->keybit);
794 set_bit(KEY_KBDILLUMDOWN, input_dev->keybit);
795 set_bit(KEY_KBDILLUMUP, input_dev->keybit);
800 /* else fall through */
803 printk(KERN_INFO "Trying to register unknown ADB device to input layer.\n");
808 input_dev->keycode = hid->keycode;
810 input_register_device(input_dev);
812 if (default_id == ADB_KEYBOARD) {
813 /* HACK WARNING!! This should go away as soon there is an utility
814 * to control that for event devices.
816 input_dev->rep[REP_DELAY] = 500; /* input layer default: 250 */
817 input_dev->rep[REP_PERIOD] = 66; /* input layer default: 33 */
822 fail: input_free_device(input_dev);
828 static void adbhid_input_unregister(int id)
830 input_unregister_device(adbhid[id]->input);
831 kfree(adbhid[id]->keycode);
838 adbhid_input_reregister(int id, int default_id, int org_handler_id,
839 int cur_handler_id, int mk)
842 if (adbhid[id]->input->id.product !=
843 ((id << 12)|(default_id << 8)|org_handler_id)) {
844 adbhid_input_unregister(id);
845 adbhid_input_register(id, default_id, org_handler_id,
849 adbhid_input_register(id, default_id, org_handler_id,
855 adbhid_input_devcleanup(u16 exist)
859 if (adbhid[i] && !(exist&(1<<i)))
860 adbhid_input_unregister(i);
866 struct adb_request req;
867 int i, default_id, org_handler_id, cur_handler_id;
870 adb_register(ADB_MOUSE, 0, &mouse_ids, adbhid_mouse_input);
871 adb_register(ADB_KEYBOARD, 0, &keyboard_ids, adbhid_keyboard_input);
872 adb_register(ADB_MISC, 0, &buttons_ids, adbhid_buttons_input);
874 for (i = 0; i < keyboard_ids.nids; i++) {
875 int id = keyboard_ids.id[i];
877 adb_get_infos(id, &default_id, &org_handler_id);
879 /* turn off all leds */
880 adb_request(&req, NULL, ADBREQ_SYNC, 3,
881 ADB_WRITEREG(id, KEYB_LEDREG), 0xff, 0xff);
883 /* Enable full feature set of the keyboard
884 ->get it to send separate codes for left and right shift,
885 control, option keys */
886 #if 0 /* handler 5 doesn't send separate codes for R modifiers */
887 if (adb_try_handler_change(id, 5))
888 printk("ADB keyboard at %d, handler set to 5\n", id);
891 if (adb_try_handler_change(id, 3))
892 printk("ADB keyboard at %d, handler set to 3\n", id);
894 printk("ADB keyboard at %d, handler 1\n", id);
896 adb_get_infos(id, &default_id, &cur_handler_id);
897 reg |= adbhid_input_reregister(id, default_id, org_handler_id,
901 for (i = 0; i < buttons_ids.nids; i++) {
902 int id = buttons_ids.id[i];
904 adb_get_infos(id, &default_id, &org_handler_id);
905 reg |= adbhid_input_reregister(id, default_id, org_handler_id,
909 /* Try to switch all mice to handler 4, or 2 for three-button
910 mode and full resolution. */
911 for (i = 0; i < mouse_ids.nids; i++) {
912 int id = mouse_ids.id[i];
915 adb_get_infos(id, &default_id, &org_handler_id);
917 if (adb_try_handler_change(id, 4)) {
918 printk("ADB mouse at %d, handler set to 4", id);
919 mouse_kind = ADBMOUSE_EXTENDED;
921 else if (adb_try_handler_change(id, 0x2F)) {
922 printk("ADB mouse at %d, handler set to 0x2F", id);
923 mouse_kind = ADBMOUSE_MICROSPEED;
925 else if (adb_try_handler_change(id, 0x42)) {
926 printk("ADB mouse at %d, handler set to 0x42", id);
927 mouse_kind = ADBMOUSE_TRACKBALLPRO;
929 else if (adb_try_handler_change(id, 0x66)) {
930 printk("ADB mouse at %d, handler set to 0x66", id);
931 mouse_kind = ADBMOUSE_MICROSPEED;
933 else if (adb_try_handler_change(id, 0x5F)) {
934 printk("ADB mouse at %d, handler set to 0x5F", id);
935 mouse_kind = ADBMOUSE_MICROSPEED;
937 else if (adb_try_handler_change(id, 3)) {
938 printk("ADB mouse at %d, handler set to 3", id);
939 mouse_kind = ADBMOUSE_MS_A3;
941 else if (adb_try_handler_change(id, 2)) {
942 printk("ADB mouse at %d, handler set to 2", id);
943 mouse_kind = ADBMOUSE_STANDARD_200;
946 printk("ADB mouse at %d, handler 1", id);
947 mouse_kind = ADBMOUSE_STANDARD_100;
950 if ((mouse_kind == ADBMOUSE_TRACKBALLPRO)
951 || (mouse_kind == ADBMOUSE_MICROSPEED)) {
953 } else if (mouse_kind == ADBMOUSE_MS_A3) {
955 } else if (mouse_kind == ADBMOUSE_EXTENDED) {
957 * Register 1 is usually used for device
958 * identification. Here, we try to identify
959 * a known device and call the appropriate
962 adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
965 if ((req.reply_len) &&
966 (req.reply[1] == 0x9a) && ((req.reply[2] == 0x21)
967 || (req.reply[2] == 0x20))) {
968 mouse_kind = ADBMOUSE_TRACKBALL;
971 else if ((req.reply_len >= 4) &&
972 (req.reply[1] == 0x74) && (req.reply[2] == 0x70) &&
973 (req.reply[3] == 0x61) && (req.reply[4] == 0x64)) {
974 mouse_kind = ADBMOUSE_TRACKPAD;
977 else if ((req.reply_len >= 4) &&
978 (req.reply[1] == 0x4b) && (req.reply[2] == 0x4d) &&
979 (req.reply[3] == 0x4c) && (req.reply[4] == 0x31)) {
980 mouse_kind = ADBMOUSE_TURBOMOUSE5;
983 else if ((req.reply_len == 9) &&
984 (req.reply[1] == 0x4b) && (req.reply[2] == 0x4f) &&
985 (req.reply[3] == 0x49) && (req.reply[4] == 0x54)) {
986 if (adb_try_handler_change(id, 0x42)) {
987 printk("\nADB MacAlly 2-button mouse at %d, handler set to 0x42", id);
988 mouse_kind = ADBMOUSE_MACALLY2;
994 adb_get_infos(id, &default_id, &cur_handler_id);
995 reg |= adbhid_input_reregister(id, default_id, org_handler_id,
996 cur_handler_id, mouse_kind);
998 adbhid_input_devcleanup(reg);
1002 init_trackpad(int id)
1004 struct adb_request req;
1005 unsigned char r1_buffer[8];
1007 printk(" (trackpad)");
1009 adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
1011 if (req.reply_len < 8)
1012 printk("bad length for reg. 1\n");
1015 memcpy(r1_buffer, &req.reply[1], 8);
1017 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1028 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1039 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1047 0x03, /*r1_buffer[6],*/
1050 /* Without this flush, the trackpad may be locked up */
1051 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1056 init_trackball(int id)
1058 struct adb_request req;
1060 printk(" (trackman/mouseman)");
1062 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1063 ADB_WRITEREG(id,1), 00,0x81);
1065 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1066 ADB_WRITEREG(id,1), 01,0x81);
1068 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1069 ADB_WRITEREG(id,1), 02,0x81);
1071 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1072 ADB_WRITEREG(id,1), 03,0x38);
1074 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1075 ADB_WRITEREG(id,1), 00,0x81);
1077 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1078 ADB_WRITEREG(id,1), 01,0x81);
1080 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1081 ADB_WRITEREG(id,1), 02,0x81);
1083 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1084 ADB_WRITEREG(id,1), 03,0x38);
1088 init_turbomouse(int id)
1090 struct adb_request req;
1092 printk(" (TurboMouse 5)");
1094 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1096 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3));
1098 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1109 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3));
1111 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1124 init_microspeed(int id)
1126 struct adb_request req;
1128 printk(" (Microspeed/MacPoint or compatible)");
1130 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1132 /* This will initialize mice using the Microspeed, MacPoint and
1133 other compatible firmware. Bit 12 enables extended protocol.
1135 Register 1 Listen (4 Bytes)
1136 0 - 3 Button is mouse (set also for double clicking!!!)
1137 4 - 7 Button is locking (affects change speed also)
1138 8 - 11 Button changes speed
1139 12 1 = Extended mouse mode, 0 = normal mouse mode
1141 16 - 23 normal speed
1142 24 - 31 changed speed
1144 Register 1 talk holds version and product identification information.
1145 Register 1 Talk (4 Bytes):
1147 8 - 23 undefined, reserved
1148 24 - 31 Version number
1150 Speed 0 is max. 1 to 255 set speed in increments of 1/256 of max.
1152 adb_request(&req, NULL, ADBREQ_SYNC, 5,
1154 0x20, /* alt speed = 0x20 (rather slow) */
1155 0x00, /* norm speed = 0x00 (fastest) */
1156 0x10, /* extended protocol, no speed change */
1157 0x07); /* all buttons enabled as mouse buttons, no locking */
1160 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1166 struct adb_request req;
1168 printk(" (Mouse Systems A3 Mouse, or compatible)");
1169 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1170 ADB_WRITEREG(id, 0x2),
1174 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1177 static int __init adbhid_init(void)
1180 if (!machine_is(chrp) && !machine_is(powermac))
1184 led_request.complete = 1;
1188 blocking_notifier_chain_register(&adb_client_list,
1189 &adbhid_adb_notifier);
1194 static void __exit adbhid_exit(void)
1198 module_init(adbhid_init);
1199 module_exit(adbhid_exit);