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

📄 dn_keyb.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
};static u_short dnctrl_alt_map[NR_KEYS] __initdata = {   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200,   0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200, 0xf200};#if 0static void debug_keyb_timer_handler(unsigned long ignored) {	unsigned long flags;	u_char *swap;	short length,i;	if (time_after(jiffies, debug_buffer_updated + 100)) {		save_flags(flags);		cli();		length=debug_buf_count;				swap=debug_buf;			debug_buf=shadow_buf;		shadow_buf=swap;		debug_buf_count=0;		debug_timer_running=0;		restore_flags(flags);		for(i=1;length;length--,i++)				printk("%02x%c",*(swap++), (i % 25) ? ' ' : '\n');		printk("\n");	}	else {		debug_keyb_timer.expires=jiffies+10;		add_timer(&debug_keyb_timer);	}}#endifstatic void dn_keyb_process_key_event(unsigned char scancode) {	static unsigned char lastscancode;	unsigned char prev_scancode=lastscancode;	static unsigned int lastkeypress;		lastscancode=scancode;	/*  printk("scan: %02x, lastscan: %02X, prev_scancode: %02X\n",scancode,lastscancode,prev_scancode); */	if(prev_scancode==APOLLO_KBD_MODE_CHANGE) {		kbd_mode=scancode;/*		printk("modechange: %d\n",scancode); */	}	else if((scancode & (~BREAK_FLAG)) == DNKEY_CAPS) {    	/* printk("handle_scancode: %02x\n",DNKEY_CAPS); */		handle_scancode(DNKEY_CAPS, 1);		/*    printk("handle_scancode: %02x\n",BREAK_FLAG | DNKEY_CAPS); */		handle_scancode(DNKEY_CAPS, 0);	}	else if( (scancode == DNKEY_REPEAT) && (prev_scancode < 0x7e) &&   			!(prev_scancode==DNKEY_CTRL || prev_scancode==DNKEY_LSHIFT ||       	   	prev_scancode==DNKEY_RSHIFT || prev_scancode==DNKEY_REPT ||       	  	prev_scancode==DNKEY_LALT || prev_scancode==DNKEY_RALT)) {			if (time_after(jiffies, lastkeypress + DNKEY_REPEAT_DELAY)) {			/*    	printk("handle_scancode: %02x\n",prev_scancode); */           			handle_scancode(prev_scancode, 1);			  	}	   			lastscancode=prev_scancode;  			}  	else {	/*    	printk("handle_scancode: %02x\n",scancode);  */   			handle_scancode(scancode & ~BREAK_FLAG, !(scancode & BREAK_FLAG));   			lastkeypress=jiffies;  	}}static void dn_keyb_process_mouse_event(unsigned char mouse_data) {	static short mouse_byte_count=0;	static u_char mouse_packet[3];	short mouse_buttons;		mouse_packet[mouse_byte_count++]=mouse_data;	if(mouse_byte_count==3) {		if(mouse_packet[0]==APOLLO_KBD_MODE_CHANGE) {			kbd_mode=mouse_packet[1];			mouse_byte_count=0;/*			printk("modechange: %d\n",mouse_packet[1]); */			if(kbd_mode==APOLLO_KBD_MODE_KEYB)				dn_keyb_process_key_event(mouse_packet[2]);		}						if((mouse_packet[0] & 0x8f) == 0x80) {			if(mouse_update_allowed) {				mouse_ready=1;				mouse_buttons=(mouse_packet[0] >> 4) & 0x7;				mouse_dx+=mouse_packet[1] == 0xff ? 0 : (signed char)mouse_packet[1];				mouse_dy+=mouse_packet[2] == 0xff ? 0 : (signed char)mouse_packet[2];				wake_up_interruptible(&mouse_wait);				if (mouse_dx < -2048)              				mouse_dx = -2048;          			else if (mouse_dx >  2048)              				mouse_dx =  2048;         	 		if (mouse_dy < -2048)              				mouse_dy = -2048;          			else if (mouse_dy >  2048)             			 	mouse_dy =  2048;              			kill_fasync(&mouse_fasyncptr, SIGIO, POLL_IN);			}			mouse_byte_count=0;/*			printk("mouse: %d, %d, %x\n",mouse_x,mouse_y,buttons); */		}	}}static void dn_keyb_int(int irq, void *dummy, struct pt_regs *fp) {	unsigned char data;  	unsigned long flags;  	int scn2681_ints;	do {		scn2681_ints=sio01.isr_imr & 3;		if(scn2681_ints & 2) {			data=sio01.rhra_thra;#if 0			if(debug_buf_count<4096) {				debug_buf[debug_buf_count++]=data;				debug_buffer_updated=jiffies;					if(!debug_timer_running) {					debug_keyb_timer.expires=jiffies+10;					add_timer(&debug_keyb_timer);					debug_timer_running=1;				}			}			else				debug_buf_overrun=1;#endif			if(sio01.sra_csra & 0x10) {				printk("whaa overrun !\n");				continue;			}			if(kbd_mode==APOLLO_KBD_MODE_KEYB)				dn_keyb_process_key_event(data);			else				dn_keyb_process_mouse_event(data);		}			if(scn2681_ints & 1) {			save_flags(flags);			cli();			if(keyb_cmd_write!=keyb_cmd_read) {				sio01.rhra_thra=keyb_cmds[keyb_cmd_read++];				if(keyb_cmd_read==APOLLO_KEYB_CMD_ENTRIES)					keyb_cmd_read=0;				keyb_cmd_transmit=1;			}			else {				keyb_cmd_transmit=0;				sio01.BRGtest_cra=9;			}			restore_flags(flags);		}	} while(scn2681_ints) ;}void write_keyb_cmd(u_short length, u_char *cmd) {  	unsigned long flags;	if((keyb_cmd_write==keyb_cmd_read) && keyb_cmd_transmit)		return;	save_flags(flags);	cli();	for(;length;length--) {		keyb_cmds[keyb_cmd_write++]=*(cmd++);		if(keyb_cmd_write==keyb_cmd_read)			return;		if(keyb_cmd_write==APOLLO_KEYB_CMD_ENTRIES)			keyb_cmd_write=0;	}	if(!keyb_cmd_transmit)  { 	   sio01.BRGtest_cra=5;	}	restore_flags(flags);}static struct busmouse apollo_mouse = {        APOLLO_MOUSE_MINOR, "apollomouse", THIS_MODULE, NULL, NULL, 7};int __init dn_keyb_init(void){/*  printk("dn_keyb_init\n"); */  memcpy(key_maps[0], dnplain_map, sizeof(plain_map));  memcpy(key_maps[1], dnshift_map, sizeof(plain_map));  memcpy(key_maps[2], dnaltgr_map, sizeof(plain_map));  memcpy(key_maps[4], dnctrl_map, sizeof(plain_map));  memcpy(key_maps[5], dnshift_ctrl_map, sizeof(plain_map));  memcpy(key_maps[8], dnalt_map, sizeof(plain_map));  memcpy(key_maps[12], dnctrl_alt_map, sizeof(plain_map));  msedev=register_busmouse(&apollo_mouse);  if (msedev < 0)      printk(KERN_WARNING "Unable to install Apollo mouse driver.\n");   else      printk(KERN_INFO "Apollo mouse installed.\n");  /* program UpDownMode */  while(!(sio01.sra_csra & 0x4));  sio01.rhra_thra=0xff;  while(!(sio01.sra_csra & 0x4));  sio01.rhra_thra=0x1;  request_irq(1, dn_keyb_int,0,NULL,NULL);    /* enable receive int on DUART */  sio01.isr_imr=3;  return 0;}int dn_dummy_kbdrate(struct kbd_repeat *k) {  printk("dn_dummy_kbdrate\n");  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -