亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ps2_kbd_mouse.c

?? linux下S3C2410的I2C總線的驅動
?? C
?? 第 1 頁 / 共 2 頁
字號:
		do{			ack=0;			mega8_PS20_Send(data);			mega8_PS20_WaitData(&ack, KBD_TIMEOUT);			if(KBD_REPLY_RESEND==ack){				sleep(HZ/5);				continue;			}			if(KBD_REPLY_ACK==ack)				break;		}while(retries-->0);				PS20_CLR_WAITING();	}	else if(ps2n==1){	//for ps2-1		PS21_SET_WAITING();		do{			ack=0;			mega8_PS21_Send(data);			mega8_PS21_WaitData(&ack, KBD_TIMEOUT);			if(KBD_REPLY_RESEND==ack){				sleep(HZ/5);				continue;			}			if(KBD_REPLY_ACK==ack)				break;		}while(retries-->0);				PS21_CLR_WAITING();	}	spin_unlock_irqrestore(&ps_controller_lock[ps2n], flags);	if(retries==-1){		printk("ps/2 port=%d send failed!, ack=0x%x, data=0x%x\n", ps2n, ack,data);		return -1;	}	sleep(HZ/5);	return 0;}typedef struct{	wait_queue_head_t wait;	unsigned char data;	int exit;}KbdLedCtrl;static KbdLedCtrl ledctrl;static inline void Ps2_Set_KeyboardLed(int ps2n, unsigned char led){	PS2DPRINTK("begin set led done\n");	if ((send_data(ps2n, KBD_CMD_SET_LEDS)<0 || send_data(ps2n, led)<0)) {		PS2DPRINTK("Set led failed!\n");		send_data(ps2n, KBD_CMD_ENABLE);	/* re-enable kbd if any errors */	}	PS2DPRINTK("Set led done\n");}static int Ps2_Kbdled_sendthread(void* ps2n){	init_waitqueue_head(&ledctrl.wait);	ledctrl.exit=0;	for(;;){		interruptible_sleep_on(&ledctrl.wait);		if(ledctrl.exit==1){ //stop this thread			PS2DPRINTK("Ps2_Kbdled_sendthread release!\n");			return 0;		}		sleep(HZ/5);		Ps2_Set_KeyboardLed((int)ps2n, ledctrl.data);	}	return 0;}static void  Ps2_Kbd_leds(unsigned char leds){	PS2DPRINTK("Set led = 0x%x\n", leds);	ledctrl.data=leds;	wake_up_interruptible(&ledctrl.wait);}static ps2_handle_event  __init Ps2_kbd_init_hw(int ps2n){	int i;	static int once=0;	if(once){		printk("I2c-PS/2: can't support two keyboard\n");		return NULL;	}	once++;	//initialization keyboard map	memset(Sc2_Sc1_Map, 0, sizeof(Sc2_Sc1_Map));	memset(Sc2_Sc1_MapE0, 0, sizeof(Sc2_Sc1_MapE0));	for(i=0; i<sizeof(Make_Sc2Sc1_Map)/sizeof(*Make_Sc2Sc1_Map); i++){		Sc2_Sc1_Map[Make_Sc2Sc1_Map[i].Scancode2]=Make_Sc2Sc1_Map[i].Scancode1;	}	for(i=0; i<sizeof(Make_Sc2Sc1_MapE0)/sizeof(*Make_Sc2Sc1_MapE0); i++){		Sc2_Sc1_MapE0[Make_Sc2Sc1_MapE0[i].Scancode2]=Make_Sc2Sc1_MapE0[i].Scancode1;	}	kernel_thread(Ps2_Kbdled_sendthread, (void*)ps2n, CLONE_FS | CLONE_FILES | CLONE_SIGHAND);	k_setkeycode	=  Ps2_Kbd_setkeycode;	k_getkeycode	=  Ps2_Kbd_getkeycode;	k_translate	=  Ps2_Kbd_translate;	k_unexpected_up	=  Ps2_Kbd_unexpected_up;	k_leds		=  Ps2_Kbd_leds;#ifdef CONFIG_MAGIC_SYSRQ	k_sysrq_xlate	=  Ps2_Kbd_sysrq_xlate;	k_sysrq_key	= 0x54;#endif	//sync keyboard led	Ps2_Set_KeyboardLed(ps2n, getledstate());		return handle_PS2kbd_event;}static void Ps2_kbd_release(void){	ledctrl.exit=1;	wake_up_interruptible(&ledctrl.wait);	sleep(HZ/2);}//////////////////////////////////PS/2 mouse//////////////////////////////////* *	PS/2 Auxiliary Device */static int __init psaux_init(void);#define AUX_RECONNECT1 0xaa	/* scancode1 when ps2 device is plugged (back) in */#define AUX_RECONNECT2 0x00	/* scancode2 when ps2 device is plugged (back) in */ static struct aux_queue *queue;	/* Mouse data buffer. */static int aux_count;static int ps2port;#define AUX_INTS_OFF (KBD_MODE_KCC | KBD_MODE_DISABLE_MOUSE | KBD_MODE_SYS | KBD_MODE_KBD_INT)#define AUX_INTS_ON  (KBD_MODE_KCC | KBD_MODE_SYS | KBD_MODE_MOUSE_INT | KBD_MODE_KBD_INT)#define MAX_RETRIES	60		/* some aux operations take long time*/static inline void handle_mouse_event(int ps2n, unsigned char scancode){	add_mouse_randomness((__u32)scancode);	if (aux_count) {		int head = queue->head;		queue->buf[head] = scancode;		head = (head + 1) & (AUX_BUF_SIZE - 1);		if (head != queue->tail) {			queue->head = head;			if (queue->fasync)				kill_fasync(&queue->fasync, SIGIO, POLL_IN);			wake_up_interruptible(&queue->proc_list);		}	}}static inline void handle_PS2mouse_event(int ps2n, unsigned char data){	handle_mouse_event(ps2n, data);}/* * Send a byte to the mouse. */static void aux_write_dev(int ps2n, int val){	unsigned long flags;	DPRINTK("aux write: val=0x%x",val);	spin_lock_irqsave(&ps_controller_lock[ps2n], flags);	if(ps2n==0)		mega8_PS20_Send(val);	else if(ps2n==1)	//for ps2-1		mega8_PS21_Send(val);	sleep(HZ/5);	spin_unlock_irqrestore(&ps_controller_lock[ps2n], flags);}/* * Send a byte to the mouse & handle returned ack */static void aux_write_ack(int ps2n, unsigned char val){	unsigned char data;	unsigned long flags;	spin_lock_irqsave(&ps_controller_lock[ps2n], flags);	if(ps2n==0){			PS20_SET_WAITING();		mega8_PS20_Send(val);		mega8_PS20_WaitData(&data, MOUSE_TIMEOUT);		PS20_CLR_WAITING();	}	else if(ps2n==1){	//for ps2-1		PS21_SET_WAITING();		mega8_PS21_Send(val);		mega8_PS21_WaitData(&data, MOUSE_TIMEOUT);		PS21_CLR_WAITING();	}	spin_unlock_irqrestore(&ps_controller_lock[ps2n], flags);}static unsigned char get_from_queue(int ps2n){	unsigned char result;	unsigned long flags;	spin_lock_irqsave(&ps_controller_lock[ps2n], flags);	result = queue->buf[queue->tail];	queue->tail = (queue->tail + 1) & (AUX_BUF_SIZE - 1);	spin_unlock_irqrestore(&ps_controller_lock[ps2n], flags);	return result;}static inline int queue_empty(void){	return queue->head == queue->tail;}static int fasync_aux(int fd, struct file *filp, int on){	int retval;	retval = fasync_helper(fd, filp, on, &queue->fasync);	if (retval < 0)		return retval;	return 0;}/* * Random magic cookie for the aux device */#define AUX_DEV ((void *)queue)static int release_aux(struct inode *inode, struct file *file){	fasync_aux(-1, file, 0);	if (--aux_count)		return 0;	aux_write_ack(ps2port, AUX_DISABLE_DEV);	/* Disable aux device */	if(ps2port==0)		mega8_device_release (DTYPE_PS2_0);	//release ps2	else if(ps2port==1)		mega8_device_release (DTYPE_PS2_1);	//release ps2	return 0;}/* * Install interrupt handler. * Enable auxiliary device. */static int open_aux(struct inode *inode, struct file *file){	if (aux_count++) {		return 0;	}	queue->head = queue->tail = 0;	/* Flush input queue */	if(ps2port==0)		mega8_device_request(DTYPE_PS2_0);	//release ps2	else if(ps2port==1)		mega8_device_request(DTYPE_PS2_1);	//release ps2	/* Enable the   auxiliary port on   controller. */	aux_write_ack(ps2port, AUX_ENABLE_DEV);	/* Enable aux device */	return 0;}/* * Put bytes from input queue to buffer. */static ssize_tread_aux(struct file *file, char *buffer, size_t count, loff_t * ppos){	DECLARE_WAITQUEUE(wait, current);	ssize_t i = count;	unsigned char c;	if (queue_empty()) {		if (file->f_flags & O_NONBLOCK)			return -EAGAIN;		add_wait_queue(&queue->proc_list, &wait);	      repeat:		set_current_state(TASK_INTERRUPTIBLE);		if (queue_empty() && !signal_pending(current)) {			schedule();			goto repeat;		}		current->state = TASK_RUNNING;		remove_wait_queue(&queue->proc_list, &wait);	}	while (i > 0 && !queue_empty()) {		c = get_from_queue(ps2port);		put_user(c, buffer++);		i--;	}	if (count - i) {		file->f_dentry->d_inode->i_atime = CURRENT_TIME;		return count - i;	}	if (signal_pending(current))		return -ERESTARTSYS;	return 0;}// Write to the aux device.static ssize_t write_aux(struct file *file, const char *buffer, size_t count, loff_t * ppos){	ssize_t retval = 0;	if (count) {		ssize_t written = 0;		if (count > 32)			count = 32;	/* Limit to 32 bytes. */		do {			char c;			get_user(c, buffer++);			aux_write_dev(ps2port, c);			written++;		}		while (--count);		retval = -EIO;		if (written) {			retval = written;			file->f_dentry->d_inode->i_mtime = CURRENT_TIME;		}	}	return retval;}static unsigned int aux_poll(struct file *file, poll_table * wait){	poll_wait(file, &queue->proc_list, wait);	if (!queue_empty())		return POLLIN | POLLRDNORM;	return 0;}struct file_operations psaux_fops = {	read:		read_aux,	write:		write_aux,	poll:		aux_poll,	open:		open_aux,	release:	release_aux,	fasync:		fasync_aux,};//Initialize driver.static struct miscdevice psaux_mouse = {	PSMOUSE_MINOR, "psaux", &psaux_fops,};static int __init psaux_init(void){	aux_count=0;		misc_register(&psaux_mouse);	queue = (struct aux_queue *) kmalloc(sizeof(*queue), GFP_KERNEL);	memset(queue, 0, sizeof(*queue));	queue->head = queue->tail = 0;	init_waitqueue_head(&queue->proc_list);	aux_write_ack(ps2port, AUX_SET_SAMPLE);	aux_write_ack(ps2port, 50);	/* 100 samples/sec */	aux_write_ack(ps2port, AUX_SET_RES);	aux_write_ack(ps2port, 3);	/* 8 counts per mm */	aux_write_ack(ps2port, AUX_SET_SCALE11);	/* 2:1 scaling */	return 0;}static ps2_handle_event  __init Ps2_Mouse_init_hw(int ps2n){	static int once=0;	if(once){		printk("I2c-PS/2: can't support two Mouse\n");		return NULL;	}	once++;	ps2port=ps2n;	psaux_init();	if(ps2n==0)		mega8_device_release (DTYPE_PS2_0);	//open port when open mouse device	else if(ps2n==1)		mega8_device_release (DTYPE_PS2_1);	//open port when open mouse device	else return NULL;	return handle_PS2mouse_event;}////////////////////////////////for PS/2 port0 ///////////////////////////////////////////////////////////////////for PS/2 port0 end////////////////////////////////

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人精品一区| 欧洲精品在线观看| 97aⅴ精品视频一二三区| 欧美一区二区三区免费视频| 国产精品视频第一区| 美女网站在线免费欧美精品| 99视频一区二区| 精品日本一线二线三线不卡| 亚洲 欧美综合在线网络| 成人免费高清视频| 欧美成va人片在线观看| 亚洲一区精品在线| 91丨porny丨首页| 欧美国产在线观看| 精品一区二区综合| 日韩午夜在线影院| 亚洲不卡av一区二区三区| 99re亚洲国产精品| 亚洲国产精品t66y| 国产又粗又猛又爽又黄91精品| 欧美人牲a欧美精品| 一区二区三区蜜桃网| 99国产精品国产精品久久| 国产香蕉久久精品综合网| 国精产品一区一区三区mba桃花| 欧美卡1卡2卡| 日韩**一区毛片| 7777精品伊人久久久大香线蕉的 | 国产美女一区二区| 日韩精品一区二区三区蜜臀| 日韩电影一二三区| 日韩一级高清毛片| 激情综合色播激情啊| 精品剧情v国产在线观看在线| 日韩国产在线一| 日韩欧美国产综合一区 | 精品久久久久久久久久久久久久久久久| 亚洲国产视频一区二区| 欧美视频日韩视频在线观看| 亚洲综合一区二区三区| 欧美久久一二三四区| 麻豆免费精品视频| 久久综合九色综合97婷婷女人| 国产一区二区在线电影| 欧美激情一区二区三区不卡| 成人晚上爱看视频| 亚洲精品免费在线观看| 欧美日韩国产首页| 韩国精品一区二区| 久久精品免视看| 色综合久久久网| 亚洲成人av一区| 日韩视频一区二区在线观看| 国产精品香蕉一区二区三区| 国产精品国产三级国产普通话三级| 99re8在线精品视频免费播放| 夜夜嗨av一区二区三区中文字幕| 91麻豆精品国产自产在线观看一区| 美国精品在线观看| 国产精品美女久久久久久久| 欧美三级三级三级爽爽爽| 久久成人免费日本黄色| 国产精品短视频| 欧美精品日韩一区| 成人av网址在线| 亚洲成人av福利| 亚洲国产精品黑人久久久| 欧美在线高清视频| 国产精品一区二区三区四区| 亚洲人成影院在线观看| 欧美一区二区三区在线| 91丨九色丨黑人外教| 精品中文字幕一区二区| 一区二区三区欧美在线观看| 2023国产精华国产精品| 91国模大尺度私拍在线视频| 麻豆成人av在线| 亚洲自拍偷拍麻豆| 国产日韩精品一区二区三区 | 欧美成人福利视频| 91小宝寻花一区二区三区| 麻豆精品国产传媒mv男同| 亚洲欧美区自拍先锋| 久久夜色精品国产噜噜av| 欧美日韩一区二区三区四区五区| 国产91丝袜在线观看| 奇米精品一区二区三区四区| 国产精品久久影院| 欧美精品一区二区三区在线播放| 欧洲人成人精品| 成人av网站大全| 国产剧情av麻豆香蕉精品| 日韩av一区二区三区| 夜夜爽夜夜爽精品视频| 日韩理论片中文av| 中文字幕av一区二区三区高| 精品久久久三级丝袜| 欧美精品1区2区| 精品视频在线免费| 91官网在线观看| 91在线精品秘密一区二区| 国产一区在线看| 久久精品国产精品亚洲综合| 婷婷久久综合九色国产成人| 最新国产成人在线观看| 国产精品女同一区二区三区| 精品国产免费人成电影在线观看四季| 欧美日韩一区不卡| 欧美伊人久久久久久久久影院| 波多野结衣中文字幕一区| 国产成人av在线影院| 麻豆精品在线观看| 久久电影网电视剧免费观看| 老司机精品视频一区二区三区| 日韩在线一二三区| 污片在线观看一区二区| 日韩精品成人一区二区三区| 午夜久久久影院| 亚瑟在线精品视频| 美国十次了思思久久精品导航| 免费不卡在线视频| 极品瑜伽女神91| 国产福利电影一区二区三区| 高清视频一区二区| 成人免费毛片嘿嘿连载视频| www.亚洲色图.com| 色婷婷久久99综合精品jk白丝| 欧洲一区在线电影| 日韩亚洲欧美中文三级| 精品盗摄一区二区三区| 欧美国产亚洲另类动漫| 日韩美女视频一区二区| 洋洋成人永久网站入口| 日韩在线卡一卡二| 国产老肥熟一区二区三区| 99riav久久精品riav| 欧美日韩中文国产| 日韩视频永久免费| 国产精品色哟哟| 亚洲一区在线观看网站| 精品一区二区三区在线观看| 国产精品一二二区| 91麻豆自制传媒国产之光| 欧美精品久久一区| 国产无一区二区| 一区二区三区欧美亚洲| 久久超碰97人人做人人爱| 国产 欧美在线| 欧美日韩国产小视频在线观看| 26uuu久久综合| 亚洲男人的天堂在线观看| 秋霞影院一区二区| 成人毛片视频在线观看| 欧美群妇大交群的观看方式 | 欧美一区二区三区公司| 国产欧美日韩亚州综合| 亚洲国产毛片aaaaa无费看 | 91色综合久久久久婷婷| 欧美日韩成人在线| 欧美激情在线免费观看| 日韩精品一卡二卡三卡四卡无卡| 国产乱子轮精品视频| 在线观看免费亚洲| 国产校园另类小说区| 日韩高清在线电影| 91女人视频在线观看| 日韩欧美色综合| 亚洲最大成人网4388xx| 国产福利不卡视频| 欧美一区欧美二区| 一区二区三区国产精华| 国产白丝网站精品污在线入口| 欧美精品久久久久久久多人混战 | 精品国产91洋老外米糕| 一区二区三区四区乱视频| 国产精品亚洲一区二区三区妖精| 欧美男男青年gay1069videost| 中文字幕乱码一区二区免费| 久久99深爱久久99精品| 欧美日韩大陆在线| 亚洲精品高清在线| 91影视在线播放| 国产拍揄自揄精品视频麻豆| 毛片av中文字幕一区二区| 欧美疯狂性受xxxxx喷水图片| 亚洲欧美区自拍先锋| 99久精品国产| 国产精品美女久久久久久2018| 国产精品自在在线| 精品99一区二区| 麻豆精品一二三| 日韩免费看的电影| 日韩国产精品久久| 91精品一区二区三区久久久久久 | 国产成人av影院| 欧美变态tickling挠脚心| 免费视频最近日韩| 欧美一级国产精品| 麻豆成人av在线| 久久中文娱乐网|