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

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

?? libps2.c

?? QQ2440板子
?? C
字號:
/* * PS/2 driver library * * Copyright (c) 1999-2002 Vojtech Pavlik * Copyright (c) 2004 Dmitry Torokhov *//* * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published by * the Free Software Foundation. */#include <linux/delay.h>#include <linux/module.h>#include <linux/moduleparam.h>#include <linux/slab.h>#include <linux/interrupt.h>#include <linux/input.h>#include <linux/serio.h>#include <linux/init.h>#include <linux/libps2.h>#define DRIVER_DESC	"PS/2 driver library"MODULE_AUTHOR("Dmitry Torokhov <dtor@mail.ru>");MODULE_DESCRIPTION("PS/2 driver library");MODULE_LICENSE("GPL");EXPORT_SYMBOL(ps2_init);EXPORT_SYMBOL(ps2_sendbyte);EXPORT_SYMBOL(ps2_drain);EXPORT_SYMBOL(ps2_command);EXPORT_SYMBOL(ps2_schedule_command);EXPORT_SYMBOL(ps2_handle_ack);EXPORT_SYMBOL(ps2_handle_response);EXPORT_SYMBOL(ps2_cmd_aborted);/* Work structure to schedule execution of a command */struct ps2work {	struct work_struct work;	struct ps2dev *ps2dev;	int command;	unsigned char param[0];};/* * ps2_sendbyte() sends a byte to the device and waits for acknowledge. * It doesn't handle retransmission, though it could - because if there * is a need for retransmissions device has to be replaced anyway. * * ps2_sendbyte() can only be called from a process context. */int ps2_sendbyte(struct ps2dev *ps2dev, unsigned char byte, int timeout){	serio_pause_rx(ps2dev->serio);	ps2dev->nak = 1;	ps2dev->flags |= PS2_FLAG_ACK;	serio_continue_rx(ps2dev->serio);	if (serio_write(ps2dev->serio, byte) == 0)		wait_event_timeout(ps2dev->wait,				   !(ps2dev->flags & PS2_FLAG_ACK),				   msecs_to_jiffies(timeout));	serio_pause_rx(ps2dev->serio);	ps2dev->flags &= ~PS2_FLAG_ACK;	serio_continue_rx(ps2dev->serio);	return -ps2dev->nak;}/* * ps2_drain() waits for device to transmit requested number of bytes * and discards them. */void ps2_drain(struct ps2dev *ps2dev, int maxbytes, int timeout){	if (maxbytes > sizeof(ps2dev->cmdbuf)) {		WARN_ON(1);		maxbytes = sizeof(ps2dev->cmdbuf);	}	down(&ps2dev->cmd_sem);	serio_pause_rx(ps2dev->serio);	ps2dev->flags = PS2_FLAG_CMD;	ps2dev->cmdcnt = maxbytes;	serio_continue_rx(ps2dev->serio);	wait_event_timeout(ps2dev->wait,			   !(ps2dev->flags & PS2_FLAG_CMD),			   msecs_to_jiffies(timeout));	up(&ps2dev->cmd_sem);}/* * ps2_is_keyboard_id() checks received ID byte against the list of * known keyboard IDs. */static inline int ps2_is_keyboard_id(char id_byte){	static char keyboard_ids[] = {		0xab,	/* Regular keyboards		*/		0xac,	/* NCD Sun keyboard		*/		0x2b,	/* Trust keyboard, translated	*/		0x5d,	/* Trust keyboard		*/		0x60,	/* NMB SGI keyboard, translated */		0x47,	/* NMB SGI keyboard		*/	};	return memchr(keyboard_ids, id_byte, sizeof(keyboard_ids)) != NULL;}/* * ps2_adjust_timeout() is called after receiving 1st byte of command * response and tries to reduce remaining timeout to speed up command * completion. */static int ps2_adjust_timeout(struct ps2dev *ps2dev, int command, int timeout){	switch (command) {		case PS2_CMD_RESET_BAT:			/*			 * Device has sent the first response byte after			 * reset command, reset is thus done, so we can			 * shorten the timeout.			 * The next byte will come soon (keyboard) or not			 * at all (mouse).			 */			if (timeout > msecs_to_jiffies(100))				timeout = msecs_to_jiffies(100);			break;		case PS2_CMD_GETID:			/*			 * If device behind the port is not a keyboard there			 * won't be 2nd byte of ID response.			 */			if (!ps2_is_keyboard_id(ps2dev->cmdbuf[1])) {				serio_pause_rx(ps2dev->serio);				ps2dev->flags = ps2dev->cmdcnt = 0;				serio_continue_rx(ps2dev->serio);				timeout = 0;			}			break;		default:			break;	}	return timeout;}/* * ps2_command() sends a command and its parameters to the mouse, * then waits for the response and puts it in the param array. * * ps2_command() can only be called from a process context */int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command){	int timeout;	int send = (command >> 12) & 0xf;	int receive = (command >> 8) & 0xf;	int rc = -1;	int i;	if (receive > sizeof(ps2dev->cmdbuf)) {		WARN_ON(1);		return -1;	}	down(&ps2dev->cmd_sem);	serio_pause_rx(ps2dev->serio);	ps2dev->flags = command == PS2_CMD_GETID ? PS2_FLAG_WAITID : 0;	ps2dev->cmdcnt = receive;	if (receive && param)		for (i = 0; i < receive; i++)			ps2dev->cmdbuf[(receive - 1) - i] = param[i];	serio_continue_rx(ps2dev->serio);	/*	 * Some devices (Synaptics) peform the reset before	 * ACKing the reset command, and so it can take a long	 * time before the ACK arrrives.	 */	if (ps2_sendbyte(ps2dev, command & 0xff,			 command == PS2_CMD_RESET_BAT ? 1000 : 200))		goto out;	for (i = 0; i < send; i++)		if (ps2_sendbyte(ps2dev, param[i], 200))			goto out;	/*	 * The reset command takes a long time to execute.	 */	timeout = msecs_to_jiffies(command == PS2_CMD_RESET_BAT ? 4000 : 500);	timeout = wait_event_timeout(ps2dev->wait,				     !(ps2dev->flags & PS2_FLAG_CMD1), timeout);	if (ps2dev->cmdcnt && timeout > 0) {		timeout = ps2_adjust_timeout(ps2dev, command, timeout);		wait_event_timeout(ps2dev->wait,				   !(ps2dev->flags & PS2_FLAG_CMD), timeout);	}	if (param)		for (i = 0; i < receive; i++)			param[i] = ps2dev->cmdbuf[(receive - 1) - i];	if (ps2dev->cmdcnt && (command != PS2_CMD_RESET_BAT || ps2dev->cmdcnt != 1))		goto out;	rc = 0; out:	serio_pause_rx(ps2dev->serio);	ps2dev->flags = 0;	serio_continue_rx(ps2dev->serio);	up(&ps2dev->cmd_sem);	return rc;}/* * ps2_execute_scheduled_command() sends a command, previously scheduled by * ps2_schedule_command(), to a PS/2 device (keyboard, mouse, etc.) */static void ps2_execute_scheduled_command(void *data){	struct ps2work *ps2work = data;	ps2_command(ps2work->ps2dev, ps2work->param, ps2work->command);	kfree(ps2work);}/* * ps2_schedule_command() allows to schedule delayed execution of a PS/2 * command and can be used to issue a command from an interrupt or softirq * context. */int ps2_schedule_command(struct ps2dev *ps2dev, unsigned char *param, int command){	struct ps2work *ps2work;	int send = (command >> 12) & 0xf;	int receive = (command >> 8) & 0xf;	if (!(ps2work = kmalloc(sizeof(struct ps2work) + max(send, receive), GFP_ATOMIC)))		return -1;	memset(ps2work, 0, sizeof(struct ps2work));	ps2work->ps2dev = ps2dev;	ps2work->command = command;	memcpy(ps2work->param, param, send);	INIT_WORK(&ps2work->work, ps2_execute_scheduled_command, ps2work);	if (!schedule_work(&ps2work->work)) {		kfree(ps2work);		return -1;	}	return 0;}/* * ps2_init() initializes ps2dev structure */void ps2_init(struct ps2dev *ps2dev, struct serio *serio){	init_MUTEX(&ps2dev->cmd_sem);	init_waitqueue_head(&ps2dev->wait);	ps2dev->serio = serio;}/* * ps2_handle_ack() is supposed to be used in interrupt handler * to properly process ACK/NAK of a command from a PS/2 device. */int ps2_handle_ack(struct ps2dev *ps2dev, unsigned char data){	switch (data) {		case PS2_RET_ACK:			ps2dev->nak = 0;			break;		case PS2_RET_NAK:			ps2dev->nak = 1;			break;		/*		 * Workaround for mice which don't ACK the Get ID command.		 * These are valid mouse IDs that we recognize.		 */		case 0x00:		case 0x03:		case 0x04:			if (ps2dev->flags & PS2_FLAG_WAITID) {				ps2dev->nak = 0;				break;			}			/* Fall through */		default:			return 0;	}	if (!ps2dev->nak && ps2dev->cmdcnt)		ps2dev->flags |= PS2_FLAG_CMD | PS2_FLAG_CMD1;	ps2dev->flags &= ~PS2_FLAG_ACK;	wake_up(&ps2dev->wait);	if (data != PS2_RET_ACK)		ps2_handle_response(ps2dev, data);	return 1;}/* * ps2_handle_response() is supposed to be used in interrupt handler * to properly store device's response to a command and notify process * waiting for completion of the command. */int ps2_handle_response(struct ps2dev *ps2dev, unsigned char data){	if (ps2dev->cmdcnt)		ps2dev->cmdbuf[--ps2dev->cmdcnt] = data;	if (ps2dev->flags & PS2_FLAG_CMD1) {		ps2dev->flags &= ~PS2_FLAG_CMD1;		if (ps2dev->cmdcnt)			wake_up(&ps2dev->wait);	}	if (!ps2dev->cmdcnt) {		ps2dev->flags &= ~PS2_FLAG_CMD;		wake_up(&ps2dev->wait);	}	return 1;}void ps2_cmd_aborted(struct ps2dev *ps2dev){	if (ps2dev->flags & PS2_FLAG_ACK)		ps2dev->nak = 1;	if (ps2dev->flags & (PS2_FLAG_ACK | PS2_FLAG_CMD))		wake_up(&ps2dev->wait);	ps2dev->flags = 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产女主播一区| 日韩高清欧美激情| 欧美性色黄大片手机版| 亚洲第一福利视频在线| 欧美一区二区三区在线| 精品亚洲国内自在自线福利| 久久久久99精品国产片| 成人黄色综合网站| 日韩一区欧美小说| 欧美性感一类影片在线播放| 热久久国产精品| 国产欧美日韩久久| 91麻豆免费在线观看| 三级在线观看一区二区| 久久久噜噜噜久久中文字幕色伊伊| 国产大陆a不卡| 亚洲愉拍自拍另类高清精品| 日韩欧美色综合| 成a人片亚洲日本久久| 亚洲一区二区av在线| 91麻豆精品国产91久久久久 | 色婷婷综合五月| 视频一区二区国产| 国产日韩欧美a| 欧美视频你懂的| 韩国av一区二区| 亚洲精品日日夜夜| 日韩欧美电影一区| 91色乱码一区二区三区| 日韩成人午夜精品| 欧美高清在线一区| 制服丝袜亚洲精品中文字幕| 国产成人精品免费一区二区| 亚洲一区二区四区蜜桃| 久久噜噜亚洲综合| 欧美性做爰猛烈叫床潮| 国产精品夜夜嗨| 亚洲一区免费视频| 国产日韩三级在线| 欧美日韩高清一区二区三区| 成人综合在线观看| 水蜜桃久久夜色精品一区的特点| 国产午夜精品福利| 欧美精品电影在线播放| www.日韩大片| 美女视频黄a大片欧美| 亚洲欧美欧美一区二区三区| 精品欧美久久久| 91丝袜呻吟高潮美腿白嫩在线观看| 日韩在线播放一区二区| 国产精品传媒在线| 精品少妇一区二区三区视频免付费 | 中文字幕在线一区免费| 日韩午夜精品视频| 色狠狠av一区二区三区| 国产成人aaa| 麻豆成人av在线| 亚洲一区影音先锋| 国产精品福利影院| 久久新电视剧免费观看| 欧美人妇做爰xxxⅹ性高电影 | 国产精品一区二区男女羞羞无遮挡| 一级做a爱片久久| 欧美激情在线一区二区| 日韩一区二区电影网| 色综合亚洲欧洲| 国产 欧美在线| 蜜臀久久99精品久久久久久9| 亚洲免费毛片网站| 欧美激情中文字幕一区二区| 日韩美女一区二区三区| 欧美日韩国产片| 色欧美乱欧美15图片| 成人综合婷婷国产精品久久免费| 美女视频黄a大片欧美| 午夜精品福利一区二区三区蜜桃| 2023国产精华国产精品| 欧美一区二区成人6969| 欧美日韩电影在线播放| 欧美性猛交xxxx黑人交| 一本大道久久a久久精二百| 成人av网址在线观看| 国产精品一区二区你懂的| 久久黄色级2电影| 日韩在线卡一卡二| 图片区小说区国产精品视频| 亚洲综合一区二区| 一区二区三区日本| 亚洲三级视频在线观看| 国产精品灌醉下药二区| 国产精品激情偷乱一区二区∴| 久久久精品2019中文字幕之3| 精品免费一区二区三区| 日韩精品一区二区在线| 日韩丝袜美女视频| 日韩午夜中文字幕| 日韩欧美一级二级三级久久久| 91精品国产乱| 日韩欧美电影一区| 精品久久久久一区| 久久综合色8888| 久久精品一区二区三区av| 久久久777精品电影网影网| 精品国产伦一区二区三区观看体验 | 久久超碰97中文字幕| 日本女人一区二区三区| 美女一区二区三区在线观看| 蜜臂av日日欢夜夜爽一区| 久久99久久久久久久久久久| 久久国产精品色婷婷| 国产制服丝袜一区| 国产乱淫av一区二区三区| 国产v综合v亚洲欧| a在线欧美一区| 色系网站成人免费| 欧美日韩视频专区在线播放| 在线综合亚洲欧美在线视频| 欧美刺激脚交jootjob| 欧美精品一区二区三区蜜桃 | 久久精品久久99精品久久| 久久福利视频一区二区| 国产精品亚洲视频| www.欧美.com| 欧美丝袜丝交足nylons| 欧美精品久久久久久久久老牛影院| 日韩一级在线观看| 久久香蕉国产线看观看99| 国产精品天天看| 亚洲男人都懂的| 亚洲 欧美综合在线网络| 蜜桃视频在线观看一区二区| 国产一区二区三区香蕉| 成人av一区二区三区| 欧美探花视频资源| 日韩一级免费一区| 国产欧美视频一区二区| 亚洲精品一二三区| 日韩精品欧美成人高清一区二区| 精品一区二区综合| 99视频精品在线| 6080午夜不卡| 国产日产欧产精品推荐色 | www.久久精品| 欧美日韩精品一区二区天天拍小说 | 欧美变态tickle挠乳网站| 国产日韩视频一区二区三区| 亚洲精品国产一区二区精华液 | 欧美亚洲动漫精品| 精品成人私密视频| 亚洲激情校园春色| 免费观看30秒视频久久| 成人午夜免费电影| 精品婷婷伊人一区三区三| 久久影院电视剧免费观看| 最近中文字幕一区二区三区| 天天影视网天天综合色在线播放| 看电影不卡的网站| 国产成人三级在线观看| 91久久精品国产91性色tv| 日韩欧美成人一区| 亚洲天堂免费看| 免费成人性网站| 北条麻妃国产九九精品视频| 337p亚洲精品色噜噜| 国产精品高潮呻吟| 亚洲成人1区2区| 国产精品一区免费视频| 欧美性xxxxx极品少妇| 久久这里只有精品首页| 一区二区三区四区在线播放| 久久99国产精品成人| 色婷婷av久久久久久久| 久久亚洲精品小早川怜子| 亚洲一区二区精品久久av| 国产成人精品三级麻豆| 欧美精品视频www在线观看| 中文文精品字幕一区二区| 无码av中文一区二区三区桃花岛| 丰满亚洲少妇av| 日韩欧美成人一区二区| 伊人一区二区三区| 国产乱码精品一区二区三| 欧美日韩高清在线播放| 国产精品天美传媒| 免费观看在线综合色| 在线观看区一区二| 国产精品乱人伦一区二区| 日本欧美一区二区三区| 色94色欧美sute亚洲线路一久 | 成人精品视频网站| 日韩三级视频在线看| 亚洲精品视频在线观看网站| 国产一区不卡在线| 宅男在线国产精品| 一区二区三区在线免费播放| 成人一区二区三区视频在线观看| 精品欧美一区二区三区精品久久 | 欧美一三区三区四区免费在线看| 亚洲视频一区在线观看| 国产经典欧美精品|