⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atakeyb.c

📁 这个linux源代码是很全面的~基本完整了~使用c编译的~由于时间问题我没有亲自测试~但就算用来做参考资料也是非常好的
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -