adbhid.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:25k
源码类别:

嵌入式Linux

开发平台:

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