📄 mac_keyb.c
字号:
#ifdef CONFIG_PPC if ( (_machine != _MACH_chrp) && (_machine != _MACH_Pmac) ) return;#endif#ifdef CONFIG_MAC if (!MACH_IS_MAC) return;#endif /* setup key map */ memcpy(key_maps[0], macplain_map, sizeof(plain_map)); memcpy(key_maps[1], macshift_map, sizeof(plain_map)); memcpy(key_maps[2], macaltgr_map, sizeof(plain_map)); memcpy(key_maps[4], macctrl_map, sizeof(plain_map)); memcpy(key_maps[5], macshift_ctrl_map, sizeof(plain_map)); memcpy(key_maps[8], macalt_map, sizeof(plain_map)); memcpy(key_maps[12], macctrl_alt_map, sizeof(plain_map));#ifdef CONFIG_ADBMOUSE /* initialize mouse interrupt hook */ adb_mouse_interrupt_hook = NULL;#endif led_request.complete = 1; mackeyb_probe(); notifier_chain_register(&adb_client_list, &mackeyb_adb_notifier);}static intadb_message_handler(struct notifier_block *this, unsigned long code, void *x){ unsigned long flags; switch (code) { case ADB_MSG_PRE_RESET: case ADB_MSG_POWERDOWN: /* Stop the repeat timer. Autopoll is already off at this point */ save_flags(flags); cli(); del_timer(&repeat_timer); restore_flags(flags); /* Stop pending led requests */ while(!led_request.complete) adb_poll(); break; case ADB_MSG_POST_RESET: mackeyb_probe(); break; } return NOTIFY_DONE;}static voidmackeyb_probe(void){ struct adb_request req; int i;#ifdef CONFIG_ADBMOUSE adb_register(ADB_MOUSE, 0, &mouse_ids, mouse_input);#endif /* CONFIG_ADBMOUSE */ adb_register(ADB_KEYBOARD, 0, &keyboard_ids, keyboard_input); adb_register(0x07, 0x1F, &buttons_ids, buttons_input); for (i = 0; i < keyboard_ids.nids; i++) { int id = keyboard_ids.id[i]; /* 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); } /* 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]; if (adb_try_handler_change(id, 4)) { printk("ADB mouse at %d, handler set to 4", id); adb_mouse_kinds[id] = ADBMOUSE_EXTENDED; } else if (adb_try_handler_change(id, 0x2F)) { printk("ADB mouse at %d, handler set to 0x2F", id); adb_mouse_kinds[id] = ADBMOUSE_MICROSPEED; } else if (adb_try_handler_change(id, 0x42)) { printk("ADB mouse at %d, handler set to 0x42", id); adb_mouse_kinds[id] = ADBMOUSE_TRACKBALLPRO; } else if (adb_try_handler_change(id, 0x66)) { printk("ADB mouse at %d, handler set to 0x66", id); adb_mouse_kinds[id] = ADBMOUSE_MICROSPEED; } else if (adb_try_handler_change(id, 0x5F)) { printk("ADB mouse at %d, handler set to 0x5F", id); adb_mouse_kinds[id] = ADBMOUSE_MICROSPEED; } else if (adb_try_handler_change(id, 3)) { printk("ADB mouse at %d, handler set to 3", id); adb_mouse_kinds[id] = ADBMOUSE_MS_A3; } else if (adb_try_handler_change(id, 2)) { printk("ADB mouse at %d, handler set to 2", id); adb_mouse_kinds[id] = ADBMOUSE_STANDARD_200; } else { printk("ADB mouse at %d, handler 1", id); adb_mouse_kinds[id] = ADBMOUSE_STANDARD_100; } if ((adb_mouse_kinds[id] == ADBMOUSE_TRACKBALLPRO) || (adb_mouse_kinds[id] == ADBMOUSE_MICROSPEED)) { init_microspeed(id); } else if (adb_mouse_kinds[id] == ADBMOUSE_MS_A3) { init_ms_a3(id); } else if (adb_mouse_kinds[id] == 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))) 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)) 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)) 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); adb_mouse_kinds[id] = ADBMOUSE_MACALLY2; } } } printk("\n"); }}static voidinit_trackpad(int id){ struct adb_request req; unsigned char r1_buffer[8]; printk(" (trackpad)"); adb_mouse_kinds[id] = ADBMOUSE_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 voidinit_trackball(int id){ struct adb_request req; printk(" (trackman/mouseman)"); adb_mouse_kinds[id] = ADBMOUSE_TRACKBALL; 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_mouse_kinds[id] = ADBMOUSE_TURBOMOUSE5; 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)); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -