📄 atakeyb.c
字号:
if (break_flag) { del_timer( &atakeyb_rep_timer ); rep_scancode = 0; } else { del_timer( &atakeyb_rep_timer ); rep_scancode = scancode; atakeyb_rep_timer.expires = jiffies + key_repeat_delay; add_timer( &atakeyb_rep_timer ); } handle_scancode(scancode, !break_flag); break; } break; case AMOUSE: kb_state.buf[kb_state.len++] = scancode; if (kb_state.len == 5) { kb_state.state = KEYBOARD; /* not yet used */ /* wake up someone waiting for this */ } break; case RMOUSE: kb_state.buf[kb_state.len++] = scancode; if (kb_state.len == 3) { kb_state.state = KEYBOARD; if (atari_mouse_interrupt_hook) atari_mouse_interrupt_hook(kb_state.buf); } break; case JOYSTICK: kb_state.buf[1] = scancode; kb_state.state = KEYBOARD; atari_joystick_interrupt(kb_state.buf); break; case CLOCK: kb_state.buf[kb_state.len++] = scancode; if (kb_state.len == 6) { kb_state.state = KEYBOARD; /* wake up someone waiting for this. But will this ever be used, as Linux keeps its own time. Perhaps for synchronization purposes? */ /* wake_up_interruptible(&clock_wait); */ } break; case RESYNC: if (kb_state.len <= 0 || IS_SYNC_CODE(scancode)) { kb_state.state = KEYBOARD; goto interpret_scancode; } kb_state.len--; break; } }#if 0 if (acia_stat & ACIA_CTS) /* cannot happen */;#endif if (acia_stat & (ACIA_FE | ACIA_PE)) { printk("Error in keyboard communication\n"); } /* handle_scancode() can take a lot of time, so check again if * some character arrived */ goto repeat;}/* * I write to the keyboard without using interrupts, I poll instead. * This takes for the maximum length string allowed (7) at 7812.5 baud * 8 data 1 start 1 stop bit: 9.0 ms * If this takes too long for normal operation, interrupt driven writing * is the solution. (I made a feeble attempt in that direction but I * kept it simple for now.) */void ikbd_write(const char *str, int len){ u_char acia_stat; if ((len < 1) || (len > 7)) panic("ikbd: maximum string length exceeded"); while (len) { acia_stat = acia.key_ctrl; if (acia_stat & ACIA_TDRE) { acia.key_data = *str++; len--; } }}/* Reset (without touching the clock) */void ikbd_reset(void){ static const char cmd[2] = { 0x80, 0x01 }; ikbd_write(cmd, 2); /* if all's well code 0xF1 is returned, else the break codes of all keys making contact */}/* Set mouse button action */void ikbd_mouse_button_action(int mode){ char cmd[2] = { 0x07, mode }; ikbd_write(cmd, 2);}/* Set relative mouse position reporting */void ikbd_mouse_rel_pos(void){ static const char cmd[1] = { 0x08 }; ikbd_write(cmd, 1);}/* Set absolute mouse position reporting */void ikbd_mouse_abs_pos(int xmax, int ymax){ char cmd[5] = { 0x09, xmax>>8, xmax&0xFF, ymax>>8, ymax&0xFF }; ikbd_write(cmd, 5);}/* Set mouse keycode mode */void ikbd_mouse_kbd_mode(int dx, int dy){ char cmd[3] = { 0x0A, dx, dy }; ikbd_write(cmd, 3);}/* Set mouse threshold */void ikbd_mouse_thresh(int x, int y){ char cmd[3] = { 0x0B, x, y }; ikbd_write(cmd, 3);}/* Set mouse scale */void ikbd_mouse_scale(int x, int y){ char cmd[3] = { 0x0C, x, y }; ikbd_write(cmd, 3);}/* Interrogate mouse position */void ikbd_mouse_pos_get(int *x, int *y){ static const char cmd[1] = { 0x0D }; ikbd_write(cmd, 1); /* wait for returning bytes */}/* Load mouse position */void ikbd_mouse_pos_set(int x, int y){ char cmd[6] = { 0x0E, 0x00, x>>8, x&0xFF, y>>8, y&0xFF }; ikbd_write(cmd, 6);}/* Set Y=0 at bottom */void ikbd_mouse_y0_bot(void){ static const char cmd[1] = { 0x0F }; ikbd_write(cmd, 1);}/* Set Y=0 at top */void ikbd_mouse_y0_top(void){ static const char cmd[1] = { 0x10 }; ikbd_write(cmd, 1);}/* Resume */void ikbd_resume(void){ static const char cmd[1] = { 0x11 }; ikbd_write(cmd, 1);}/* Disable mouse */void ikbd_mouse_disable(void){ static const char cmd[1] = { 0x12 }; ikbd_write(cmd, 1);}/* Pause output */void ikbd_pause(void){ static const char cmd[1] = { 0x13 }; ikbd_write(cmd, 1);}/* Set joystick event reporting */void ikbd_joystick_event_on(void){ static const char cmd[1] = { 0x14 }; ikbd_write(cmd, 1);}/* Set joystick interrogation mode */void ikbd_joystick_event_off(void){ static const char cmd[1] = { 0x15 }; ikbd_write(cmd, 1);}/* Joystick interrogation */void ikbd_joystick_get_state(void){ static const char cmd[1] = { 0x16 }; ikbd_write(cmd, 1);}#if 0/* This disables all other ikbd activities !!!! *//* Set joystick monitoring */void ikbd_joystick_monitor(int rate){ static const char cmd[2] = { 0x17, rate }; ikbd_write(cmd, 2); kb_state.state = JOYSTICK_MONITOR;}#endif/* some joystick routines not in yet (0x18-0x19) *//* Disable joysticks */void ikbd_joystick_disable(void){ static const char cmd[1] = { 0x1A }; ikbd_write(cmd, 1);}/* Time-of-day clock set */void ikbd_clock_set(int year, int month, int day, int hour, int minute, int second){ char cmd[7] = { 0x1B, year, month, day, hour, minute, second }; ikbd_write(cmd, 7);}/* Interrogate time-of-day clock */void ikbd_clock_get(int *year, int *month, int *day, int *hour, int *minute, int second){ static const char cmd[1] = { 0x1C }; ikbd_write(cmd, 1);}/* Memory load */void ikbd_mem_write(int address, int size, char *data){ panic("Attempt to write data into keyboard memory");}/* Memory read */void ikbd_mem_read(int address, char data[6]){ char cmd[3] = { 0x21, address>>8, address&0xFF }; ikbd_write(cmd, 3); /* receive data and put it in data */}/* Controller execute */void ikbd_exec(int address){ char cmd[3] = { 0x22, address>>8, address&0xFF }; ikbd_write(cmd, 3);}/* Status inquiries (0x87-0x9A) not yet implemented *//* Set the state of the caps lock led. */void atari_kbd_leds (unsigned int leds){ char cmd[6] = {32, 0, 4, 1, 254 + ((leds & 4) != 0), 0}; ikbd_write(cmd, 6);}/* * The original code sometimes left the interrupt line of * the ACIAs low forever. I hope, it is fixed now. * * Martin Rogge, 20 Aug 1995 */ int __init atari_keyb_init(void){ /* setup key map */ memcpy(key_maps[0], ataplain_map, sizeof(plain_map)); memcpy(key_maps[1], atashift_map, sizeof(plain_map)); memcpy(key_maps[4], atactrl_map, sizeof(plain_map)); memcpy(key_maps[5], atashift_ctrl_map, sizeof(plain_map)); memcpy(key_maps[8], ataalt_map, sizeof(plain_map)); /* Atari doesn't have an altgr_map, so we can reuse its memory for atashift_alt_map */ memcpy(key_maps[2], atashift_alt_map, sizeof(plain_map)); key_maps[9] = key_maps[2]; key_maps[2] = 0; /* ataaltgr_map */ memcpy(key_maps[12], atactrl_alt_map, sizeof(plain_map)); key_maps[13] = atashift_ctrl_alt_map; keymap_count = 8; /* say that we don't have an AltGr key */ keyboard_type = KB_84; kb_state.state = KEYBOARD; kb_state.len = 0; request_irq(IRQ_MFP_ACIA, keyboard_interrupt, IRQ_TYPE_SLOW, "keyboard/mouse/MIDI", keyboard_interrupt); atari_turnoff_irq(IRQ_MFP_ACIA); do { /* reset IKBD ACIA */ acia.key_ctrl = ACIA_RESET | (atari_switches & ATARI_SWITCH_IKBD) ? ACIA_RHTID : 0; (void)acia.key_ctrl; (void)acia.key_data; /* reset MIDI ACIA */ acia.mid_ctrl = ACIA_RESET | (atari_switches & ATARI_SWITCH_MIDI) ? ACIA_RHTID : 0; (void)acia.mid_ctrl; (void)acia.mid_data; /* divide 500kHz by 64 gives 7812.5 baud */ /* 8 data no parity 1 start 1 stop bit */ /* receive interrupt enabled */ /* RTS low (except if switch selected), transmit interrupt disabled */ acia.key_ctrl = (ACIA_DIV64|ACIA_D8N1S|ACIA_RIE) | ((atari_switches & ATARI_SWITCH_IKBD) ? ACIA_RHTID : ACIA_RLTID); acia.mid_ctrl = ACIA_DIV16 | ACIA_D8N1S | (atari_switches & ATARI_SWITCH_MIDI) ? ACIA_RHTID : 0; } /* make sure the interrupt line is up */ while ((mfp.par_dt_reg & 0x10) == 0); /* enable ACIA Interrupts */ mfp.active_edge &= ~0x10; atari_turnon_irq(IRQ_MFP_ACIA); ikbd_self_test = 1; ikbd_reset(); /* wait for a period of inactivity (here: 0.25s), then assume the IKBD's * self-test is finished */ self_test_last_rcv = jiffies; while (time_before(jiffies, self_test_last_rcv + HZ/4)) barrier(); /* if not incremented: no 0xf1 received */ if (ikbd_self_test == 1) printk( KERN_ERR "WARNING: keyboard self test failed!\n" ); ikbd_self_test = 0; ikbd_mouse_disable(); ikbd_joystick_disable(); atari_joystick_init(); return 0;}int atari_kbdrate( struct kbd_repeat *k ){ if (k->delay > 0) { /* convert from msec to jiffies */ key_repeat_delay = (k->delay * HZ + 500) / 1000; if (key_repeat_delay < 1) key_repeat_delay = 1; } if (k->rate > 0) { key_repeat_rate = (k->rate * HZ + 500) / 1000; if (key_repeat_rate < 1) key_repeat_rate = 1; } k->delay = key_repeat_delay * 1000 / HZ; k->rate = key_repeat_rate * 1000 / HZ; return( 0 );}int atari_kbd_translate(unsigned char keycode, unsigned char *keycodep, char raw_mode){#ifdef CONFIG_MAGIC_SYSRQ /* ALT+HELP pressed? */ if ((keycode == 98) && ((shift_state & 0xff) == 8)) *keycodep = 0xff; else#endif *keycodep = keycode; return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -