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
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 #include <asm/backlight.h>
49 #ifdef CONFIG_PPC_PMAC
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, 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
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
, struct pt_regs
*regs
, 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, regs
);
270 if (!(data
[2] == 0xff || (data
[2] == 0x7f && data
[1] == 0x7f)))
271 adbhid_input_keycode(id
, data
[2], 0, regs
);
275 adbhid_input_keycode(int id
, int keycode
, int repeat
, struct pt_regs
*regs
)
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_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
);
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
;
301 /* Fn + Command will produce a bogus "power" keycode */
302 if (ahid
->flags
& FLAG_FN_KEY_PRESSED
) {
303 keycode
= ADB_KEY_CMD
;
305 ahid
->flags
&= ~FLAG_POWER_FROM_FN
;
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
;
314 /* Keep track of the Fn key state */
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
;
324 ahid
->flags
|= FLAG_FN_KEY_PRESSED
;
325 /* Swallow the key press */
328 /* Emulate Fn+delete = forward delete */
329 if (ahid
->flags
& FLAG_FN_KEY_PRESSED
) {
330 keycode
= ADB_KEY_FWDEL
;
332 ahid
->flags
&= ~FLAG_EMU_FWDEL_DOWN
;
334 ahid
->flags
|= FLAG_EMU_FWDEL_DOWN
;
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
);
346 printk(KERN_INFO
"Unhandled ADB key (scancode %#02x) %s.\n", keycode
,
347 up_flag
? "released" : "pressed");
352 adbhid_mouse_input(unsigned char *data
, int nb
, struct pt_regs
*regs
, int autopoll
)
354 int id
= (data
[0] >> 4) & 0x0f;
357 printk(KERN_ERR
"ADB HID on ID %d not yet registered\n", id
);
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:
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
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
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;
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)
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);
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);
428 case ADBMOUSE_MACALLY2
:
429 data
[3] = (data
[2] & 0x80) ? 0x80 : 0x00;
430 data
[2] |= 0x80; /* Right button is mapped as button 3 */
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
);
452 adbhid_buttons_input(unsigned char *data
, int nb
, struct pt_regs
*regs
, int autopoll
)
454 int id
= (data
[0] >> 4) & 0x0f;
457 printk(KERN_ERR
"ADB HID on ID %d not yet registered\n", id
);
461 input_regs(adbhid
[id
]->input
, regs
);
463 switch (adbhid
[id
]->original_handler_id
) {
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
);
475 input_report_key(adbhid
[id
]->input
, KEY_MUTE
, down
);
478 case 0x2: /* volume decrease */
479 input_report_key(adbhid
[id
]->input
, KEY_VOLUMEDOWN
, down
);
482 case 0x3: /* volume increase */
483 input_report_key(adbhid
[id
]->input
, KEY_VOLUMEUP
, down
);
487 printk(KERN_INFO
"Unhandled ADB_MISC event %02x, %02x, %02x, %02x\n",
488 data
[0], data
[1], data
[2], data
[3]);
494 case 0x1f: /* Powerbook button device */
496 int down
= (data
[1] == (data
[1] & 0xf));
499 * XXX: Where is the contrast control for the passive?
503 switch (data
[1] & 0x0f) {
505 input_report_key(adbhid
[id
]->input
, KEY_MUTE
, down
);
508 case 0x7: /* volume decrease */
509 input_report_key(adbhid
[id
]->input
, KEY_VOLUMEDOWN
, down
);
512 case 0x6: /* volume increase */
513 input_report_key(adbhid
[id
]->input
, KEY_VOLUMEUP
, down
);
516 case 0xb: /* eject */
517 input_report_key(adbhid
[id
]->input
, KEY_EJECTCD
, down
);
520 case 0xa: /* brightness decrease */
521 #ifdef CONFIG_PMAC_BACKLIGHT
523 pmac_backlight_key_down();
525 input_report_key(adbhid
[id
]->input
, KEY_BRIGHTNESSDOWN
, down
);
528 case 0x9: /* brightness increase */
529 #ifdef CONFIG_PMAC_BACKLIGHT
531 pmac_backlight_key_up();
533 input_report_key(adbhid
[id
]->input
, KEY_BRIGHTNESSUP
, down
);
536 case 0xc: /* videomode switch */
537 input_report_key(adbhid
[id
]->input
, KEY_SWITCHVIDEOMODE
, down
);
540 case 0xd: /* keyboard illumination toggle */
541 input_report_key(adbhid
[id
]->input
, KEY_KBDILLUMTOGGLE
, down
);
544 case 0xe: /* keyboard illumination decrease */
545 input_report_key(adbhid
[id
]->input
, KEY_KBDILLUMDOWN
, down
);
552 /* keyboard illumination increase */
553 input_report_key(adbhid
[id
]->input
, KEY_KBDILLUMUP
, down
);
558 /* keypad overlay toogle */
562 printk(KERN_INFO
"Unhandled ADB_MISC event %02x, %02x, %02x, %02x\n",
563 data
[0], data
[1], data
[2], data
[3]);
568 printk(KERN_INFO
"Unhandled ADB_MISC event %02x, %02x, %02x, %02x\n",
569 data
[0], data
[1], data
[2], data
[3]);
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;
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;
599 pending_led_start
= (pending_led_start
< 16) ? pending_led_start
: 0;
600 pending
= leds_req_pending
;
602 leds_req_pending
= 0;
603 spin_unlock_irqrestore(&leds_lock
, flags
);
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
)
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
);
621 if (!(leds_pending
[device
] & 0x100)) {
622 pending_devs
[pending_led_end
] = device
;
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;
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
);
653 adb_message_handler(struct notifier_block
*this, unsigned long code
, void *x
)
656 case ADB_MSG_PRE_RESET
:
657 case ADB_MSG_POWERDOWN
:
658 /* Stop the repeat timer. Autopoll is already off at this point */
661 for (i
= 1; i
< 16; i
++) {
663 del_timer_sync(&adbhid
[i
]->input
->timer
);
667 /* Stop pending led requests */
668 while(leds_req_pending
)
672 case ADB_MSG_POST_RESET
:
680 adbhid_input_register(int id
, int default_id
, int original_handler_id
,
681 int current_handler_id
, int mouse_kind
)
684 struct input_dev
*input_dev
;
689 printk(KERN_ERR
"Trying to reregister ADB HID on ID %d\n", id
);
693 adbhid
[id
] = hid
= kzalloc(sizeof(struct adbhid
), GFP_KERNEL
);
694 input_dev
= input_allocate_device();
695 if (!hid
|| !input_dev
) {
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
;
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
) {
719 hid
->keycode
= kmalloc(sizeof(adb_to_linux_keycodes
), GFP_KERNEL
);
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
) {
732 printk("<unknown>.\n");
733 input_dev
->id
.version
= ADB_KEYBOARD_UNKNOWN
;
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:
740 input_dev
->id
.version
= ADB_KEYBOARD_ANSI
;
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
;
753 case 0x12: case 0x15: case 0x16: case 0x17: case 0x1A:
754 case 0x1E: case 0xC2: case 0xC5: case 0xC8: case 0xC9:
756 input_dev
->id
.version
= ADB_KEYBOARD_JIS
;
760 for (i
= 0; i
< 128; 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;
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
);
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
);
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
);
806 /* else fall through */
809 printk(KERN_INFO
"Trying to register unknown ADB device to input layer.\n");
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 */
828 fail
: input_free_device(input_dev
);
834 static void adbhid_input_unregister(int id
)
836 input_unregister_device(adbhid
[id
]->input
);
837 kfree(adbhid
[id
]->keycode
);
844 adbhid_input_reregister(int id
, int default_id
, int org_handler_id
,
845 int cur_handler_id
, int mk
)
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
,
855 adbhid_input_register(id
, default_id
, org_handler_id
,
861 adbhid_input_devcleanup(u16 exist
)
865 if (adbhid
[i
] && !(exist
&(1<<i
)))
866 adbhid_input_unregister(i
);
872 struct adb_request req
;
873 int i
, default_id
, org_handler_id
, cur_handler_id
;
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
);
897 if (adb_try_handler_change(id
, 3))
898 printk("ADB keyboard at %d, handler set to 3\n", id
);
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
,
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
,
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
];
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
;
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
)) {
959 } else if (mouse_kind
== ADBMOUSE_MS_A3
) {
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
968 adb_request(&req
, NULL
, ADBREQ_SYNC
| ADBREQ_REPLY
, 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
;
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
;
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
;
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
;
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
);
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,
1017 if (req
.reply_len
< 8)
1018 printk("bad length for reg. 1\n");
1021 memcpy(r1_buffer
, &req
.reply
[1], 8);
1023 adb_request(&req
, NULL
, ADBREQ_SYNC
, 9,
1034 adb_request(&req
, NULL
, ADBREQ_SYNC
, 9,
1045 adb_request(&req
, NULL
, ADBREQ_SYNC
, 9,
1053 0x03, /*r1_buffer[6],*/
1056 /* Without this flush, the trackpad may be locked up */
1057 adb_request(&req
, NULL
, ADBREQ_SYNC
, 1, ADB_FLUSH(id
));
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);
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,
1115 adb_request(&req
, NULL
, ADBREQ_SYNC
, 1, ADB_FLUSH(3));
1117 adb_request(&req
, NULL
, ADBREQ_SYNC
, 9,
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
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):
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,
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
));
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),
1180 adb_request(&req
, NULL
, ADBREQ_SYNC
, 1, ADB_FLUSH(id
));
1183 static int __init
adbhid_init(void)
1186 if (!machine_is(chrp
) && !machine_is(powermac
))
1190 led_request
.complete
= 1;
1194 blocking_notifier_chain_register(&adb_client_list
,
1195 &adbhid_adb_notifier
);
1200 static void __exit
adbhid_exit(void)
1204 module_init(adbhid_init
);
1205 module_exit(adbhid_exit
);