atakeyb.c

来自「linux 内核源代码」· C语言 代码 · 共 647 行 · 第 1/2 页

C
647
字号
{	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);}EXPORT_SYMBOL(ikbd_mouse_rel_pos);/* 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);}EXPORT_SYMBOL(ikbd_mouse_thresh);/* 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);}EXPORT_SYMBOL(ikbd_mouse_y0_top);/* 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);}EXPORT_SYMBOL(ikbd_mouse_disable);/* 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 */static int atari_keyb_done = 0;int atari_keyb_init(void){	if (atari_keyb_done)		return 0;	kb_state.state = KEYBOARD;	kb_state.len = 0;	request_irq(IRQ_MFP_ACIA, atari_keyboard_interrupt, IRQ_TYPE_SLOW,		    "keyboard/mouse/MIDI", atari_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();#ifdef FIXED_ATARI_JOYSTICK	atari_joystick_init();#endif	// flag init done	atari_keyb_done = 1;	return 0;}EXPORT_SYMBOL_GPL(atari_keyb_init);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 + =
减小字号Ctrl + -
显示快捷键?