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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? sermouse.c

?? Serial mouse driver for Linux
?? C
字號:
/* * $Id: sermouse.c,v 1.17 2002/03/13 10:03:43 vojtech Exp $ * *  Copyright (c) 1999-2001 Vojtech Pavlik *//* *  Serial mouse driver for Linux *//* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Should you need to contact me, the author, you can do so either by * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail: * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic */#include <linux/delay.h>#include <linux/module.h>#include <linux/slab.h>#include <linux/interrupt.h>#include <linux/input.h>#include <linux/serio.h>#include <linux/init.h>#define DRIVER_DESC	"Serial mouse driver"MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");MODULE_DESCRIPTION(DRIVER_DESC);MODULE_LICENSE("GPL");static const char *sermouse_protocols[] = { "None", "Mouse Systems Mouse", "Sun Mouse", "Microsoft Mouse",					"Logitech M+ Mouse", "Microsoft MZ Mouse", "Logitech MZ+ Mouse",					"Logitech MZ++ Mouse"};struct sermouse {	struct input_dev *dev;	signed char buf[8];	unsigned char count;	unsigned char type;	unsigned long last;	char phys[32];};/* * sermouse_process_msc() analyzes the incoming MSC/Sun bytestream and * applies some prediction to the data, resulting in 96 updates per * second, which is as good as a PS/2 or USB mouse. */static void sermouse_process_msc(struct sermouse *sermouse, signed char data){	struct input_dev *dev = sermouse->dev;	signed char *buf = sermouse->buf;	switch (sermouse->count) {		case 0:			if ((data & 0xf8) != 0x80) return;			input_report_key(dev, BTN_LEFT,   !(data & 4));			input_report_key(dev, BTN_RIGHT,  !(data & 1));			input_report_key(dev, BTN_MIDDLE, !(data & 2));			break;		case 1:		case 3:			input_report_rel(dev, REL_X, data / 2);			input_report_rel(dev, REL_Y, -buf[1]);			buf[0] = data - data / 2;			break;		case 2:		case 4:			input_report_rel(dev, REL_X, buf[0]);			input_report_rel(dev, REL_Y, buf[1] - data);			buf[1] = data / 2;			break;	}	input_sync(dev);	if (++sermouse->count == 5)		sermouse->count = 0;}/* * sermouse_process_ms() anlyzes the incoming MS(Z/+/++) bytestream and * generates events. With prediction it gets 80 updates/sec, assuming * standard 3-byte packets and 1200 bps. */static void sermouse_process_ms(struct sermouse *sermouse, signed char data){	struct input_dev *dev = sermouse->dev;	signed char *buf = sermouse->buf;	if (data & 0x40) sermouse->count = 0;	switch (sermouse->count) {		case 0:			buf[1] = data;			input_report_key(dev, BTN_LEFT,   (data >> 5) & 1);			input_report_key(dev, BTN_RIGHT,  (data >> 4) & 1);			break;		case 1:			buf[2] = data;			data = (signed char) (((buf[1] << 6) & 0xc0) | (data & 0x3f));			input_report_rel(dev, REL_X, data / 2);			input_report_rel(dev, REL_Y, buf[4]);			buf[3] = data - data / 2;			break;		case 2:			/* Guessing the state of the middle button on 3-button MS-protocol mice - ugly. */			if ((sermouse->type == SERIO_MS) && !data && !buf[2] && !((buf[0] & 0xf0) ^ buf[1]))				input_report_key(dev, BTN_MIDDLE, !test_bit(BTN_MIDDLE, dev->key));			buf[0] = buf[1];			data = (signed char) (((buf[1] << 4) & 0xc0) | (data & 0x3f));			input_report_rel(dev, REL_X, buf[3]);			input_report_rel(dev, REL_Y, data - buf[4]);			buf[4] = data / 2;			break;		case 3:			switch (sermouse->type) {				case SERIO_MS:					 sermouse->type = SERIO_MP;				case SERIO_MP:					if ((data >> 2) & 3) break;	/* M++ Wireless Extension packet. */					input_report_key(dev, BTN_MIDDLE, (data >> 5) & 1);					input_report_key(dev, BTN_SIDE,   (data >> 4) & 1);					break;				case SERIO_MZP:				case SERIO_MZPP:					input_report_key(dev, BTN_SIDE,   (data >> 5) & 1);				case SERIO_MZ:					input_report_key(dev, BTN_MIDDLE, (data >> 4) & 1);					input_report_rel(dev, REL_WHEEL,  (data & 8) - (data & 7));					break;			}			break;		case 4:		case 6:	/* MZ++ packet type. We can get these bytes for M++ too but we ignore them later. */			buf[1] = (data >> 2) & 0x0f;			break;		case 5:		case 7: /* Ignore anything besides MZ++ */			if (sermouse->type != SERIO_MZPP) break;			switch (buf[1]) {				case 1: /* Extra mouse info */					input_report_key(dev, BTN_SIDE, (data >> 4) & 1);					input_report_key(dev, BTN_EXTRA, (data >> 5) & 1);					input_report_rel(dev, data & 0x80 ? REL_HWHEEL : REL_WHEEL, (data & 7) - (data & 8));					break;				default: /* We don't decode anything else yet. */					printk(KERN_WARNING						"sermouse.c: Received MZ++ packet %x, don't know how to handle.\n", buf[1]);					break;			}			break;	}	input_sync(dev);	sermouse->count++;}/* * sermouse_interrupt() handles incoming characters, either gathering them into * packets or passing them to the command routine as command output. */static irqreturn_t sermouse_interrupt(struct serio *serio,		unsigned char data, unsigned int flags){	struct sermouse *sermouse = serio_get_drvdata(serio);	if (time_after(jiffies, sermouse->last + HZ/10)) sermouse->count = 0;	sermouse->last = jiffies;	if (sermouse->type > SERIO_SUN)		sermouse_process_ms(sermouse, data);	else		sermouse_process_msc(sermouse, data);	return IRQ_HANDLED;}/* * sermouse_disconnect() cleans up after we don't want talk * to the mouse anymore. */static void sermouse_disconnect(struct serio *serio){	struct sermouse *sermouse = serio_get_drvdata(serio);	serio_close(serio);	serio_set_drvdata(serio, NULL);	input_unregister_device(sermouse->dev);	kfree(sermouse);}/* * sermouse_connect() is a callback form the serio module when * an unhandled serio port is found. */static int sermouse_connect(struct serio *serio, struct serio_driver *drv){	struct sermouse *sermouse;	struct input_dev *input_dev;	unsigned char c = serio->id.extra;	int err = -ENOMEM;	sermouse = kzalloc(sizeof(struct sermouse), GFP_KERNEL);	input_dev = input_allocate_device();	if (!sermouse || !input_dev)		goto fail;	sermouse->dev = input_dev;	snprintf(sermouse->phys, sizeof(sermouse->phys), "%s/input0", serio->phys);	sermouse->type = serio->id.proto;	input_dev->name = sermouse_protocols[sermouse->type];	input_dev->phys = sermouse->phys;	input_dev->id.bustype = BUS_RS232;	input_dev->id.vendor  = sermouse->type;	input_dev->id.product = c;	input_dev->id.version = 0x0100;	input_dev->cdev.dev = &serio->dev;	input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);	input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT);	input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);	input_dev->private = sermouse;	if (c & 0x01) set_bit(BTN_MIDDLE, input_dev->keybit);	if (c & 0x02) set_bit(BTN_SIDE, input_dev->keybit);	if (c & 0x04) set_bit(BTN_EXTRA, input_dev->keybit);	if (c & 0x10) set_bit(REL_WHEEL, input_dev->relbit);	if (c & 0x20) set_bit(REL_HWHEEL, input_dev->relbit);	serio_set_drvdata(serio, sermouse);	err = serio_open(serio, drv);	if (err)		goto fail;	input_register_device(sermouse->dev);	return 0; fail:	serio_set_drvdata(serio, NULL);	input_free_device(input_dev);	kfree(sermouse);	return err;}static struct serio_device_id sermouse_serio_ids[] = {	{		.type	= SERIO_RS232,		.proto	= SERIO_MSC,		.id	= SERIO_ANY,		.extra	= SERIO_ANY,	},	{		.type	= SERIO_RS232,		.proto	= SERIO_SUN,		.id	= SERIO_ANY,		.extra	= SERIO_ANY,	},	{		.type	= SERIO_RS232,		.proto	= SERIO_MS,		.id	= SERIO_ANY,		.extra	= SERIO_ANY,	},	{		.type	= SERIO_RS232,		.proto	= SERIO_MP,		.id	= SERIO_ANY,		.extra	= SERIO_ANY,	},	{		.type	= SERIO_RS232,		.proto	= SERIO_MZ,		.id	= SERIO_ANY,		.extra	= SERIO_ANY,	},	{		.type	= SERIO_RS232,		.proto	= SERIO_MZP,		.id	= SERIO_ANY,		.extra	= SERIO_ANY,	},	{		.type	= SERIO_RS232,		.proto	= SERIO_MZPP,		.id	= SERIO_ANY,		.extra	= SERIO_ANY,	},	{ 0 }};MODULE_DEVICE_TABLE(serio, sermouse_serio_ids);static struct serio_driver sermouse_drv = {	.driver		= {		.name	= "sermouse",	},	.description	= DRIVER_DESC,	.id_table	= sermouse_serio_ids,	.interrupt	= sermouse_interrupt,	.connect	= sermouse_connect,	.disconnect	= sermouse_disconnect,};static int __init sermouse_init(void){	serio_register_driver(&sermouse_drv);	return 0;}static void __exit sermouse_exit(void){	serio_unregister_driver(&sermouse_drv);}module_init(sermouse_init);module_exit(sermouse_exit);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆精品久久精品色综合| 国产精品视频免费看| 亚洲国产视频a| 欧美日韩精品欧美日韩精品一| 香蕉av福利精品导航| 欧美一区二区视频网站| 免费在线观看视频一区| 久久色在线观看| 成人a免费在线看| 亚洲欧美偷拍卡通变态| 欧美日韩国产综合久久| 国产在线一区二区综合免费视频| 欧美国产精品一区| 欧美色精品在线视频| 毛片一区二区三区| 国产视频一区在线播放| 欧美怡红院视频| 精一区二区三区| **网站欧美大片在线观看| 欧美日韩高清一区二区| 国产精品影音先锋| 亚洲三级在线免费| 日韩欧美精品在线视频| 91免费看`日韩一区二区| 日韩在线卡一卡二| 中文字幕成人av| 7777精品伊人久久久大香线蕉 | 精品一区二区三区视频在线观看| 久久伊99综合婷婷久久伊| 91色porny在线视频| 日本欧美在线观看| 亚洲欧美在线视频观看| 日韩免费高清av| 色婷婷国产精品综合在线观看| 蜜桃一区二区三区四区| 综合久久国产九一剧情麻豆| 欧美一区二区视频观看视频| 99久久久国产精品免费蜜臀| 另类中文字幕网| 夜夜嗨av一区二区三区中文字幕| 久久蜜桃一区二区| 欧美视频中文字幕| 91小视频在线免费看| 国产在线精品不卡| 日日欢夜夜爽一区| 日韩美女视频19| 国产三级久久久| 91精品久久久久久久久99蜜臂| 色综合久久中文综合久久牛| 国精产品一区一区三区mba桃花 | 麻豆精品国产传媒mv男同| 亚洲三级久久久| 国产欧美一区二区三区鸳鸯浴| 欧美一级二级三级蜜桃| 在线观看一区不卡| 91在线观看成人| 粉嫩嫩av羞羞动漫久久久| 激情丁香综合五月| 久久99国内精品| 日本午夜精品一区二区三区电影| 亚洲精品你懂的| 中文字幕日韩一区| 国产精品嫩草影院av蜜臀| 国产夜色精品一区二区av| 精品国产伦一区二区三区观看体验| 欧美在线短视频| 91丨九色丨黑人外教| 成人成人成人在线视频| 国产成人亚洲综合a∨婷婷| 国产综合色在线| 国产自产2019最新不卡| 国产一区二区精品久久91| 国产综合色精品一区二区三区| 久久99精品久久只有精品| 黄色成人免费在线| 国产精品99久久久久久有的能看 | 免费在线看成人av| 男女视频一区二区| 久久精品二区亚洲w码| 麻豆免费看一区二区三区| 捆绑调教美女网站视频一区| 六月丁香婷婷久久| 国产精品一区免费在线观看| 国产经典欧美精品| 成人久久视频在线观看| 日本韩国一区二区三区| 欧美色综合影院| 日韩一卡二卡三卡国产欧美| 欧美r级在线观看| 久久久久久久久久看片| 中文字幕在线观看不卡| 亚洲一区中文在线| 免费三级欧美电影| 丁香婷婷综合色啪| 色综合夜色一区| 欧美久久久久久蜜桃| 精品va天堂亚洲国产| 日本一区二区三区国色天香| 亚洲日本中文字幕区| 亚洲成a人在线观看| 精品在线播放午夜| 成人精品视频一区二区三区 | 国产精品电影院| 一区二区理论电影在线观看| 日本在线不卡视频一二三区| 国产一区二区三区最好精华液| 99久久精品久久久久久清纯| 欧美性受xxxx黑人xyx性爽| 欧美变态tickling挠脚心| 国产精品久久久久影院色老大| 亚洲精品乱码久久久久久久久 | 欧美日韩一区不卡| 久久婷婷一区二区三区| 一区二区三区免费| 久久99国产精品久久99| 99久久综合国产精品| 7777精品伊人久久久大香线蕉的| 欧美国产欧美综合| 午夜精品一区二区三区电影天堂 | 最新热久久免费视频| 日韩影院免费视频| 成人精品视频.| 日韩午夜精品电影| 亚洲国产精品ⅴa在线观看| 亚洲v中文字幕| 成人高清免费观看| 欧美一区二区免费视频| 中文字幕佐山爱一区二区免费| 蜜桃传媒麻豆第一区在线观看| 99国产精品久久久久| 日韩欧美国产一区二区三区 | 欧美一级高清片| 亚洲欧美欧美一区二区三区| 国内精品国产成人国产三级粉色 | 色老综合老女人久久久| 精品国产伦一区二区三区免费| 亚洲愉拍自拍另类高清精品| 国产成人99久久亚洲综合精品| 777xxx欧美| 亚洲一二三四久久| 97久久人人超碰| 国产欧美一区二区三区在线看蜜臀 | 国产高清亚洲一区| 日韩一区二区在线免费观看| 亚洲午夜av在线| 91色乱码一区二区三区| 国产精品麻豆久久久| 国产麻豆欧美日韩一区| 日韩欧美亚洲国产精品字幕久久久| 亚洲二区在线视频| 欧美性猛交xxxx乱大交退制版 | 精品粉嫩超白一线天av| 午夜精品爽啪视频| 欧美日韩高清在线播放| 亚洲一区二区三区自拍| 色猫猫国产区一区二在线视频| 中文字幕二三区不卡| 高清在线不卡av| 欧美激情一区二区| 国产99久久精品| 国产夜色精品一区二区av| 国产乱人伦精品一区二区在线观看| 日韩一区二区三免费高清| 免费看欧美女人艹b| 日韩一级黄色大片| 日本不卡高清视频| 欧美成人a视频| 极品尤物av久久免费看| 精品处破学生在线二十三| 激情综合网天天干| 久久青草欧美一区二区三区| 国产尤物一区二区在线| 国产色产综合产在线视频| 成人午夜视频在线观看| 中文字幕日韩精品一区| 欧美伊人久久久久久久久影院 | 色综合天天综合网天天狠天天| 中文字幕一区二区日韩精品绯色| 成人aaaa免费全部观看| 日韩一区有码在线| 日本韩国欧美三级| 视频一区二区中文字幕| 精品日韩av一区二区| 国产精品亚洲一区二区三区在线 | 欧美日韩中文一区| 爽爽淫人综合网网站| 精品国产乱码久久久久久图片 | 热久久国产精品| 欧美不卡在线视频| 成人黄色小视频| 一区二区三区四区在线| 欧美一区二区播放| 国产宾馆实践打屁股91| 亚洲精品高清在线| 欧美一区二区三区免费大片| 国产激情精品久久久第一区二区| 亚洲精品视频免费看| 日韩欧美高清一区| caoporn国产精品| 日韩国产欧美三级|