adbhid.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:26k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * drivers/input/adbhid.c
  3.  *
  4.  * ADB HID driver for Power Macintosh computers.
  5.  *
  6.  * Adapted from drivers/macintosh/mac_keyb.c by Franz Sirl
  7.  * (see that file for its authors and contributors).
  8.  *
  9.  * Copyright (C) 2000 Franz Sirl.
  10.  *
  11.  * Adapted to ADB changes and support for more devices by
  12.  * Benjamin Herrenschmidt. Adapted from code in MkLinux
  13.  * and reworked.
  14.  * 
  15.  * Supported devices:
  16.  *
  17.  * - Standard 1 button mouse
  18.  * - All standard Apple Extended protocol (handler ID 4)
  19.  * - mouseman and trackman mice & trackballs 
  20.  * - PowerBook Trackpad (default setup: enable tapping)
  21.  * - MicroSpeed mouse & trackball (needs testing)
  22.  * - CH Products Trackball Pro (needs testing)
  23.  * - Contour Design (Contour Mouse)
  24.  * - Hunter digital (NoHandsMouse)
  25.  * - Kensignton TurboMouse 5 (needs testing)
  26.  * - Mouse Systems A3 mice and trackballs <aidan@kublai.com>
  27.  * - MacAlly 2-buttons mouse (needs testing) <pochini@denise.shiny.it>
  28.  *
  29.  * To do:
  30.  *
  31.  * Improve Kensington support.
  32.  */
  33. #include <linux/config.h>
  34. #include <linux/module.h>
  35. #include <linux/slab.h>
  36. #include <linux/init.h>
  37. #include <linux/notifier.h>
  38. #include <linux/input.h>
  39. #include <linux/kbd_ll.h>
  40. #include <linux/adb.h>
  41. #include <linux/cuda.h>
  42. #include <linux/pmu.h>
  43. #ifdef CONFIG_PMAC_BACKLIGHT
  44. #include <asm/backlight.h>
  45. #endif
  46. MODULE_AUTHOR("Franz Sirl <Franz.Sirl-kernel@lauterbach.com>");
  47. #define KEYB_KEYREG 0 /* register # for key up/down data */
  48. #define KEYB_LEDREG 2 /* register # for leds on ADB keyboard */
  49. #define MOUSE_DATAREG 0 /* reg# for movement/button codes from mouse */
  50. static int adb_message_handler(struct notifier_block *, unsigned long, void *);
  51. static struct notifier_block adbhid_adb_notifier = {
  52. notifier_call: adb_message_handler,
  53. };
  54. unsigned char adb_to_linux_keycodes[128] = {
  55.  30, 31, 32, 33, 35, 34, 44, 45, 46, 47, 86, 48, 16, 17, 18, 19,
  56.  21, 20,  2,  3,  4,  5,  7,  6, 13, 10,  8, 12,  9, 11, 27, 24,
  57.  22, 26, 23, 25, 28, 38, 36, 40, 37, 39, 43, 51, 53, 49, 50, 52,
  58.  15, 57, 41, 14, 96,  1, 29,125, 42, 58, 56,105,106,108,103,  0,
  59.   0, 83,  0, 55,  0, 78,  0, 69,  0,  0,  0, 98, 96,  0, 74,  0,
  60.   0,117, 82, 79, 80, 81, 75, 76, 77, 71,  0, 72, 73,183,181,124,
  61.  63, 64, 65, 61, 66, 67,191, 87,190, 99,  0, 70,  0, 68,101, 88,
  62.   0,119,110,102,104,111, 62,107, 60,109, 59, 54,100, 97,116,116
  63. };
  64. struct adbhid {
  65. struct input_dev input;
  66. int id;
  67. int default_id;
  68. int original_handler_id;
  69. int current_handler_id;
  70. int mouse_kind;
  71. unsigned char *keycode;
  72. char name[64];
  73. };
  74. static struct adbhid *adbhid[16] = { 0 };
  75. static void adbhid_probe(void);
  76. static void adbhid_input_keycode(int, int, int);
  77. static void leds_done(struct adb_request *);
  78. static void init_trackpad(int id);
  79. static void init_trackball(int id);
  80. static void init_turbomouse(int id);
  81. static void init_microspeed(int id);
  82. static void init_ms_a3(int id);
  83. static struct adb_ids keyboard_ids;
  84. static struct adb_ids mouse_ids;
  85. static struct adb_ids buttons_ids;
  86. #ifdef CONFIG_PMAC_BACKLIGHT
  87. /* Exported to via-pmu.c */
  88. int disable_kernel_backlight = 0;
  89. #endif /* CONFIG_PMAC_BACKLIGHT */
  90. /* Kind of keyboard, see Apple technote 1152  */
  91. #define ADB_KEYBOARD_UNKNOWN 0
  92. #define ADB_KEYBOARD_ANSI 0x0100
  93. #define ADB_KEYBOARD_ISO 0x0200
  94. #define ADB_KEYBOARD_JIS 0x0300
  95. /* Kind of mouse  */
  96. #define ADBMOUSE_STANDARD_100 0 /* Standard 100cpi mouse (handler 1) */
  97. #define ADBMOUSE_STANDARD_200 1 /* Standard 200cpi mouse (handler 2) */
  98. #define ADBMOUSE_EXTENDED 2 /* Apple Extended mouse (handler 4) */
  99. #define ADBMOUSE_TRACKBALL 3 /* TrackBall (handler 4) */
  100. #define ADBMOUSE_TRACKPAD       4 /* Apple's PowerBook trackpad (handler 4) */
  101. #define ADBMOUSE_TURBOMOUSE5    5 /* Turbomouse 5 (previously req. mousehack) */
  102. #define ADBMOUSE_MICROSPEED 6 /* Microspeed mouse (&trackball ?), MacPoint */
  103. #define ADBMOUSE_TRACKBALLPRO 7 /* Trackball Pro (special buttons) */
  104. #define ADBMOUSE_MS_A3 8 /* Mouse systems A3 trackball (handler 3) */
  105. #define ADBMOUSE_MACALLY2 9 /* MacAlly 2-button mouse */
  106. static void
  107. adbhid_keyboard_input(unsigned char *data, int nb, struct pt_regs *regs, int apoll)
  108. {
  109. int id = (data[0] >> 4) & 0x0f;
  110. if (!adbhid[id]) {
  111. printk(KERN_ERR "ADB HID on ID %d not yet registered, packet %#02x, %#02x, %#02x, %#02xn",
  112.        id, data[0], data[1], data[2], data[3]);
  113. return;
  114. }
  115. /* first check this is from register 0 */
  116. if (nb != 3 || (data[0] & 3) != KEYB_KEYREG)
  117. return; /* ignore it */
  118. kbd_pt_regs = regs;
  119. adbhid_input_keycode(id, data[1], 0);
  120. if (!(data[2] == 0xff || (data[2] == 0x7f && data[1] == 0x7f)))
  121. adbhid_input_keycode(id, data[2], 0);
  122. }
  123. static void
  124. adbhid_input_keycode(int id, int keycode, int repeat)
  125. {
  126. int up_flag;
  127. up_flag = (keycode & 0x80);
  128. keycode &= 0x7f;
  129. switch (keycode) {
  130. case 0x39: /* Generate down/up events for CapsLock everytime. */
  131. input_report_key(&adbhid[id]->input, KEY_CAPSLOCK, 1);
  132. input_report_key(&adbhid[id]->input, KEY_CAPSLOCK, 0);
  133. return;
  134. case 0x3f: /* ignore Powerbook Fn key */
  135. return;
  136. }
  137. if (adbhid[id]->keycode[keycode])
  138. input_report_key(&adbhid[id]->input,
  139.  adbhid[id]->keycode[keycode], !up_flag);
  140. else
  141. printk(KERN_INFO "Unhandled ADB key (scancode %#02x) %s.n", keycode,
  142.        up_flag ? "released" : "pressed");
  143. }
  144. static void
  145. adbhid_mouse_input(unsigned char *data, int nb, struct pt_regs *regs, int autopoll)
  146. {
  147. int id = (data[0] >> 4) & 0x0f;
  148. if (!adbhid[id]) {
  149. printk(KERN_ERR "ADB HID on ID %d not yet registeredn", id);
  150. return;
  151. }
  152.   /*
  153.     Handler 1 -- 100cpi original Apple mouse protocol.
  154.     Handler 2 -- 200cpi original Apple mouse protocol.
  155.     For Apple's standard one-button mouse protocol the data array will
  156.     contain the following values:
  157.                 BITS    COMMENTS
  158.     data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd.
  159.     data[1] = bxxx xxxx First button and x-axis motion.
  160.     data[2] = byyy yyyy Second button and y-axis motion.
  161.     Handler 4 -- Apple Extended mouse protocol.
  162.     For Apple's 3-button mouse protocol the data array will contain the
  163.     following values:
  164. BITS    COMMENTS
  165.     data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd.
  166.     data[1] = bxxx xxxx Left button and x-axis motion.
  167.     data[2] = byyy yyyy Second button and y-axis motion.
  168.     data[3] = byyy bxxx Third button and fourth button.  Y is additional
  169.       high bits of y-axis motion.  XY is additional
  170.       high bits of x-axis motion.
  171.     MacAlly 2-button mouse protocol.
  172.     For MacAlly 2-button mouse protocol the data array will contain the
  173.     following values:
  174. BITS    COMMENTS
  175.     data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd.
  176.     data[1] = bxxx xxxx Left button and x-axis motion.
  177.     data[2] = byyy yyyy Right button and y-axis motion.
  178.     data[3] = ???? ???? unknown
  179.     data[4] = ???? ???? unknown
  180.   */
  181. /* If it's a trackpad, we alias the second button to the first.
  182.    NOTE: Apple sends an ADB flush command to the trackpad when
  183.          the first (the real) button is released. We could do
  184.  this here using async flush requests.
  185. */
  186. switch (adbhid[id]->mouse_kind)
  187. {
  188.     case ADBMOUSE_TRACKPAD:
  189. data[1] = (data[1] & 0x7f) | ((data[1] & data[2]) & 0x80);
  190. data[2] = data[2] | 0x80;
  191. break;
  192.     case ADBMOUSE_MICROSPEED:
  193. data[1] = (data[1] & 0x7f) | ((data[3] & 0x01) << 7);
  194. data[2] = (data[2] & 0x7f) | ((data[3] & 0x02) << 6);
  195. data[3] = (data[3] & 0x77) | ((data[3] & 0x04) << 5)
  196. | (data[3] & 0x08);
  197. break;
  198.     case ADBMOUSE_TRACKBALLPRO:
  199. data[1] = (data[1] & 0x7f) | (((data[3] & 0x04) << 5)
  200. & ((data[3] & 0x08) << 4));
  201. data[2] = (data[2] & 0x7f) | ((data[3] & 0x01) << 7);
  202. data[3] = (data[3] & 0x77) | ((data[3] & 0x02) << 6);
  203. break;
  204.     case ADBMOUSE_MS_A3:
  205. data[1] = (data[1] & 0x7f) | ((data[3] & 0x01) << 7);
  206. data[2] = (data[2] & 0x7f) | ((data[3] & 0x02) << 6);
  207. data[3] = ((data[3] & 0x04) << 5);
  208. break;
  209.             case ADBMOUSE_MACALLY2:
  210. data[3] = (data[2] & 0x80) ? 0x80 : 0x00;
  211. data[2] |= 0x80;  /* Right button is mapped as button 3 */
  212. nb=4;
  213.                 break;
  214. }
  215. input_report_key(&adbhid[id]->input, BTN_LEFT,   !((data[1] >> 7) & 1));
  216. input_report_key(&adbhid[id]->input, BTN_MIDDLE, !((data[2] >> 7) & 1));
  217. if (nb >= 4)
  218. input_report_key(&adbhid[id]->input, BTN_RIGHT,  !((data[3] >> 7) & 1));
  219. input_report_rel(&adbhid[id]->input, REL_X,
  220.  ((data[2]&0x7f) < 64 ? (data[2]&0x7f) : (data[2]&0x7f)-128 ));
  221. input_report_rel(&adbhid[id]->input, REL_Y,
  222.  ((data[1]&0x7f) < 64 ? (data[1]&0x7f) : (data[1]&0x7f)-128 ));
  223. }
  224. static void
  225. adbhid_buttons_input(unsigned char *data, int nb, struct pt_regs *regs, int autopoll)
  226. {
  227. int id = (data[0] >> 4) & 0x0f;
  228. if (!adbhid[id]) {
  229. printk(KERN_ERR "ADB HID on ID %d not yet registeredn", id);
  230. return;
  231. }
  232. switch (adbhid[id]->original_handler_id) {
  233. default:
  234. case 0x02: /* Adjustable keyboard button device */
  235. printk(KERN_INFO "Unhandled ADB_MISC event %02x, %02x, %02x, %02xn",
  236.        data[0], data[1], data[2], data[3]);
  237. break;
  238. case 0x1f: /* Powerbook button device */
  239.   {
  240.    int down = (data[1] == (data[1] & 0xf));
  241. #ifdef CONFIG_PMAC_BACKLIGHT
  242. int backlight = get_backlight_level();
  243. #endif
  244. /*
  245.  * XXX: Where is the contrast control for the passive?
  246.  *  -- Cort
  247.  */
  248. switch (data[1] & 0x0f) {
  249. case 0x8: /* mute */
  250. input_report_key(&adbhid[id]->input, KEY_MUTE, down);
  251. break;
  252. case 0x7: /* volume decrease */
  253. input_report_key(&adbhid[id]->input, KEY_VOLUMEDOWN, down);
  254. break;
  255. case 0x6: /* volume increase */
  256. input_report_key(&adbhid[id]->input, KEY_VOLUMEUP, down);
  257.   break;
  258. case 0xb: /* eject */
  259. input_report_key(&adbhid[id]->input, KEY_EJECTCD, down);
  260. break;
  261. case 0xa: /* brightness decrease */
  262. #ifdef CONFIG_PMAC_BACKLIGHT
  263. if (!disable_kernel_backlight) {
  264. if (!down || backlight < 0)
  265. break;
  266. if (backlight > BACKLIGHT_OFF)
  267. set_backlight_level(backlight-1);
  268. else
  269. set_backlight_level(BACKLIGHT_OFF);
  270. break;
  271. }
  272. #endif /* CONFIG_PMAC_BACKLIGHT */
  273. input_report_key(&adbhid[id]->input, KEY_BRIGHTNESSDOWN, down);
  274. break;
  275. case 0x9: /* brightness increase */
  276. #ifdef CONFIG_PMAC_BACKLIGHT
  277. if (!disable_kernel_backlight) {
  278. if (!down || backlight < 0)
  279. break;
  280. if (backlight < BACKLIGHT_MAX)
  281. set_backlight_level(backlight+1);
  282. else 
  283. set_backlight_level(BACKLIGHT_MAX);
  284. break;
  285. }
  286. #endif /* CONFIG_PMAC_BACKLIGHT */
  287. input_report_key(&adbhid[id]->input, KEY_BRIGHTNESSUP, down);
  288. break;
  289. }
  290.   }
  291.   break;
  292. }
  293. }
  294. static struct adb_request led_request;
  295. static int leds_pending[16];
  296. static int pending_devs[16];
  297. static int pending_led_start=0;
  298. static int pending_led_end=0;
  299. static void real_leds(unsigned char leds, int device)
  300. {
  301.     if (led_request.complete) {
  302. adb_request(&led_request, leds_done, 0, 3,
  303.     ADB_WRITEREG(device, KEYB_LEDREG), 0xff,
  304.     ~leds);
  305.     } else {
  306. if (!(leds_pending[device] & 0x100)) {
  307.     pending_devs[pending_led_end] = device;
  308.     pending_led_end++;
  309.     pending_led_end = (pending_led_end < 16) ? pending_led_end : 0;
  310. }
  311. leds_pending[device] = leds | 0x100;
  312.     }
  313. }
  314. /*
  315.  * Event callback from the input module. Events that change the state of
  316.  * the hardware are processed here.
  317.  */
  318. static int adbhid_kbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
  319. {
  320. struct adbhid *adbhid = dev->private;
  321. unsigned char leds;
  322. switch (type) {
  323. case EV_LED:
  324.   leds = (test_bit(LED_SCROLLL, dev->led) ? 4 : 0)
  325.        | (test_bit(LED_NUML,    dev->led) ? 1 : 0)
  326.        | (test_bit(LED_CAPSL,   dev->led) ? 2 : 0);
  327.   real_leds(leds, adbhid->id);
  328.   return 0;
  329. }
  330. return -1;
  331. }
  332. static void leds_done(struct adb_request *req)
  333. {
  334.     int leds,device;
  335.     if (pending_led_start != pending_led_end) {
  336. device = pending_devs[pending_led_start];
  337. leds = leds_pending[device] & 0xff;
  338. leds_pending[device] = 0;
  339. pending_led_start++;
  340. pending_led_start = (pending_led_start < 16) ? pending_led_start : 0;
  341. real_leds(leds,device);
  342.     }
  343. }
  344. static int
  345. adb_message_handler(struct notifier_block *this, unsigned long code, void *x)
  346. {
  347. unsigned long flags;
  348. switch (code) {
  349. case ADB_MSG_PRE_RESET:
  350. case ADB_MSG_POWERDOWN:
  351.      /* Stop the repeat timer. Autopoll is already off at this point */
  352. save_flags(flags);
  353. cli();
  354. {
  355. int i;
  356. for (i = 1; i < 16; i++) {
  357. if (adbhid[i])
  358. del_timer(&adbhid[i]->input.timer);
  359. }
  360. }
  361. restore_flags(flags);
  362. /* Stop pending led requests */
  363. while(!led_request.complete)
  364. adb_poll();
  365. break;
  366. case ADB_MSG_POST_RESET:
  367. adbhid_probe();
  368. break;
  369. }
  370. return NOTIFY_DONE;
  371. }
  372. static void
  373. adbhid_input_register(int id, int default_id, int original_handler_id,
  374.       int current_handler_id, int mouse_kind)
  375. {
  376. int i;
  377. if (adbhid[id]) {
  378. printk(KERN_ERR "Trying to reregister ADB HID on ID %dn", id);
  379. return;
  380. }
  381. if (!(adbhid[id] = kmalloc(sizeof(struct adbhid), GFP_KERNEL)))
  382. return;
  383. memset(adbhid[id], 0, sizeof(struct adbhid));
  384. adbhid[id]->id = default_id;
  385. adbhid[id]->original_handler_id = original_handler_id;
  386. adbhid[id]->current_handler_id = current_handler_id;
  387. adbhid[id]->mouse_kind = mouse_kind;
  388. adbhid[id]->input.private = adbhid[id];
  389. adbhid[id]->input.name = adbhid[id]->name;
  390. adbhid[id]->input.idbus = BUS_ADB;
  391. adbhid[id]->input.idvendor = 0x0001;
  392. adbhid[id]->input.idproduct = (id << 12) | (default_id << 8) | original_handler_id;
  393. adbhid[id]->input.idversion = 0x0100;
  394. switch (default_id) {
  395. case ADB_KEYBOARD:
  396. if (!(adbhid[id]->keycode = kmalloc(sizeof(adb_to_linux_keycodes), GFP_KERNEL))) {
  397. kfree(adbhid[id]);
  398. return;
  399. }
  400. sprintf(adbhid[id]->name, "ADB keyboard on ID %d:%d.%02x",
  401. id, default_id, original_handler_id);
  402. memcpy(adbhid[id]->keycode, adb_to_linux_keycodes, sizeof(adb_to_linux_keycodes));
  403. printk(KERN_INFO "Detected ADB keyboard, type ");
  404. switch (original_handler_id) {
  405. default:
  406. printk("<unknown>.n");
  407. adbhid[id]->input.idversion = ADB_KEYBOARD_UNKNOWN;
  408. break;
  409. case 0x01: case 0x02: case 0x03: case 0x06: case 0x08:
  410. case 0x0C: case 0x10: case 0x18: case 0x1B: case 0x1C:
  411. case 0xC0: case 0xC3: case 0xC6:
  412. printk("ANSI.n");
  413. adbhid[id]->input.idversion = ADB_KEYBOARD_ANSI;
  414. break;
  415. case 0x04: case 0x05: case 0x07: case 0x09: case 0x0D:
  416. case 0x11: case 0x14: case 0x19: case 0x1D: case 0xC1:
  417. case 0xC4: case 0xC7:
  418. printk("ISO, swapping keys.n");
  419. adbhid[id]->input.idversion = ADB_KEYBOARD_ISO;
  420. i = adbhid[id]->keycode[10];
  421. adbhid[id]->keycode[10] = adbhid[id]->keycode[50];
  422. adbhid[id]->keycode[50] = i;
  423. break;
  424. case 0x12: case 0x15: case 0x16: case 0x17: case 0x1A:
  425. case 0x1E: case 0xC2: case 0xC5: case 0xC8: case 0xC9:
  426. printk("JIS.n");
  427. adbhid[id]->input.idversion = ADB_KEYBOARD_JIS;
  428. break;
  429. }
  430. for (i = 0; i < 128; i++)
  431. if (adbhid[id]->keycode[i])
  432. set_bit(adbhid[id]->keycode[i], adbhid[id]->input.keybit);
  433. adbhid[id]->input.evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
  434. adbhid[id]->input.ledbit[0] = BIT(LED_SCROLLL) | BIT(LED_CAPSL) | BIT(LED_NUML);
  435. adbhid[id]->input.event = adbhid_kbd_event;
  436. adbhid[id]->input.keycodemax = 127;
  437. adbhid[id]->input.keycodesize = 1;
  438. break;
  439. case ADB_MOUSE:
  440. sprintf(adbhid[id]->name, "ADB mouse on ID %d:%d.%02x",
  441. id, default_id, original_handler_id);
  442. adbhid[id]->input.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
  443. adbhid[id]->input.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);
  444. adbhid[id]->input.relbit[0] = BIT(REL_X) | BIT(REL_Y);
  445. break;
  446. case ADB_MISC:
  447. switch (original_handler_id) {
  448. case 0x02: /* Adjustable keyboard button device */
  449. sprintf(adbhid[id]->name, "ADB adjustable keyboard buttons on ID %d:%d.%02x",
  450. id, default_id, original_handler_id);
  451. break;
  452. case 0x1f: /* Powerbook button device */
  453. sprintf(adbhid[id]->name, "ADB Powerbook buttons on ID %d:%d.%02x",
  454. id, default_id, original_handler_id);
  455. adbhid[id]->input.evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
  456. set_bit(KEY_MUTE, adbhid[id]->input.keybit);
  457. set_bit(KEY_VOLUMEUP, adbhid[id]->input.keybit);
  458. set_bit(KEY_VOLUMEDOWN, adbhid[id]->input.keybit);
  459. set_bit(KEY_BRIGHTNESSUP, adbhid[id]->input.keybit);
  460. set_bit(KEY_BRIGHTNESSDOWN, adbhid[id]->input.keybit);
  461. set_bit(KEY_EJECTCD, adbhid[id]->input.keybit);
  462. break;
  463. }
  464. if (adbhid[id]->name[0])
  465. break;
  466. /* else fall through */
  467. default:
  468. printk(KERN_INFO "Trying to register unknown ADB device to input layer.n");
  469. kfree(adbhid[id]);
  470. return;
  471. }
  472. adbhid[id]->input.keycode = adbhid[id]->keycode;
  473. input_register_device(&adbhid[id]->input);
  474. printk(KERN_INFO "input%d: ADB HID on ID %d:%d.%02xn",
  475.        adbhid[id]->input.number, id, default_id, original_handler_id);
  476. if (default_id == ADB_KEYBOARD) {
  477. /* HACK WARNING!! This should go away as soon there is an utility
  478.  * to control that for event devices.
  479.  */
  480. adbhid[id]->input.rep[REP_DELAY] = HZ/2;   /* input layer default: HZ/4 */
  481. adbhid[id]->input.rep[REP_PERIOD] = HZ/15; /* input layer default: HZ/33 */
  482. }
  483. }
  484. static void adbhid_input_unregister(int id)
  485. {
  486. input_unregister_device(&adbhid[id]->input);
  487. if (adbhid[id]->keycode)
  488. kfree(adbhid[id]->keycode);
  489. kfree(adbhid[id]);
  490. adbhid[id] = 0;
  491. }
  492. static u16
  493. adbhid_input_reregister(int id, int default_id, int org_handler_id,
  494. int cur_handler_id, int mk)
  495. {
  496. if (adbhid[id]) {
  497. if (adbhid[id]->input.idproduct !=
  498.     ((id << 12)|(default_id << 8)|org_handler_id)) {
  499. adbhid_input_unregister(id);
  500. adbhid_input_register(id, default_id, org_handler_id,
  501. cur_handler_id, mk);
  502. }
  503. } else
  504. adbhid_input_register(id, default_id, org_handler_id,
  505. cur_handler_id, mk);
  506. return 1<<id;
  507. }
  508. static void
  509. adbhid_input_devcleanup(u16 exist)
  510. {
  511. int i;
  512. for(i=1; i<16; i++)
  513.     if (adbhid[i] && !(exist&(1<<i)))
  514. adbhid_input_unregister(i);
  515. }
  516.  
  517. static void
  518. adbhid_probe(void)
  519. {
  520. struct adb_request req;
  521. int i, default_id, org_handler_id, cur_handler_id;
  522. u16 reg = 0;
  523. adb_register(ADB_MOUSE, 0, &mouse_ids, adbhid_mouse_input);
  524. adb_register(ADB_KEYBOARD, 0, &keyboard_ids, adbhid_keyboard_input);
  525. adb_register(ADB_MISC, 0, &buttons_ids, adbhid_buttons_input);
  526. for (i = 0; i < keyboard_ids.nids; i++) {
  527. int id = keyboard_ids.id[i];
  528. adb_get_infos(id, &default_id, &org_handler_id);
  529. /* turn off all leds */
  530. adb_request(&req, NULL, ADBREQ_SYNC, 3,
  531.     ADB_WRITEREG(id, KEYB_LEDREG), 0xff, 0xff);
  532. /* Enable full feature set of the keyboard
  533.    ->get it to send separate codes for left and right shift,
  534.    control, option keys */
  535. #if 0 /* handler 5 doesn't send separate codes for R modifiers */
  536. if (adb_try_handler_change(id, 5))
  537. printk("ADB keyboard at %d, handler set to 5n", id);
  538. else
  539. #endif
  540. if (adb_try_handler_change(id, 3))
  541. printk("ADB keyboard at %d, handler set to 3n", id);
  542. else
  543. printk("ADB keyboard at %d, handler 1n", id);
  544. adb_get_infos(id, &default_id, &cur_handler_id);
  545. reg |= adbhid_input_reregister(id, default_id, org_handler_id, cur_handler_id, 0);
  546. }
  547. for (i = 0; i < buttons_ids.nids; i++) {
  548. int id = buttons_ids.id[i];
  549. adb_get_infos(id, &default_id, &org_handler_id);
  550. reg |= adbhid_input_reregister(id, default_id, org_handler_id, org_handler_id, 0);
  551. }
  552. /* Try to switch all mice to handler 4, or 2 for three-button
  553.    mode and full resolution. */
  554. for (i = 0; i < mouse_ids.nids; i++) {
  555. int id = mouse_ids.id[i];
  556. int mouse_kind;
  557. adb_get_infos(id, &default_id, &org_handler_id);
  558. if (adb_try_handler_change(id, 4)) {
  559. printk("ADB mouse at %d, handler set to 4", id);
  560. mouse_kind = ADBMOUSE_EXTENDED;
  561. }
  562. else if (adb_try_handler_change(id, 0x2F)) {
  563. printk("ADB mouse at %d, handler set to 0x2F", id);
  564. mouse_kind = ADBMOUSE_MICROSPEED;
  565. }
  566. else if (adb_try_handler_change(id, 0x42)) {
  567. printk("ADB mouse at %d, handler set to 0x42", id);
  568. mouse_kind = ADBMOUSE_TRACKBALLPRO;
  569. }
  570. else if (adb_try_handler_change(id, 0x66)) {
  571. printk("ADB mouse at %d, handler set to 0x66", id);
  572. mouse_kind = ADBMOUSE_MICROSPEED;
  573. }
  574. else if (adb_try_handler_change(id, 0x5F)) {
  575. printk("ADB mouse at %d, handler set to 0x5F", id);
  576. mouse_kind = ADBMOUSE_MICROSPEED;
  577. }
  578. else if (adb_try_handler_change(id, 3)) {
  579. printk("ADB mouse at %d, handler set to 3", id);
  580. mouse_kind = ADBMOUSE_MS_A3;
  581. }
  582. else if (adb_try_handler_change(id, 2)) {
  583. printk("ADB mouse at %d, handler set to 2", id);
  584. mouse_kind = ADBMOUSE_STANDARD_200;
  585. }
  586. else {
  587. printk("ADB mouse at %d, handler 1", id);
  588. mouse_kind = ADBMOUSE_STANDARD_100;
  589. }
  590. if ((mouse_kind == ADBMOUSE_TRACKBALLPRO)
  591.     || (mouse_kind == ADBMOUSE_MICROSPEED)) {
  592. init_microspeed(id);
  593. } else if (mouse_kind == ADBMOUSE_MS_A3) {
  594. init_ms_a3(id);
  595. } else if (mouse_kind ==  ADBMOUSE_EXTENDED) {
  596. /*
  597.  * Register 1 is usually used for device
  598.  * identification.  Here, we try to identify
  599.  * a known device and call the appropriate
  600.  * init function.
  601.  */
  602. adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
  603.     ADB_READREG(id, 1));
  604. if ((req.reply_len) &&
  605.     (req.reply[1] == 0x9a) && ((req.reply[2] == 0x21)
  606.      || (req.reply[2] == 0x20))) {
  607. mouse_kind = ADBMOUSE_TRACKBALL;
  608. init_trackball(id);
  609. }
  610. else if ((req.reply_len >= 4) &&
  611.     (req.reply[1] == 0x74) && (req.reply[2] == 0x70) &&
  612.     (req.reply[3] == 0x61) && (req.reply[4] == 0x64)) {
  613. mouse_kind = ADBMOUSE_TRACKPAD;
  614. init_trackpad(id);
  615. }
  616. else if ((req.reply_len >= 4) &&
  617.     (req.reply[1] == 0x4b) && (req.reply[2] == 0x4d) &&
  618.     (req.reply[3] == 0x4c) && (req.reply[4] == 0x31)) {
  619. mouse_kind = ADBMOUSE_TURBOMOUSE5;
  620. init_turbomouse(id);
  621. }
  622. else if ((req.reply_len == 9) &&
  623.     (req.reply[1] == 0x4b) && (req.reply[2] == 0x4f) &&
  624.     (req.reply[3] == 0x49) && (req.reply[4] == 0x54)) {
  625. if (adb_try_handler_change(id, 0x42)) {
  626. printk("nADB MacAlly 2-button mouse at %d, handler set to 0x42", id);
  627. mouse_kind = ADBMOUSE_MACALLY2;
  628. }
  629. }
  630. }
  631. printk("n");
  632. adb_get_infos(id, &default_id, &cur_handler_id);
  633. reg |= adbhid_input_reregister(id, default_id, org_handler_id,
  634.       cur_handler_id, mouse_kind);
  635.         }
  636. adbhid_input_devcleanup(reg);
  637. }
  638. static void 
  639. init_trackpad(int id)
  640. {
  641. struct adb_request req;
  642. unsigned char r1_buffer[8];
  643. printk(" (trackpad)");
  644. adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
  645. ADB_READREG(id,1));
  646. if (req.reply_len < 8)
  647.     printk("bad length for reg. 1n");
  648. else
  649. {
  650.     memcpy(r1_buffer, &req.reply[1], 8);
  651.     adb_request(&req, NULL, ADBREQ_SYNC, 9,
  652.         ADB_WRITEREG(id,1),
  653.             r1_buffer[0],
  654.             r1_buffer[1],
  655.             r1_buffer[2],
  656.             r1_buffer[3],
  657.             r1_buffer[4],
  658.             r1_buffer[5],
  659.             0x0d,
  660.             r1_buffer[7]);
  661.             adb_request(&req, NULL, ADBREQ_SYNC, 9,
  662.         ADB_WRITEREG(id,2),
  663.          0x99,
  664.          0x94,
  665.          0x19,
  666.          0xff,
  667.          0xb2,
  668.          0x8a,
  669.          0x1b,
  670.          0x50);
  671.     adb_request(&req, NULL, ADBREQ_SYNC, 9,
  672.         ADB_WRITEREG(id,1),
  673.             r1_buffer[0],
  674.             r1_buffer[1],
  675.             r1_buffer[2],
  676.             r1_buffer[3],
  677.             r1_buffer[4],
  678.             r1_buffer[5],
  679.             0x03, /*r1_buffer[6],*/
  680.             r1_buffer[7]);
  681.     /* Without this flush, the trackpad may be locked up */     
  682.     adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
  683.         }
  684. }
  685. static void 
  686. init_trackball(int id)
  687. {
  688. struct adb_request req;
  689. printk(" (trackman/mouseman)");
  690. adb_request(&req, NULL, ADBREQ_SYNC, 3,
  691. ADB_WRITEREG(id,1), 00,0x81);
  692. adb_request(&req, NULL, ADBREQ_SYNC, 3,
  693. ADB_WRITEREG(id,1), 01,0x81);
  694. adb_request(&req, NULL, ADBREQ_SYNC, 3,
  695. ADB_WRITEREG(id,1), 02,0x81);
  696. adb_request(&req, NULL, ADBREQ_SYNC, 3,
  697. ADB_WRITEREG(id,1), 03,0x38);
  698. adb_request(&req, NULL, ADBREQ_SYNC, 3,
  699. ADB_WRITEREG(id,1), 00,0x81);
  700. adb_request(&req, NULL, ADBREQ_SYNC, 3,
  701. ADB_WRITEREG(id,1), 01,0x81);
  702. adb_request(&req, NULL, ADBREQ_SYNC, 3,
  703. ADB_WRITEREG(id,1), 02,0x81);
  704. adb_request(&req, NULL, ADBREQ_SYNC, 3,
  705. ADB_WRITEREG(id,1), 03,0x38);
  706. }
  707. static void
  708. init_turbomouse(int id)
  709. {
  710. struct adb_request req;
  711.         printk(" (TurboMouse 5)");
  712. adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
  713. adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3));
  714. adb_request(&req, NULL, ADBREQ_SYNC, 9,
  715. ADB_WRITEREG(3,2),
  716.     0xe7,
  717.     0x8c,
  718.     0,
  719.     0,
  720.     0,
  721.     0xff,
  722.     0xff,
  723.     0x94);
  724. adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3));
  725. adb_request(&req, NULL, ADBREQ_SYNC, 9,
  726. ADB_WRITEREG(3,2),
  727.     0xa5,
  728.     0x14,
  729.     0,
  730.     0,
  731.     0x69,
  732.     0xff,
  733.     0xff,
  734.     0x27);
  735. }
  736. static void
  737. init_microspeed(int id)
  738. {
  739. struct adb_request req;
  740.         printk(" (Microspeed/MacPoint or compatible)");
  741. adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
  742. /* This will initialize mice using the Microspeed, MacPoint and
  743.    other compatible firmware. Bit 12 enables extended protocol.
  744.    
  745.    Register 1 Listen (4 Bytes)
  746.             0 -  3     Button is mouse (set also for double clicking!!!)
  747.             4 -  7     Button is locking (affects change speed also)
  748.             8 - 11     Button changes speed
  749.            12          1 = Extended mouse mode, 0 = normal mouse mode
  750.            13 - 15     unused 0
  751.            16 - 23     normal speed
  752.            24 - 31     changed speed
  753.        Register 1 talk holds version and product identification information.
  754.        Register 1 Talk (4 Bytes):
  755.             0 -  7     Product code
  756.             8 - 23     undefined, reserved
  757.            24 - 31     Version number
  758.         
  759.        Speed 0 is max. 1 to 255 set speed in increments of 1/256 of max.
  760.  */
  761. adb_request(&req, NULL, ADBREQ_SYNC, 5,
  762. ADB_WRITEREG(id,1),
  763.     0x20, /* alt speed = 0x20 (rather slow) */
  764.     0x00, /* norm speed = 0x00 (fastest) */
  765.     0x10, /* extended protocol, no speed change */
  766.     0x07); /* all buttons enabled as mouse buttons, no locking */
  767. adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
  768. }
  769. static void
  770. init_ms_a3(int id)
  771. {
  772. struct adb_request req;
  773. printk(" (Mouse Systems A3 Mouse, or compatible)");
  774. adb_request(&req, NULL, ADBREQ_SYNC, 3,
  775. ADB_WRITEREG(id, 0x2),
  776.     0x00,
  777.     0x07);
  778.  
  779.   adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
  780. }
  781. static int __init adbhid_init(void)
  782. {
  783. #ifndef CONFIG_MAC
  784. if ( (_machine != _MACH_chrp) && (_machine != _MACH_Pmac) )
  785.     return 0;
  786. #endif
  787. led_request.complete = 1;
  788. adbhid_probe();
  789. notifier_chain_register(&adb_client_list, &adbhid_adb_notifier);
  790. return 0;
  791. }
  792. static void __exit adbhid_exit(void)
  793. {
  794. }
  795.  
  796. module_init(adbhid_init);
  797. module_exit(adbhid_exit);