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

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

?? psmouse-base.c

?? Serial mouse driver for Linux
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * PS/2 mouse driver * * Copyright (c) 1999-2002 Vojtech Pavlik * Copyright (c) 2003-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>#include <linux/mutex.h>#include "psmouse.h"#include "synaptics.h"#include "logips2pp.h"#include "alps.h"#include "lifebook.h"#include "trackpoint.h"#define DRIVER_DESC	"PS/2 mouse driver"MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");MODULE_DESCRIPTION(DRIVER_DESC);MODULE_LICENSE("GPL");static unsigned int psmouse_max_proto = PSMOUSE_AUTO;static int psmouse_set_maxproto(const char *val, struct kernel_param *kp);static int psmouse_get_maxproto(char *buffer, struct kernel_param *kp);#define param_check_proto_abbrev(name, p)	__param_check(name, p, unsigned int)#define param_set_proto_abbrev			psmouse_set_maxproto#define param_get_proto_abbrev			psmouse_get_maxprotomodule_param_named(proto, psmouse_max_proto, proto_abbrev, 0644);MODULE_PARM_DESC(proto, "Highest protocol extension to probe (bare, imps, exps, any). Useful for KVM switches.");static unsigned int psmouse_resolution = 200;module_param_named(resolution, psmouse_resolution, uint, 0644);MODULE_PARM_DESC(resolution, "Resolution, in dpi.");static unsigned int psmouse_rate = 100;module_param_named(rate, psmouse_rate, uint, 0644);MODULE_PARM_DESC(rate, "Report rate, in reports per second.");static unsigned int psmouse_smartscroll = 1;module_param_named(smartscroll, psmouse_smartscroll, bool, 0644);MODULE_PARM_DESC(smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled.");static unsigned int psmouse_resetafter = 5;module_param_named(resetafter, psmouse_resetafter, uint, 0644);MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never).");static unsigned int psmouse_resync_time;module_param_named(resync_time, psmouse_resync_time, uint, 0644);MODULE_PARM_DESC(resync_time, "How long can mouse stay idle before forcing resync (in seconds, 0 = never).");PSMOUSE_DEFINE_ATTR(protocol, S_IWUSR | S_IRUGO,			NULL,			psmouse_attr_show_protocol, psmouse_attr_set_protocol);PSMOUSE_DEFINE_ATTR(rate, S_IWUSR | S_IRUGO,			(void *) offsetof(struct psmouse, rate),			psmouse_show_int_attr, psmouse_attr_set_rate);PSMOUSE_DEFINE_ATTR(resolution, S_IWUSR | S_IRUGO,			(void *) offsetof(struct psmouse, resolution),			psmouse_show_int_attr, psmouse_attr_set_resolution);PSMOUSE_DEFINE_ATTR(resetafter, S_IWUSR | S_IRUGO,			(void *) offsetof(struct psmouse, resetafter),			psmouse_show_int_attr, psmouse_set_int_attr);PSMOUSE_DEFINE_ATTR(resync_time, S_IWUSR | S_IRUGO,			(void *) offsetof(struct psmouse, resync_time),			psmouse_show_int_attr, psmouse_set_int_attr);static struct attribute *psmouse_attributes[] = {	&psmouse_attr_protocol.dattr.attr,	&psmouse_attr_rate.dattr.attr,	&psmouse_attr_resolution.dattr.attr,	&psmouse_attr_resetafter.dattr.attr,	&psmouse_attr_resync_time.dattr.attr,	NULL};static struct attribute_group psmouse_attribute_group = {	.attrs	= psmouse_attributes,};__obsolete_setup("psmouse_noext");__obsolete_setup("psmouse_resolution=");__obsolete_setup("psmouse_smartscroll=");__obsolete_setup("psmouse_resetafter=");__obsolete_setup("psmouse_rate=");/* * psmouse_mutex protects all operations changing state of mouse * (connecting, disconnecting, changing rate or resolution via * sysfs). We could use a per-device semaphore but since there * rarely more than one PS/2 mouse connected and since semaphore * is taken in "slow" paths it is not worth it. */static DEFINE_MUTEX(psmouse_mutex);static struct workqueue_struct *kpsmoused_wq;struct psmouse_protocol {	enum psmouse_type type;	const char *name;	const char *alias;	int maxproto;	int (*detect)(struct psmouse *, int);	int (*init)(struct psmouse *);};/* * psmouse_process_byte() analyzes the PS/2 data stream and reports * relevant events to the input module once full packet has arrived. */static psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse){	struct input_dev *dev = psmouse->dev;	unsigned char *packet = psmouse->packet;	if (psmouse->pktcnt < psmouse->pktsize)		return PSMOUSE_GOOD_DATA;/* * Full packet accumulated, process it *//* * Scroll wheel on IntelliMice, scroll buttons on NetMice */	if (psmouse->type == PSMOUSE_IMPS || psmouse->type == PSMOUSE_GENPS)		input_report_rel(dev, REL_WHEEL, -(signed char) packet[3]);/* * Scroll wheel and buttons on IntelliMouse Explorer */	if (psmouse->type == PSMOUSE_IMEX) {		switch (packet[3] & 0xC0) {			case 0x80: /* vertical scroll on IntelliMouse Explorer 4.0 */				input_report_rel(dev, REL_WHEEL, (int) (packet[3] & 32) - (int) (packet[3] & 31));				break;			case 0x40: /* horizontal scroll on IntelliMouse Explorer 4.0 */				input_report_rel(dev, REL_HWHEEL, (int) (packet[3] & 32) - (int) (packet[3] & 31));				break;			case 0x00:			case 0xC0:				input_report_rel(dev, REL_WHEEL, (int) (packet[3] & 8) - (int) (packet[3] & 7));				input_report_key(dev, BTN_SIDE, (packet[3] >> 4) & 1);				input_report_key(dev, BTN_EXTRA, (packet[3] >> 5) & 1);				break;		}	}/* * Extra buttons on Genius NewNet 3D */	if (psmouse->type == PSMOUSE_GENPS) {		input_report_key(dev, BTN_SIDE, (packet[0] >> 6) & 1);		input_report_key(dev, BTN_EXTRA, (packet[0] >> 7) & 1);	}/* * Extra button on ThinkingMouse */	if (psmouse->type == PSMOUSE_THINKPS) {		input_report_key(dev, BTN_EXTRA, (packet[0] >> 3) & 1);		/* Without this bit of weirdness moving up gives wildly high Y changes. */		packet[1] |= (packet[0] & 0x40) << 1;	}/* * Generic PS/2 Mouse */	input_report_key(dev, BTN_LEFT,    packet[0]       & 1);	input_report_key(dev, BTN_MIDDLE, (packet[0] >> 2) & 1);	input_report_key(dev, BTN_RIGHT,  (packet[0] >> 1) & 1);	input_report_rel(dev, REL_X, packet[1] ? (int) packet[1] - (int) ((packet[0] << 4) & 0x100) : 0);	input_report_rel(dev, REL_Y, packet[2] ? (int) ((packet[0] << 3) & 0x100) - (int) packet[2] : 0);	input_sync(dev);	return PSMOUSE_FULL_PACKET;}/* * __psmouse_set_state() sets new psmouse state and resets all flags. */static inline void __psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state){	psmouse->state = new_state;	psmouse->pktcnt = psmouse->out_of_sync = 0;	psmouse->ps2dev.flags = 0;	psmouse->last = jiffies;}/* * psmouse_set_state() sets new psmouse state and resets all flags and * counters while holding serio lock so fighting with interrupt handler * is not a concern. */static void psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state){	serio_pause_rx(psmouse->ps2dev.serio);	__psmouse_set_state(psmouse, new_state);	serio_continue_rx(psmouse->ps2dev.serio);}/* * psmouse_handle_byte() processes one byte of the input data stream * by calling corresponding protocol handler. */static int psmouse_handle_byte(struct psmouse *psmouse){	psmouse_ret_t rc = psmouse->protocol_handler(psmouse);	switch (rc) {		case PSMOUSE_BAD_DATA:			if (psmouse->state == PSMOUSE_ACTIVATED) {				printk(KERN_WARNING "psmouse.c: %s at %s lost sync at byte %d\n",					psmouse->name, psmouse->phys, psmouse->pktcnt);				if (++psmouse->out_of_sync == psmouse->resetafter) {					__psmouse_set_state(psmouse, PSMOUSE_IGNORE);					printk(KERN_NOTICE "psmouse.c: issuing reconnect request\n");					serio_reconnect(psmouse->ps2dev.serio);					return -1;				}			}			psmouse->pktcnt = 0;			break;		case PSMOUSE_FULL_PACKET:			psmouse->pktcnt = 0;			if (psmouse->out_of_sync) {				psmouse->out_of_sync = 0;				printk(KERN_NOTICE "psmouse.c: %s at %s - driver resynched.\n",					psmouse->name, psmouse->phys);			}			break;		case PSMOUSE_GOOD_DATA:			break;	}	return 0;}/* * psmouse_interrupt() handles incoming characters, either passing them * for normal processing or gathering them as command response. */static irqreturn_t psmouse_interrupt(struct serio *serio,		unsigned char data, unsigned int flags){	struct psmouse *psmouse = serio_get_drvdata(serio);	if (psmouse->state == PSMOUSE_IGNORE)		goto out;	if (flags & (SERIO_PARITY|SERIO_TIMEOUT)) {		if (psmouse->state == PSMOUSE_ACTIVATED)			printk(KERN_WARNING "psmouse.c: bad data from KBC -%s%s\n",				flags & SERIO_TIMEOUT ? " timeout" : "",				flags & SERIO_PARITY ? " bad parity" : "");		ps2_cmd_aborted(&psmouse->ps2dev);		goto out;	}	if (unlikely(psmouse->ps2dev.flags & PS2_FLAG_ACK))		if  (ps2_handle_ack(&psmouse->ps2dev, data))			goto out;	if (unlikely(psmouse->ps2dev.flags & PS2_FLAG_CMD))		if  (ps2_handle_response(&psmouse->ps2dev, data))			goto out;	if (psmouse->state <= PSMOUSE_RESYNCING)		goto out;	if (psmouse->state == PSMOUSE_ACTIVATED &&	    psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) {		printk(KERN_INFO "psmouse.c: %s at %s lost synchronization, throwing %d bytes away.\n",		       psmouse->name, psmouse->phys, psmouse->pktcnt);		psmouse->badbyte = psmouse->packet[0];		__psmouse_set_state(psmouse, PSMOUSE_RESYNCING);		queue_work(kpsmoused_wq, &psmouse->resync_work);		goto out;	}	psmouse->packet[psmouse->pktcnt++] = data;/* * Check if this is a new device announcement (0xAA 0x00) */	if (unlikely(psmouse->packet[0] == PSMOUSE_RET_BAT && psmouse->pktcnt <= 2)) {		if (psmouse->pktcnt == 1) {			psmouse->last = jiffies;			goto out;		}		if (psmouse->packet[1] == PSMOUSE_RET_ID) {			__psmouse_set_state(psmouse, PSMOUSE_IGNORE);			serio_reconnect(serio);			goto out;		}/* * Not a new device, try processing first byte normally */		psmouse->pktcnt = 1;		if (psmouse_handle_byte(psmouse))			goto out;		psmouse->packet[psmouse->pktcnt++] = data;	}/* * See if we need to force resync because mouse was idle for too long */	if (psmouse->state == PSMOUSE_ACTIVATED &&	    psmouse->pktcnt == 1 && psmouse->resync_time &&	    time_after(jiffies, psmouse->last + psmouse->resync_time * HZ)) {		psmouse->badbyte = psmouse->packet[0];		__psmouse_set_state(psmouse, PSMOUSE_RESYNCING);		queue_work(kpsmoused_wq, &psmouse->resync_work);		goto out;	}	psmouse->last = jiffies;	psmouse_handle_byte(psmouse); out:	return IRQ_HANDLED;}/* * psmouse_sliced_command() sends an extended PS/2 command to the mouse * using sliced syntax, understood by advanced devices, such as Logitech * or Synaptics touchpads. The command is encoded as: * 0xE6 0xE8 rr 0xE8 ss 0xE8 tt 0xE8 uu where (rr*64)+(ss*16)+(tt*4)+uu * is the command. */int psmouse_sliced_command(struct psmouse *psmouse, unsigned char command){	int i;	if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11))		return -1;	for (i = 6; i >= 0; i -= 2) {		unsigned char d = (command >> i) & 3;		if (ps2_command(&psmouse->ps2dev, &d, PSMOUSE_CMD_SETRES))			return -1;	}	return 0;}/* * psmouse_reset() resets the mouse into power-on state. */int psmouse_reset(struct psmouse *psmouse){	unsigned char param[2];	if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_RESET_BAT))		return -1;	if (param[0] != PSMOUSE_RET_BAT && param[1] != PSMOUSE_RET_ID)		return -1;	return 0;}/* * Genius NetMouse magic init. */static int genius_detect(struct psmouse *psmouse, int set_properties){	struct ps2dev *ps2dev = &psmouse->ps2dev;	unsigned char param[4];	param[0] = 3;	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);	ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE11);	ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE11);	ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE11);	ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO);	if (param[0] != 0x00 || param[1] != 0x33 || param[2] != 0x55)		return -1;	if (set_properties) {		set_bit(BTN_EXTRA, psmouse->dev->keybit);		set_bit(BTN_SIDE, psmouse->dev->keybit);		set_bit(REL_WHEEL, psmouse->dev->relbit);		psmouse->vendor = "Genius";		psmouse->name = "Mouse";		psmouse->pktsize = 4;	}	return 0;}/* * IntelliMouse magic init. */static int intellimouse_detect(struct psmouse *psmouse, int set_properties){	struct ps2dev *ps2dev = &psmouse->ps2dev;	unsigned char param[2];	param[0] = 200;	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);	param[0] = 100;	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);	param[0] =  80;	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);	ps2_command(ps2dev, param, PSMOUSE_CMD_GETID);	if (param[0] != 3)		return -1;	if (set_properties) {		set_bit(BTN_MIDDLE, psmouse->dev->keybit);		set_bit(REL_WHEEL, psmouse->dev->relbit);		if (!psmouse->vendor) psmouse->vendor = "Generic";		if (!psmouse->name) psmouse->name = "Wheel Mouse";		psmouse->pktsize = 4;	}	return 0;}/* * Try IntelliMouse/Explorer magic init. */static int im_explorer_detect(struct psmouse *psmouse, int set_properties){	struct ps2dev *ps2dev = &psmouse->ps2dev;	unsigned char param[2];	intellimouse_detect(psmouse, 0);	param[0] = 200;	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);	param[0] = 200;	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);	param[0] =  80;	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);	ps2_command(ps2dev, param, PSMOUSE_CMD_GETID);	if (param[0] != 4)		return -1;/* Magic to enable horizontal scrolling on IntelliMouse 4.0 */	param[0] = 200;	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);	param[0] =  80;	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);	param[0] =  40;	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE);	if (set_properties) {		set_bit(BTN_MIDDLE, psmouse->dev->keybit);		set_bit(REL_WHEEL, psmouse->dev->relbit);		set_bit(REL_HWHEEL, psmouse->dev->relbit);		set_bit(BTN_SIDE, psmouse->dev->keybit);		set_bit(BTN_EXTRA, psmouse->dev->keybit);		if (!psmouse->vendor) psmouse->vendor = "Generic";		if (!psmouse->name) psmouse->name = "Explorer Mouse";		psmouse->pktsize = 4;	}	return 0;}/* * Kensington ThinkingMouse / ExpertMouse magic init. */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲日本乱码在线观看| 欧美日韩国产一区| 国产亚洲欧美中文| 国产激情91久久精品导航| 久久噜噜亚洲综合| 成人天堂资源www在线| 亚洲欧洲另类国产综合| 日本二三区不卡| 午夜在线成人av| 日韩欧美国产精品一区| 精品夜夜嗨av一区二区三区| 国产午夜精品美女毛片视频| 91亚洲精品久久久蜜桃网站| 亚洲国产成人精品视频| 欧美一区二区人人喊爽| 国产精品一区二区免费不卡 | 欧美视频一区二区| 午夜一区二区三区视频| www亚洲一区| 91在线观看视频| 奇米色一区二区三区四区| 国产亚洲精品久| 91福利在线导航| 精品在线免费观看| 中文字幕一区二区不卡| 欧美欧美午夜aⅴ在线观看| 狠狠色狠狠色综合| 一区二区三区中文免费| 欧美www视频| 91色婷婷久久久久合中文| 亚洲国产精品久久久久婷婷884| 欧美变态凌虐bdsm| 波多野结衣在线aⅴ中文字幕不卡| 夜夜亚洲天天久久| 337p粉嫩大胆噜噜噜噜噜91av| 色综合天天综合给合国产| 日本美女视频一区二区| 中文字幕亚洲成人| 精品国产91久久久久久久妲己| 99久久99久久精品免费看蜜桃| 免费久久精品视频| 亚洲男人电影天堂| 久久久影视传媒| 欧美三级视频在线播放| 成人黄色777网| 韩国视频一区二区| 亚洲成在线观看| 亚洲欧洲在线观看av| 日韩一区二区三区在线| 色婷婷精品久久二区二区蜜臀av| 激情综合网最新| 亚洲成av人片在www色猫咪| 欧美激情自拍偷拍| 日韩视频一区二区在线观看| 色综合久久久久久久久久久| 国产福利一区在线| 日本不卡一区二区三区| 亚洲一区精品在线| 国产精品丝袜91| 国产清纯白嫩初高生在线观看91| 91精品国产色综合久久| 欧美性受xxxx黑人xyx| av电影在线观看一区| 国产精品一区一区| 国产一区二区三区免费播放| 视频一区中文字幕国产| 亚洲国产三级在线| 亚洲天堂av老司机| 自拍av一区二区三区| 亚洲国产精品精华液ab| 日本一区二区视频在线| 久久久不卡影院| 国产亚洲欧洲997久久综合 | 久久噜噜亚洲综合| 精品国一区二区三区| 日韩欧美久久久| 日韩免费在线观看| 欧美成人艳星乳罩| 欧美一区二区三区婷婷月色| 欧美福利电影网| 欧美一区二区三区免费视频 | 日韩av网站免费在线| 日韩专区欧美专区| 日韩av高清在线观看| 日韩av在线播放中文字幕| 免费看欧美美女黄的网站| 久久国内精品自在自线400部| 蜜桃av一区二区在线观看| 狠狠色狠狠色综合系列| 国产精品一区二区三区99| 不卡的电影网站| 色系网站成人免费| 欧美日韩成人综合在线一区二区| 欧美日韩国产三级| 日韩欧美一级二级三级| 日韩精品在线一区| 日本一区二区三区电影| 国产精品美女www爽爽爽| 亚洲蜜臀av乱码久久精品| 亚洲国产日韩精品| 经典三级在线一区| 成人黄色小视频在线观看| 色婷婷一区二区三区四区| 91麻豆精品国产91| 久久精品亚洲精品国产欧美kt∨ | av电影天堂一区二区在线| 91黄色免费版| 日韩欧美三级在线| 中文字幕日韩av资源站| 亚洲国产日韩a在线播放| 精品亚洲porn| av日韩在线网站| 欧美一区二区日韩| 国产精品久久看| 日本中文字幕一区二区视频| 国产精品一区二区久久不卡 | 7777精品伊人久久久大香线蕉完整版 | 国产91精品一区二区| 色欧美片视频在线观看| 欧美一级高清大全免费观看| 久久精品视频在线看| 一区二区三区在线视频观看| 久久se精品一区精品二区| 成人激情免费视频| 欧美一区二区三区男人的天堂| 亚洲国产精品激情在线观看| 亚洲综合激情小说| 国产经典欧美精品| 在线不卡中文字幕| 国产精品久久久一本精品| 久久精品国产一区二区| 91视频com| 久久久久久**毛片大全| 亚洲一区二区在线观看视频| 国产乱码一区二区三区| 欧美日本免费一区二区三区| 国产精品第五页| 久久99国产精品麻豆| 欧美日韩一区高清| 国产精品色呦呦| 欧美aa在线视频| 欧美色窝79yyyycom| 国产精品免费看片| 国内精品久久久久影院一蜜桃| 欧美系列一区二区| 亚洲人成网站色在线观看| 国产精品夜夜爽| 日韩欧美高清dvd碟片| 亚洲r级在线视频| 日本电影亚洲天堂一区| 中文字幕在线不卡一区二区三区| 国产老妇另类xxxxx| 日韩一级在线观看| 舔着乳尖日韩一区| 欧美色男人天堂| 一二三区精品福利视频| 94-欧美-setu| 国产精品欧美久久久久无广告| 国产精品亚洲一区二区三区妖精 | 精品国产伦理网| 另类综合日韩欧美亚洲| 欧美在线短视频| 亚洲国产精品久久人人爱| 在线观看亚洲成人| 亚洲摸摸操操av| 色香蕉久久蜜桃| 一区二区视频在线看| 91在线国产福利| 亚洲伦在线观看| 在线视频观看一区| 亚洲高清一区二区三区| 欧美日韩另类一区| 亚洲成av人片观看| 欧美一级欧美一级在线播放| 三级在线观看一区二区| 91精品国产欧美日韩| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产欧美一区二区三区在线看蜜臀 | 一本大道久久a久久精二百| 中文字幕亚洲一区二区av在线| 99久久久久久| 一区二区三区久久| 欧美日韩高清一区| 久久er精品视频| 国产偷国产偷亚洲高清人白洁| 成人一区二区三区| 亚洲欧洲99久久| 精品视频免费在线| 免费观看久久久4p| 久久中文字幕电影| www..com久久爱| 亚洲综合色区另类av| 欧美一区二区精美| 国产精品系列在线播放| 综合分类小说区另类春色亚洲小说欧美| 在线观看亚洲一区| 另类小说一区二区三区| 国产精品欧美一级免费| 欧美做爰猛烈大尺度电影无法无天| 污片在线观看一区二区|