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

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

?? usbmouse.c

?? Linux系統環境下
?? C
字號:
/* * $Id: usbmouse.c,v 1.15 2001/12/27 10:37:41 vojtech Exp $ * *  Copyright (c) 1999-2001 Vojtech Pavlik * *  USB HIDBP Mouse support *//* * 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/kernel.h>#include <linux/slab.h>#include <linux/input.h>#include <linux/module.h>#include <linux/init.h>#include <linux/usb.h>#include <linux/usb_input.h>/* * Version Information */#define DRIVER_VERSION "v1.6"#define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>"#define DRIVER_DESC "USB HID Boot Protocol mouse driver"#define DRIVER_LICENSE "GPL"MODULE_AUTHOR(DRIVER_AUTHOR);MODULE_DESCRIPTION(DRIVER_DESC);MODULE_LICENSE(DRIVER_LICENSE);struct usb_mouse {	char name[128];	char phys[64];	struct usb_device *usbdev;	struct input_dev *dev;	struct urb *irq;	signed char *data;	dma_addr_t data_dma;};static void usb_mouse_irq(struct urb *urb, struct pt_regs *regs) //{	struct usb_mouse *mouse = urb->context;	signed char *data = mouse->data;	struct input_dev *dev = mouse->dev;	int status;	switch (urb->status) {	case 0:			/* success */		break;	case -ECONNRESET:	/* unlink */	case -ENOENT:	case -ESHUTDOWN:		return;	/* -EPIPE:  should clear the halt */	default:		/* error */		goto resubmit;	}	input_regs(dev, regs);	input_report_key(dev, BTN_LEFT,   data[0] & 0x01);	input_report_key(dev, BTN_RIGHT,  data[0] & 0x02);	input_report_key(dev, BTN_MIDDLE, data[0] & 0x04);	input_report_key(dev, BTN_SIDE,   data[0] & 0x08);	input_report_key(dev, BTN_EXTRA,  data[0] & 0x10);	input_report_rel(dev, REL_X,     data[1]);	input_report_rel(dev, REL_Y,     data[2]);	input_report_rel(dev, REL_WHEEL, data[3]);	input_sync(dev);resubmit:	status = usb_submit_urb (urb, SLAB_ATOMIC);		   //再次向usb core提交urb   	if (status)		err ("can't resubmit intr, %s-%s/input0, status %d",				mouse->usbdev->bus->bus_name,				mouse->usbdev->devpath, status);}//打開鼠標static int usb_mouse_open(struct input_dev *dev){	struct usb_mouse *mouse = dev->private;	mouse->irq->dev = mouse->usbdev;	if (usb_submit_urb(mouse->irq, GFP_KERNEL))		  //向usb core提交urb		return -EIO;	return 0;}//關閉鼠標static void usb_mouse_close(struct input_dev *dev){	struct usb_mouse *mouse = dev->private;	usb_kill_urb(mouse->irq);	   //取消urb塊}static int usb_mouse_probe(			 //usb 接入事件回調函數	struct usb_interface *intf, 	 //usb 接口	const struct usb_device_id *id)  //usb 設備id{	struct usb_device *dev = interface_to_usbdev(intf);  //由接口得到設備	struct usb_host_interface *interface;	struct usb_endpoint_descriptor *endpoint;	  //usb端點描述符	struct usb_mouse *mouse;	  //自定義usb mouse	struct input_dev *input_dev;  //輸入設備	int pipe, maxp;	interface = intf->cur_altsetting;	if (interface->desc.bNumEndpoints != 1)		return -ENODEV;	endpoint = &interface->endpoint[0].desc;	if (!(endpoint->bEndpointAddress & USB_DIR_IN))		return -ENODEV;	if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT)		return -ENODEV;	pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);	maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));	mouse = kzalloc(sizeof(struct usb_mouse), GFP_KERNEL);	input_dev = input_allocate_device();	if (!mouse || !input_dev)		goto fail1;	mouse->data = usb_buffer_alloc(dev, 8, SLAB_ATOMIC, &mouse->data_dma);   //產生一個DMA buffer用以傳送數據到設備	if (!mouse->data)		goto fail1;	mouse->irq = usb_alloc_urb(0, GFP_KERNEL);  //生成urb塊	if (!mouse->irq)		goto fail2;	mouse->usbdev = dev;	mouse->dev = input_dev;	if (dev->manufacturer)		strlcpy(mouse->name, dev->manufacturer, sizeof(mouse->name));	if (dev->product) {		if (dev->manufacturer)			strlcat(mouse->name, " ", sizeof(mouse->name));		strlcat(mouse->name, dev->product, sizeof(mouse->name));	}	if (!strlen(mouse->name))		snprintf(mouse->name, sizeof(mouse->name),			 "USB HIDBP Mouse %04x:%04x",			 le16_to_cpu(dev->descriptor.idVendor),			 le16_to_cpu(dev->descriptor.idProduct));	usb_make_path(dev, mouse->phys, sizeof(mouse->phys));	strlcat(mouse->phys, "/input0", sizeof(mouse->phys));	input_dev->name = mouse->name;	input_dev->phys = mouse->phys;	usb_to_input_id(dev, &input_dev->id);	input_dev->cdev.dev = &intf->dev;	input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);	input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);	input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);	input_dev->keybit[LONG(BTN_MOUSE)] |= BIT(BTN_SIDE) | BIT(BTN_EXTRA);	input_dev->relbit[0] |= BIT(REL_WHEEL);	input_dev->private = mouse;	input_dev->open = usb_mouse_open;	input_dev->close = usb_mouse_close;	usb_fill_int_urb(mouse->irq, dev, pipe, mouse->data,	 //初始化urb塊			 (maxp > 8 ? 8 : maxp),			 usb_mouse_irq, mouse, endpoint->bInterval);	mouse->irq->transfer_dma = mouse->data_dma;	mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;	input_register_device(mouse->dev);	usb_set_intfdata(intf, mouse);	return 0;fail2:	usb_buffer_free(dev, 8, mouse->data, mouse->data_dma);fail1:	input_free_device(input_dev);	kfree(mouse);	return -ENOMEM;}static void usb_mouse_disconnect(struct usb_interface *intf){	struct usb_mouse *mouse = usb_get_intfdata (intf);	usb_set_intfdata(intf, NULL);	if (mouse) {		usb_kill_urb(mouse->irq);		//取消urb塊		input_unregister_device(mouse->dev);		usb_free_urb(mouse->irq);	  //釋放urb塊		usb_buffer_free(interface_to_usbdev(intf), 8, mouse->data, mouse->data_dma);		kfree(mouse);	}}static struct usb_device_id usb_mouse_id_table [] = {	{ USB_INTERFACE_INFO(3, 1, 2) },	//初始化  usb_mouse_id_table    { }						/* Terminating entry */};//export to user space to allow the hotplug and module loading systems know what module works with what hardware devices.  MODULE_DEVICE_TABLE (usb, usb_mouse_id_table);   static struct usb_driver usb_mouse_driver = {  //usb驅動的主結構體	.name		= "usbmouse",	.probe		= usb_mouse_probe,	.disconnect	= usb_mouse_disconnect,	.id_table	= usb_mouse_id_table,};static int __init usb_mouse_init(void){	int retval = usb_register(&usb_mouse_driver);  //To register the struct usb_driver with the USB core	if (retval == 0)		info(DRIVER_VERSION ":" DRIVER_DESC);	return retval;}static void __exit usb_mouse_exit(void){	usb_deregister(&usb_mouse_driver);  //unregistered from the kernel}module_init(usb_mouse_init);module_exit(usb_mouse_exit);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费人成精品欧美精品| 国内精品国产三级国产a久久| 青青草一区二区三区| 国产经典欧美精品| 91精品国产综合久久久久久| 久久噜噜亚洲综合| 日韩电影在线观看网站| 波多野结衣视频一区| 精品国产凹凸成av人网站| 一级做a爱片久久| 国产91精品一区二区| 日韩美一区二区三区| 亚洲国产色一区| 91丨porny丨首页| 国产精品午夜免费| 国产一区二区在线观看免费| 制服丝袜中文字幕亚洲| 亚洲视频免费看| 成人中文字幕电影| 久久亚洲影视婷婷| 老色鬼精品视频在线观看播放| 欧美在线免费观看视频| 一区二区三区中文字幕电影| 成人丝袜18视频在线观看| 国产一区二区三区免费观看| 亚洲精品国产第一综合99久久| 国产精品美女一区二区三区| 亚洲一区二区三区国产| 国产拍欧美日韩视频二区| 欧美精品xxxxbbbb| 欧美日韩高清一区二区三区| 风间由美一区二区三区在线观看 | 亚洲伦理在线精品| 久久99精品国产91久久来源| 日韩视频在线观看一区二区| 亚洲不卡在线观看| 欧美一区二区不卡视频| 天天综合网天天综合色| 正在播放一区二区| 另类小说色综合网站| 久久中文娱乐网| 国产成人综合亚洲网站| 中文字幕av一区二区三区免费看 | 国产精品水嫩水嫩| 99久久久国产精品| 亚洲精选视频免费看| 欧美午夜一区二区三区免费大片| 一区二区激情视频| 这里只有精品电影| 精品一区二区三区免费| 日本一区二区三区四区在线视频 | 国产喷白浆一区二区三区| 国产大片一区二区| 亚洲视频资源在线| 欧美久久婷婷综合色| 狠狠色丁香久久婷婷综合丁香| 国产校园另类小说区| 色视频成人在线观看免| 午夜精品一区二区三区三上悠亚| 欧美乱妇23p| 国内外精品视频| 亚洲欧洲综合另类| 69久久99精品久久久久婷婷| 国产精品一品二品| 亚洲一区二区欧美| 欧美成人vr18sexvr| 99riav久久精品riav| 日韩精品一级中文字幕精品视频免费观看 | 亚洲情趣在线观看| 91精品国产综合久久久久久漫画 | 午夜在线成人av| 日韩av成人高清| 色哟哟国产精品免费观看| 日韩视频一区二区三区在线播放| 综合av第一页| 狠狠v欧美v日韩v亚洲ⅴ| 欧美日韩精品一区视频| 国产精品卡一卡二| 国产精品乡下勾搭老头1| 91小视频免费观看| 日韩精品中午字幕| 色综合天天综合网天天看片| 麻豆91在线看| 亚洲一二三区不卡| 7777精品伊人久久久大香线蕉的| 高清beeg欧美| 一区二区日韩电影| 日韩欧美在线网站| 色婷婷精品大在线视频 | 日韩黄色片在线观看| 国产精品免费久久| 精品国产露脸精彩对白| 欧美精品欧美精品系列| 99re在线视频这里只有精品| 国精品**一区二区三区在线蜜桃| 亚洲国产成人91porn| 亚洲欧洲精品天堂一级| www国产精品av| 日韩一区二区在线免费观看| 欧美在线色视频| 94色蜜桃网一区二区三区| 国产露脸91国语对白| 日本在线播放一区二区三区| 一区二区三区高清不卡| 亚洲欧美在线观看| 中文字幕乱码日本亚洲一区二区| 欧美成人伊人久久综合网| 欧美久久一二三四区| 欧美日韩精品三区| 欧美性一二三区| 色婷婷综合五月| 一本一道波多野结衣一区二区| 国产成人午夜片在线观看高清观看| 另类小说图片综合网| 麻豆91精品91久久久的内涵| 日韩国产精品久久久| 午夜精品久久久| 婷婷激情综合网| 丝袜亚洲精品中文字幕一区| 偷拍一区二区三区| 婷婷激情综合网| 蜜乳av一区二区三区| 加勒比av一区二区| 国产一区二区不卡| 高清beeg欧美| 色婷婷综合久久| 欧美三级电影一区| 欧美一区二区三区小说| 精品国产自在久精品国产| 精品国产乱码久久久久久浪潮| 久久夜色精品一区| 国产精品久久久99| 一区二区三区波多野结衣在线观看| 一区二区三区在线免费观看| caoporen国产精品视频| 国产成人亚洲精品狼色在线| 奇米影视一区二区三区小说| 日韩制服丝袜av| 黑人精品欧美一区二区蜜桃| 美女被吸乳得到大胸91| 日韩成人午夜电影| 亚洲高清免费视频| 日韩av电影免费观看高清完整版在线观看 | 欧美日韩一区二区三区高清| 欧美日韩国产精品成人| 91精品国产入口| 国产色综合久久| 亚洲美女视频在线观看| 日日骚欧美日韩| 久久国产精品72免费观看| 日韩欧美国产综合在线一区二区三区| 中文字幕av一区二区三区免费看 | 91福利在线观看| 欧美一区二区在线看| 欧美国产乱子伦| 一区二区日韩电影| 国产一区二区美女诱惑| 色成年激情久久综合| 精品人在线二区三区| 亚洲欧美国产高清| 精品午夜一区二区三区在线观看| kk眼镜猥琐国模调教系列一区二区| 欧美日韩国产一二三| 国产亚洲一本大道中文在线| 亚洲风情在线资源站| 国产精品18久久久久久久久| 欧美日本一区二区| 亚洲欧洲精品一区二区精品久久久 | 亚洲综合一二三区| 国产精品一区在线观看你懂的| 欧美日韩极品在线观看一区| 国产精品免费久久久久| 精品无人码麻豆乱码1区2区| 在线观看91视频| 亚洲欧洲日本在线| 国产伦精品一区二区三区免费迷| 精品1区2区3区| 最新成人av在线| 国产精品系列在线观看| 日韩一级片在线观看| 亚洲福利电影网| 色狠狠综合天天综合综合| 中文字幕av一区二区三区| 看片的网站亚洲| 91精品国产综合久久久久| 亚洲v日本v欧美v久久精品| 色婷婷综合激情| 日韩一区欧美小说| 成人动漫av在线| 国产精品入口麻豆九色| 国产一区999| 久久蜜臀中文字幕| 国产一区 二区 三区一级| 欧美精品久久久久久久久老牛影院| 国产亚洲精品久| 欧美午夜在线观看| 国产一区二区三区| 亚洲欧美日韩精品久久久久| 欧美综合久久久| 国产乱人伦偷精品视频不卡 |