📄 adbhid.c
字号:
return; } sprintf(adbhid[id]->name, "ADB keyboard on ID %d:%d.%02x", id, default_id, original_handler_id); memcpy(adbhid[id]->keycode, adb_to_linux_keycodes, sizeof(adb_to_linux_keycodes)); printk(KERN_INFO "Detected ADB keyboard, type "); switch (original_handler_id) { default: printk("<unknown>.\n"); adbhid[id]->input.idversion = ADB_KEYBOARD_UNKNOWN; break; case 0x01: case 0x02: case 0x03: case 0x06: case 0x08: case 0x0C: case 0x10: case 0x18: case 0x1B: case 0x1C: case 0xC0: case 0xC3: case 0xC6: printk("ANSI.\n"); adbhid[id]->input.idversion = ADB_KEYBOARD_ANSI; break; case 0x04: case 0x05: case 0x07: case 0x09: case 0x0D: case 0x11: case 0x14: case 0x19: case 0x1D: case 0xC1: case 0xC4: case 0xC7: printk("ISO, swapping keys.\n"); adbhid[id]->input.idversion = ADB_KEYBOARD_ISO; i = adbhid[id]->keycode[10]; adbhid[id]->keycode[10] = adbhid[id]->keycode[50]; adbhid[id]->keycode[50] = i; break; case 0x12: case 0x15: case 0x16: case 0x17: case 0x1A: case 0x1E: case 0xC2: case 0xC5: case 0xC8: case 0xC9: printk("JIS.\n"); adbhid[id]->input.idversion = ADB_KEYBOARD_JIS; break; } for (i = 0; i < 128; i++) if (adbhid[id]->keycode[i]) set_bit(adbhid[id]->keycode[i], adbhid[id]->input.keybit); adbhid[id]->input.evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP); adbhid[id]->input.ledbit[0] = BIT(LED_SCROLLL) | BIT(LED_CAPSL) | BIT(LED_NUML); adbhid[id]->input.event = adbhid_kbd_event; adbhid[id]->input.keycodemax = 127; adbhid[id]->input.keycodesize = 1; break; case ADB_MOUSE: sprintf(adbhid[id]->name, "ADB mouse on ID %d:%d.%02x", id, default_id, original_handler_id); adbhid[id]->input.evbit[0] = BIT(EV_KEY) | BIT(EV_REL); adbhid[id]->input.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); adbhid[id]->input.relbit[0] = BIT(REL_X) | BIT(REL_Y); break; case ADB_MISC: switch (original_handler_id) { case 0x02: /* Adjustable keyboard button device */ sprintf(adbhid[id]->name, "ADB adjustable keyboard buttons on ID %d:%d.%02x", id, default_id, original_handler_id); break; case 0x1f: /* Powerbook button device */ sprintf(adbhid[id]->name, "ADB Powerbook buttons on ID %d:%d.%02x", id, default_id, original_handler_id); break; } if (adbhid[id]->name[0]) break; /* else fall through */ default: printk(KERN_INFO "Trying to register unknown ADB device to input layer.\n"); kfree(adbhid[id]); return; } adbhid[id]->input.keycode = adbhid[id]->keycode; input_register_device(&adbhid[id]->input); printk(KERN_INFO "input%d: ADB HID on ID %d:%d.%02x\n", adbhid[id]->input.number, id, default_id, original_handler_id); if (default_id == ADB_KEYBOARD) { /* HACK WARNING!! This should go away as soon there is an utility * to control that for event devices. */ adbhid[id]->input.rep[REP_DELAY] = HZ/2; /* input layer default: HZ/4 */ adbhid[id]->input.rep[REP_PERIOD] = HZ/15; /* input layer default: HZ/33 */ }}static void adbhid_input_unregister(int id){ input_unregister_device(&adbhid[id]->input); if (adbhid[id]->keycode) kfree(adbhid[id]->keycode); kfree(adbhid[id]); adbhid[id] = 0;}static voidadbhid_probe(void){ struct adb_request req; int i, default_id, org_handler_id, cur_handler_id; for (i = 1; i < 16; i++) { if (adbhid[i]) adbhid_input_unregister(i); } adb_register(ADB_MOUSE, 0, &mouse_ids, adbhid_mouse_input); adb_register(ADB_KEYBOARD, 0, &keyboard_ids, adbhid_keyboard_input); adb_register(ADB_MISC, 0, &buttons_ids, adbhid_buttons_input); for (i = 0; i < keyboard_ids.nids; i++) { int id = keyboard_ids.id[i]; adb_get_infos(id, &default_id, &org_handler_id); /* turn off all leds */ adb_request(&req, NULL, ADBREQ_SYNC, 3, ADB_WRITEREG(id, KEYB_LEDREG), 0xff, 0xff); /* Enable full feature set of the keyboard ->get it to send separate codes for left and right shift, control, option keys */#if 0 /* handler 5 doesn't send separate codes for R modifiers */ if (adb_try_handler_change(id, 5)) printk("ADB keyboard at %d, handler set to 5\n", id); else#endif if (adb_try_handler_change(id, 3)) printk("ADB keyboard at %d, handler set to 3\n", id); else printk("ADB keyboard at %d, handler 1\n", id); adb_get_infos(id, &default_id, &cur_handler_id); adbhid_input_register(id, default_id, org_handler_id, cur_handler_id, 0); } for (i = 0; i < buttons_ids.nids; i++) { int id = buttons_ids.id[i]; adb_get_infos(id, &default_id, &org_handler_id); adbhid_input_register(id, default_id, org_handler_id, org_handler_id, 0); } /* Try to switch all mice to handler 4, or 2 for three-button mode and full resolution. */ for (i = 0; i < mouse_ids.nids; i++) { int id = mouse_ids.id[i]; int mouse_kind; adb_get_infos(id, &default_id, &org_handler_id); if (adb_try_handler_change(id, 4)) { printk("ADB mouse at %d, handler set to 4", id); mouse_kind = ADBMOUSE_EXTENDED; } else if (adb_try_handler_change(id, 0x2F)) { printk("ADB mouse at %d, handler set to 0x2F", id); mouse_kind = ADBMOUSE_MICROSPEED; } else if (adb_try_handler_change(id, 0x42)) { printk("ADB mouse at %d, handler set to 0x42", id); mouse_kind = ADBMOUSE_TRACKBALLPRO; } else if (adb_try_handler_change(id, 0x66)) { printk("ADB mouse at %d, handler set to 0x66", id); mouse_kind = ADBMOUSE_MICROSPEED; } else if (adb_try_handler_change(id, 0x5F)) { printk("ADB mouse at %d, handler set to 0x5F", id); mouse_kind = ADBMOUSE_MICROSPEED; } else if (adb_try_handler_change(id, 3)) { printk("ADB mouse at %d, handler set to 3", id); mouse_kind = ADBMOUSE_MS_A3; } else if (adb_try_handler_change(id, 2)) { printk("ADB mouse at %d, handler set to 2", id); mouse_kind = ADBMOUSE_STANDARD_200; } else { printk("ADB mouse at %d, handler 1", id); mouse_kind = ADBMOUSE_STANDARD_100; } if ((mouse_kind == ADBMOUSE_TRACKBALLPRO) || (mouse_kind == ADBMOUSE_MICROSPEED)) { init_microspeed(id); } else if (mouse_kind == ADBMOUSE_MS_A3) { init_ms_a3(id); } else if (mouse_kind == ADBMOUSE_EXTENDED) { /* * Register 1 is usually used for device * identification. Here, we try to identify * a known device and call the appropriate * init function. */ adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1, ADB_READREG(id, 1)); if ((req.reply_len) && (req.reply[1] == 0x9a) && ((req.reply[2] == 0x21) || (req.reply[2] == 0x20))) { mouse_kind = ADBMOUSE_TRACKBALL; init_trackball(id); } else if ((req.reply_len >= 4) && (req.reply[1] == 0x74) && (req.reply[2] == 0x70) && (req.reply[3] == 0x61) && (req.reply[4] == 0x64)) { mouse_kind = ADBMOUSE_TRACKPAD; init_trackpad(id); } else if ((req.reply_len >= 4) && (req.reply[1] == 0x4b) && (req.reply[2] == 0x4d) && (req.reply[3] == 0x4c) && (req.reply[4] == 0x31)) { mouse_kind = ADBMOUSE_TURBOMOUSE5; init_turbomouse(id); } else if ((req.reply_len == 9) && (req.reply[1] == 0x4b) && (req.reply[2] == 0x4f) && (req.reply[3] == 0x49) && (req.reply[4] == 0x54)) { if (adb_try_handler_change(id, 0x42)) { printk("\nADB MacAlly 2-button mouse at %d, handler set to 0x42", id); mouse_kind = ADBMOUSE_MACALLY2; } } } printk("\n"); adb_get_infos(id, &default_id, &cur_handler_id); adbhid_input_register(id, default_id, org_handler_id, cur_handler_id, mouse_kind); }}static void init_trackpad(int id){ struct adb_request req; unsigned char r1_buffer[8]; printk(" (trackpad)"); adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1, ADB_READREG(id,1)); if (req.reply_len < 8) printk("bad length for reg. 1\n"); else { memcpy(r1_buffer, &req.reply[1], 8); adb_request(&req, NULL, ADBREQ_SYNC, 9, ADB_WRITEREG(id,1), r1_buffer[0], r1_buffer[1], r1_buffer[2], r1_buffer[3], r1_buffer[4], r1_buffer[5], 0x0d, /*r1_buffer[6],*/ r1_buffer[7]); adb_request(&req, NULL, ADBREQ_SYNC, 9, ADB_WRITEREG(id,2), 0x99, 0x94, 0x19, 0xff, 0xb2, 0x8a, 0x1b, 0x50); adb_request(&req, NULL, ADBREQ_SYNC, 9, ADB_WRITEREG(id,1), r1_buffer[0], r1_buffer[1], r1_buffer[2], r1_buffer[3], r1_buffer[4], r1_buffer[5], 0x03, /*r1_buffer[6],*/ r1_buffer[7]); }}static void init_trackball(int id){ struct adb_request req; printk(" (trackman/mouseman)"); adb_request(&req, NULL, ADBREQ_SYNC, 3, ADB_WRITEREG(id,1), 00,0x81); adb_request(&req, NULL, ADBREQ_SYNC, 3, ADB_WRITEREG(id,1), 01,0x81); adb_request(&req, NULL, ADBREQ_SYNC, 3, ADB_WRITEREG(id,1), 02,0x81); adb_request(&req, NULL, ADBREQ_SYNC, 3, ADB_WRITEREG(id,1), 03,0x38); adb_request(&req, NULL, ADBREQ_SYNC, 3, ADB_WRITEREG(id,1), 00,0x81); adb_request(&req, NULL, ADBREQ_SYNC, 3, ADB_WRITEREG(id,1), 01,0x81); adb_request(&req, NULL, ADBREQ_SYNC, 3, ADB_WRITEREG(id,1), 02,0x81); adb_request(&req, NULL, ADBREQ_SYNC, 3, ADB_WRITEREG(id,1), 03,0x38);}static voidinit_turbomouse(int id){ struct adb_request req; printk(" (TurboMouse 5)"); adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id)); adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3)); adb_request(&req, NULL, ADBREQ_SYNC, 9, ADB_WRITEREG(3,2), 0xe7, 0x8c, 0, 0, 0, 0xff, 0xff, 0x94); adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3)); adb_request(&req, NULL, ADBREQ_SYNC, 9, ADB_WRITEREG(3,2), 0xa5, 0x14, 0, 0, 0x69, 0xff, 0xff, 0x27);}static voidinit_microspeed(int id){ struct adb_request req; printk(" (Microspeed/MacPoint or compatible)"); adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id)); /* This will initialize mice using the Microspeed, MacPoint and other compatible firmware. Bit 12 enables extended protocol. Register 1 Listen (4 Bytes) 0 - 3 Button is mouse (set also for double clicking!!!) 4 - 7 Button is locking (affects change speed also) 8 - 11 Button changes speed 12 1 = Extended mouse mode, 0 = normal mouse mode 13 - 15 unused 0 16 - 23 normal speed 24 - 31 changed speed Register 1 talk holds version and product identification information. Register 1 Talk (4 Bytes): 0 - 7 Product code 8 - 23 undefined, reserved 24 - 31 Version number Speed 0 is max. 1 to 255 set speed in increments of 1/256 of max. */ adb_request(&req, NULL, ADBREQ_SYNC, 5, ADB_WRITEREG(id,1), 0x20, /* alt speed = 0x20 (rather slow) */ 0x00, /* norm speed = 0x00 (fastest) */ 0x10, /* extended protocol, no speed change */ 0x07); /* all buttons enabled as mouse buttons, no locking */ adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));}static voidinit_ms_a3(int id){ struct adb_request req; printk(" (Mouse Systems A3 Mouse, or compatible)"); adb_request(&req, NULL, ADBREQ_SYNC, 3, ADB_WRITEREG(id, 0x2), 0x00, 0x07); adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));}static int __init adbhid_init(void){ if ( (_machine != _MACH_chrp) && (_machine != _MACH_Pmac) ) return 0; led_request.complete = 1; adbhid_probe(); notifier_chain_register(&adb_client_list, &adbhid_adb_notifier); return 0;}static void __exit adbhid_exit(void){} module_init(adbhid_init);module_exit(adbhid_exit);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -