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

📄 dn_keyb.c

📁 powerpc内核mpc8241linux系统下char驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
        return 0;}static ssize_t write_mouse(struct file * file, const char * buffer,			   size_t count, loff_t *ppos){        return -EINVAL;}static ssize_t read_mouse(struct file * file, char * buffer,			  size_t count, loff_t *ppos){	int dx,dy,r;	unsigned char buttons;	if (count < 3)		return -EINVAL;	if ((r = verify_area(VERIFY_WRITE, buffer, count)))   		return r;	if (!mouse_ready)		return -EAGAIN;		MSE_UPDATE_OFF();	dx=mouse_dx;		dy=mouse_dy;		if (dx < -127)		dx = -127;	else	if (dx > 127)   		dx = 127;	if (dy < -127)   		dy = -127;	else	if (dy > 127)   		dy = 127;	buttons=(mouse_buttons & 1 ? 4 : 0) |			(mouse_buttons & 2 ? 1 : 0) |			(mouse_buttons & 4 ? 2 : 0);	mouse_dx-=dx;	mouse_dy-=dy;	MSE_UPDATE_ON();	if (put_user(buttons | 0x80, buffer++) ||	    put_user((char)dx, buffer++) ||	    put_user((char)dy, buffer++))		return -EINVAL;	if (count > 3)		if (clear_user(buffer, count - 3))			return -EFAULT;	return count;}static int fasync_mouse(int fd, struct file *filp, int on){        int retval;        retval = fasync_helper(fd, filp, on, &mouse_fasyncptr);        if (retval < 0)                return retval;        return 0;}static int release_mouse(struct inode * inode, struct file * file){        fasync_mouse(-1, file, 0);        if (--mouse_active)                return 0;        MSE_UPDATE_OFF();        MOD_DEC_USE_COUNT;        return 0;}static int open_mouse(struct inode * inode, struct file * file){        if (mouse_active++)                return 0;        /*         *  use VBL to poll mouse deltas         */        mouse_dx = 0;        mouse_dy = 0;        mouse_buttons = 0;        mouse_active = 1;        MOD_INC_USE_COUNT;        MSE_UPDATE_ON();        return 0;}static 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);		/*    printk("handle_scancode: %02x\n",BREAK_FLAG | DNKEY_CAPS); */		handle_scancode(BREAK_FLAG | DNKEY_CAPS);	}	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(jiffies-lastkeypress > DNKEY_REPEAT_DELAY) {			/*    	printk("handle_scancode: %02x\n",prev_scancode); */           			handle_scancode(prev_scancode);			  	}	   			lastscancode=prev_scancode;  			}  	else {	/*    	printk("handle_scancode: %02x\n",scancode);  */   			handle_scancode(scancode);   			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];		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;				if (mouse_fasyncptr)              		kill_fasync(mouse_fasyncptr, SIGIO);			}			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) {					add_timer(&debug_keyb_timer);					debug_keyb_timer.expires=jiffies+10;					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);}struct file_operations apollo_mouse_fops = {        NULL,           /* mouse_seek */        read_mouse,        write_mouse,        NULL,           /* mouse_readdir */        mouse_poll,     /* mouse_poll */        NULL,           /* mouse_ioctl */        NULL,           /* mouse_mmap */        open_mouse,	NULL,		/* flush */        release_mouse,        NULL,        fasync_mouse,};static struct miscdevice apollo_mouse = {        APOLLO_MOUSE_MINOR, "apollomouse", &apollo_mouse_fops};__initfunc(int 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));  mouse_dx=0;   mouse_dy=0;   mouse_buttons=0;   mouse_wait=NULL;  misc_register(&apollo_mouse);  /* 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 + -