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

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

?? hid.c

?? Linux內核源代碼 為壓縮文件 是<<Linux內核>>一書中的源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
				&& field->usage[value[n] - min].hid				/* nonzero usage */				&& search(field->value, value[n], count))					hid_process_event(&dev->input, &dev->quirks,						field, &field->usage[value[n] - min], 1);		}	}	memcpy(field->value, value, count * sizeof(__s32));}/* * Interrupt input handler - analyse a received report. */static void hid_irq(struct urb *urb){	struct hid_device *device = urb->context;	struct hid_report_enum *report_enum = device->report_enum + HID_INPUT_REPORT;	struct hid_report *report;	__u8 *data = urb->transfer_buffer;	int len = urb->actual_length;	int n;	if (urb->status) {		dbg("nonzero status in irq %d", urb->status);		return;	}	if (!len) {		dbg("empty report");		return;	}#ifdef DEBUG_DATA	printk(KERN_DEBUG __FILE__ ": report (size %u) (%snumbered) = ", len, report_enum->numbered ? "" : "un");	for (n = 0; n < len; n++)		printk(" %02x", data[n]);	printk("\n");#endif	n = 0;				/* Normally report number is 0 */	if (report_enum->numbered) {	/* Device uses numbered reports, data[0] is report number */		n = *data++;		len--;	} 	if (!(report = report_enum->report_id_hash[n])) {		dbg("undefined report_id %d received", n);#ifdef DEBUG			printk(KERN_DEBUG __FILE__ ": report (size %u) = ", len);			for (n = 0; n < len; n++)				printk(" %02x", data[n]);			printk("\n");#endif			return;	}	if (len < ((report->size - 1) >> 3) + 1) {		dbg("report %d is too short, (%d < %d)", report->id, len, ((report->size - 1) >> 3) + 1);		return;	}	for (n = 0; n < report->maxfield; n++)		hid_input_field(device, report->field[n], data);	return;}/* * hid_read_report() s intended to read the hid devices values even * before the input device is registered, so that the userland interface * modules start with real values. This is especially important for joydev.c * automagic calibration. Doesn't work yet, though. Don't know why, the control * request just times out on most devices I have and returns nonsense on others. */static void hid_read_report(struct hid_device *hid, struct hid_report *report){#if 0	int rlen = ((report->size - 1) >> 3) + 1;	char rdata[rlen];	struct urb urb;	int read, j;	memset(&urb, 0, sizeof(struct urb));	memset(rdata, 0, rlen);	urb.transfer_buffer = rdata;	urb.actual_length = rlen;	urb.context = hid;	dbg("getting report type %d id %d len %d", report->type + 1, report->id, rlen);	if ((read = usb_get_report(hid->dev, hid->ifnum, report->type + 1, report->id, rdata, rlen)) != rlen) {		dbg("reading report failed rlen %d read %d", rlen, read);#ifdef DEBUG		printk(KERN_DEBUG __FILE__ ": report = ");		for (j = 0; j < rlen; j++) printk(" %02x", rdata[j]);		printk("\n");#endif		return;	}	hid_irq(&urb);#endif}/* * Output the field into the report. */static void hid_output_field(struct hid_field *field, __u8 *data){	unsigned count = field->report_count;	unsigned offset = field->report_offset;	unsigned size = field->report_size;	unsigned n;   	for (n = 0; n < count; n++) {		if (field->logical_minimum < 0)	/* signed values */			implement(data, offset + n * size, size, s32ton(field->value[n], size));		 else				/* unsigned values */			implement(data, offset + n * size, size, field->value[n]);       	}}/* * Create a report. */void hid_output_report(struct hid_report *report, __u8 *data){	unsigned n;	for (n = 0; n < report->maxfield; n++)		hid_output_field(report->field[n], data);};/* * Set a field value. The report this field belongs to has to be * created and transfered to the device, to set this value in the * device. */int hid_set_field(struct hid_field *field, unsigned offset, __s32 value){	unsigned size = field->report_size;	hid_dump_input(field->usage + offset, value);		if (offset >= field->report_count) {		dbg("offset exceeds report_count");		return -1;	}	if (field->logical_minimum < 0) {		if (value != snto32(s32ton(value, size), size)) {			dbg("value %d is out of range", value);			return -1;		}	}	if (   (value > field->logical_maximum)	    || (value < field->logical_minimum)) {		dbg("value %d is invalid", value);		return -1;	}	field->value[offset] = value;	return 0;}static int hid_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field){	struct hid_report_enum *report_enum = hid->report_enum + HID_OUTPUT_REPORT;	struct list_head *list = report_enum->report_list.next;	int i, j;	while (list != &report_enum->report_list) {		struct hid_report *report = (struct hid_report *) list;		list = list->next;		for (i = 0; i < report->maxfield; i++) {			*field = report->field[i];			for (j = 0; j < (*field)->maxusage; j++)				if ((*field)->usage[j].type == type && (*field)->usage[j].code == code)					return j;		}	}	return -1;}static int hid_submit_out(struct hid_device *hid){	hid->urbout.transfer_buffer_length = hid->out[hid->outtail].dr.length;	hid->urbout.transfer_buffer = hid->out[hid->outtail].buffer;	hid->urbout.setup_packet = (void *) &(hid->out[hid->outtail].dr);	hid->urbout.dev = hid->dev;	if (usb_submit_urb(&hid->urbout)) {		err("usb_submit_urb(out) failed");		return -1;	}	return 0;}static void hid_ctrl(struct urb *urb){	struct hid_device *hid = urb->context;        if (urb->status)		warn("ctrl urb status %d received", urb->status);		hid->outtail = (hid->outtail + 1) & (HID_CONTROL_FIFO_SIZE - 1);	if (hid->outhead != hid->outtail)		hid_submit_out(hid);}       static int hid_event(struct input_dev *dev, unsigned int type, unsigned int code, int value){	struct hid_device *hid = dev->private;	struct hid_field *field = NULL;	int offset;	if ((offset = hid_find_field(hid, type, code, &field)) == -1) {		warn("event field not found");		return -1;	}	hid_set_field(field, offset, value);	hid_output_report(field->report, hid->out[hid->outhead].buffer);	hid->out[hid->outhead].dr.value = 0x200 | field->report->id;	hid->out[hid->outhead].dr.length = ((field->report->size - 1) >> 3) + 1;	hid->outhead = (hid->outhead + 1) & (HID_CONTROL_FIFO_SIZE - 1);	if (hid->outhead == hid->outtail)		hid->outtail = (hid->outtail + 1) & (HID_CONTROL_FIFO_SIZE - 1);	if (hid->urbout.status != -EINPROGRESS)		hid_submit_out(hid);	return 0;}static int hid_open(struct input_dev *dev){	struct hid_device *hid = dev->private;	if (hid->open++)		return 0;	hid->urb.dev = hid->dev;	if (usb_submit_urb(&hid->urb))		return -EIO;	return 0;}static void hid_close(struct input_dev *dev){	struct hid_device *hid = dev->private;	if (!--hid->open)		usb_unlink_urb(&hid->urb);}/* * Configure the input layer interface * Read all reports and initalize the absoulte field values. */static void hid_init_input(struct hid_device *hid){	struct hid_report_enum *report_enum;	struct list_head *list;	int i, j, k;	hid->input.private = hid;	hid->input.event = hid_event;	hid->input.open = hid_open;	hid->input.close = hid_close;	for (k = HID_INPUT_REPORT; k <= HID_OUTPUT_REPORT; k++) {		report_enum = hid->report_enum + k;		list = report_enum->report_list.next;		while (list != &report_enum->report_list) {			struct hid_report *report = (struct hid_report *) list;			list = list->next;			for (i = 0; i < report->maxfield; i++)				for (j = 0; j < report->field[i]->maxusage; j++)					hid_configure_usage(hid, report->field[i], report->field[i]->usage + j);			if (k == HID_INPUT_REPORT)  {				usb_set_idle(hid->dev, hid->ifnum, 0, report->id);				hid_read_report(hid, report);			}		}	}}#define USB_VENDOR_ID_WACOM		0x056a#define USB_DEVICE_ID_WACOM_GRAPHIRE	0x0010#define USB_DEVICE_ID_WACOM_INTUOS	0x0020struct hid_blacklist {	__u16 idVendor;	__u16 idProduct;} hid_blacklist[] = {	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE },	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS },	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS + 1},	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS + 2},	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS + 3},	{ USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS + 4},	{ 0, 0 }};static struct hid_device *usb_hid_configure(struct usb_device *dev, int ifnum, char *name){	struct usb_interface_descriptor *interface = dev->actconfig->interface[ifnum].altsetting + 0;	struct hid_descriptor *hdesc;	struct hid_device *hid;	unsigned rsize = 0;	int n;	for (n = 0; hid_blacklist[n].idVendor; n++)		if ((hid_blacklist[n].idVendor == dev->descriptor.idVendor) &&			(hid_blacklist[n].idProduct == dev->descriptor.idProduct)) return NULL;	if (usb_get_extra_descriptor(interface, USB_DT_HID, &hdesc)		&& usb_get_extra_descriptor(&interface->endpoint[0], USB_DT_HID, &hdesc)) {			dbg("class descriptor not present\n");			return NULL;	}	for (n = 0; n < hdesc->bNumDescriptors; n++)		if (hdesc->desc[n].bDescriptorType == USB_DT_REPORT)			rsize = le16_to_cpu(hdesc->desc[n].wDescriptorLength);	if (!rsize || rsize > HID_MAX_DESCRIPTOR_SIZE) {		dbg("weird size of report descriptor (%u)", rsize);		return NULL;	}	{		__u8 rdesc[rsize];		if ((n = usb_get_class_descriptor(dev, interface->bInterfaceNumber, USB_DT_REPORT, 0, rdesc, rsize)) < 0) {			dbg("reading report descriptor failed");			return NULL;		}#ifdef DEBUG_DATA		printk(KERN_DEBUG __FILE__ ": report (size %u, read %d) = ", rsize, n);		for (n = 0; n < rsize; n++)			printk(" %02x", (unsigned) rdesc[n]);		printk("\n");#endif		if (!(hid = hid_parse_report(rdesc, rsize))) {			dbg("parsing report descriptor failed");			return NULL;		}	}	for (n = 0; n < interface->bNumEndpoints; n++) {		struct usb_endpoint_descriptor *endpoint = &interface->endpoint[n];		int pipe, maxp;		if ((endpoint->bmAttributes & 3) != 3)		/* Not an interrupt endpoint */			continue;		if (!(endpoint->bEndpointAddress & 0x80)) 	/* Not an input endpoint */			continue;		pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);		maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));		FILL_INT_URB(&hid->urb, dev, pipe, hid->buffer, maxp > 32 ? 32 : maxp, hid_irq, hid, endpoint->bInterval);			break;	}	if (n == interface->bNumEndpoints) {		dbg("couldn't find an input interrupt endpoint");		hid_free_device(hid);		return NULL;	}	hid->version = hdesc->bcdHID;	hid->country = hdesc->bCountryCode;	hid->dev = dev;	hid->ifnum = interface->bInterfaceNumber;	for (n = 0; n < HID_CONTROL_FIFO_SIZE; n++) {		hid->out[n].dr.requesttype = USB_TYPE_CLASS | USB_RECIP_INTERFACE;		hid->out[n].dr.request = USB_REQ_SET_REPORT;		hid->out[n].dr.index = hid->ifnum;	}	hid->input.name = hid->name;	hid->input.idbus = BUS_USB;	hid->input.idvendor = dev->descriptor.idVendor;	hid->input.idproduct = dev->descriptor.idProduct;	hid->input.idversion = dev->descriptor.bcdDevice;	if (strlen(name)) 		strcpy(hid->name, name);	else		sprintf(hid->name, "USB HID %s %04x:%04x",			((hid->application >= 0x00010000) && (hid->application <= 0x00010008)) ?			hid_types[hid->application & 0xffff] : "Device",			hid->input.idvendor, hid->input.idproduct);	FILL_CONTROL_URB(&hid->urbout, dev, usb_sndctrlpipe(dev, 0),		(void*) &hid->out[0].dr, hid->out[0].buffer, 1, hid_ctrl, hid);	if (interface->bInterfaceSubClass == 1)        	usb_set_protocol(dev, hid->ifnum, 1);	return hid;}static void* hid_probe(struct usb_device *dev, unsigned int ifnum,		       const struct usb_device_id *id){	struct hid_device *hid;	char name[128];	char *buf;	dbg("HID probe called for ifnum %d", ifnum);	name[0] = 0;	if (!(buf = kmalloc(63, GFP_KERNEL)))		return NULL;	if (dev->descriptor.iManufacturer &&		usb_string(dev, dev->descriptor.iManufacturer, buf, 63) > 0)			strcat(name, buf);	if (dev->descriptor.iProduct &&		usb_string(dev, dev->descriptor.iProduct, buf, 63) > 0)			sprintf(name, "%s %s", name, buf);	kfree(buf);	if (!(hid = usb_hid_configure(dev, ifnum, name)))		return NULL;	hid_dump_device(hid);	hid_init_input(hid);	input_register_device(&hid->input);	printk(KERN_INFO "input%d: USB HID v%x.%02x %s",		hid->input.number,		hid->version >> 8, hid->version & 0xff,		((hid->application >= 0x00010000) && (hid->application <= 0x00010008)) ?		hid_types[hid->application & 0xffff] : "Device");	if (strlen(name))		printk(" [%s]", name);	else		printk(" [%04x:%04x]", hid->input.idvendor, hid->input.idproduct);		printk(" on usb%d:%d.%d\n", dev->bus->busnum, dev->devnum, ifnum);	return hid;}static void hid_disconnect(struct usb_device *dev, void *ptr){	struct hid_device *hid = ptr;	dbg("cleanup called");	usb_unlink_urb(&hid->urb);	input_unregister_device(&hid->input);	hid_free_device(hid);}static struct usb_device_id hid_usb_ids [] = {    { match_flags: USB_DEVICE_ID_MATCH_INT_CLASS,      bInterfaceClass: USB_INTERFACE_CLASS_HID},    { }						/* Terminating entry */};MODULE_DEVICE_TABLE (usb, hid_usb_ids);static struct usb_driver hid_driver = {	name:		"hid",	probe:		hid_probe,	disconnect:	hid_disconnect,	id_table:	hid_usb_ids,};static int __init hid_init(void){	usb_register(&hid_driver);	return 0;}static void __exit hid_exit(void){	usb_deregister(&hid_driver);}module_init(hid_init);module_exit(hid_exit);MODULE_AUTHOR("Andreas Gal, Vojtech Pavlik <vojtech@suse.cz>");MODULE_DESCRIPTION("USB HID support drivers");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品少妇一区二区三区| 欧美日韩免费电影| 午夜激情久久久| 国产亚洲福利社区一区| 欧美在线观看视频一区二区三区| 麻豆视频观看网址久久| 亚洲另类在线一区| 久久综合色之久久综合| 欧美人体做爰大胆视频| bt欧美亚洲午夜电影天堂| 美国精品在线观看| 亚洲影视资源网| 中文字幕一区二区三区四区不卡 | 波多野结衣一区二区三区| 日日夜夜精品免费视频| 亚洲欧美色一区| 中文字幕精品综合| 精品欧美一区二区在线观看| 欧美影院一区二区三区| 成人99免费视频| 国产福利不卡视频| 麻豆成人综合网| 五月激情综合色| 亚洲自拍与偷拍| 亚洲色图视频网| 中文字幕第一区二区| 337p日本欧洲亚洲大胆精品| 日韩视频在线你懂得| 欧美日韩国产另类一区| 欧美在线三级电影| 在线观看网站黄不卡| 91视频.com| 97久久超碰精品国产| 99久久久久久| 91视视频在线观看入口直接观看www | 欧美日韩一区二区三区四区五区| 91在线视频网址| 成人97人人超碰人人99| 99在线精品观看| 99久久伊人网影院| www.66久久| 91网址在线看| 欧洲精品中文字幕| 欧美日韩国产另类不卡| 91精品在线观看入口| 欧美一区二区三区白人| 欧美一二三区在线观看| 精品入口麻豆88视频| 久久综合狠狠综合久久激情| 久久精品一区二区三区av | 亚洲成av人片观看| 亚洲一区二区精品3399| 亚洲电影你懂得| 美女免费视频一区二区| 九九在线精品视频| 国产精品18久久久久久久久 | 91精品久久久久久久91蜜桃| 日韩视频免费直播| 久久免费电影网| 国产精品高潮久久久久无| 亚洲婷婷综合色高清在线| 亚洲午夜私人影院| 日本成人在线网站| 国产福利一区二区三区| 99精品视频中文字幕| 欧美日韩一区二区三区高清| 欧美一卡二卡在线观看| 久久九九久久九九| 一区二区三区中文在线观看| 五月婷婷另类国产| 国产自产2019最新不卡| 91一区一区三区| 在线成人小视频| 国产调教视频一区| 亚洲综合丝袜美腿| 九九久久精品视频| 一本色道综合亚洲| 日韩限制级电影在线观看| 国产日韩欧美综合一区| 亚洲不卡一区二区三区| 国内偷窥港台综合视频在线播放| 成人美女视频在线观看| 欧美日韩国产三级| 国产精品丝袜在线| 天涯成人国产亚洲精品一区av| 国产一区二区三区不卡在线观看| 一本色道久久综合亚洲91| 日韩精品一区二区三区中文精品| 国产精品国产三级国产aⅴ入口| 亚洲大片免费看| 国产成人在线视频免费播放| 欧美日韩精品电影| 国产精品情趣视频| 日韩高清不卡在线| 99v久久综合狠狠综合久久| 欧美一区二区精品在线| 亚洲婷婷综合色高清在线| 久久66热re国产| 欧美美女直播网站| 中文字幕一区二区不卡| 精品在线播放午夜| 在线免费观看日本欧美| 国产欧美日韩三级| 蜜桃免费网站一区二区三区| 91激情五月电影| 中文一区一区三区高中清不卡| 无码av免费一区二区三区试看| 成人精品亚洲人成在线| 欧美本精品男人aⅴ天堂| 香蕉影视欧美成人| 一本色道久久综合狠狠躁的推荐| 国产网红主播福利一区二区| 九九久久精品视频| 制服丝袜亚洲精品中文字幕| 一区二区三区日韩欧美精品| 福利电影一区二区| 精品国产成人系列| 日本美女一区二区| 7777精品伊人久久久大香线蕉超级流畅 | 日韩欧美一区二区三区在线| 亚洲欧美另类图片小说| 粉嫩高潮美女一区二区三区| 精品88久久久久88久久久| 日本午夜一本久久久综合| 欧美色大人视频| 一区二区三区四区激情| 色视频成人在线观看免| 中文字幕在线观看不卡| 成人激情开心网| 欧美韩国日本不卡| 成人永久aaa| 国产精品久久久久aaaa| 不卡的av电影| 国产精品乱码人人做人人爱| 高清视频一区二区| 中文字幕在线观看一区二区| 成人国产精品免费观看动漫| 中文一区一区三区高中清不卡| 国产一区二区三区四| 久久综合久久久久88| 极品少妇xxxx精品少妇偷拍| 久久新电视剧免费观看| 国产精品一品二品| 国产精品日韩精品欧美在线 | 欧美一级爆毛片| 美国十次了思思久久精品导航| 日韩色视频在线观看| 另类调教123区| 国产午夜三级一区二区三| 国产成人av福利| 亚洲欧美成人一区二区三区| 一本色道久久加勒比精品 | 亚洲第一成人在线| 日韩一区二区视频| 国内精品国产成人| 国产精品视频一二| 91污片在线观看| 日韩成人免费看| 久久久精品人体av艺术| 成人亚洲一区二区一| 一二三区精品福利视频| 欧美另类久久久品| 国产在线视频一区二区| 亚洲人123区| 欧美日韩精品三区| 极品美女销魂一区二区三区免费| 中文字幕不卡在线播放| 欧美性大战久久久久久久蜜臀| 视频一区视频二区中文字幕| 精品福利一二区| 91丨九色丨蝌蚪富婆spa| 日韩专区一卡二卡| 亚洲国产精品传媒在线观看| 91福利国产精品| 黄网站免费久久| 亚洲精品日日夜夜| 日韩三级电影网址| 不卡av免费在线观看| 无吗不卡中文字幕| 国产精品欧美久久久久一区二区| 欧美日韩亚洲不卡| 国产福利一区二区| 香蕉成人伊视频在线观看| 久久久久久久精| 欧美色图12p| 成人在线视频一区二区| 日韩成人免费在线| 亚洲图片你懂的| 久久影院午夜论| 欧美日韩国产经典色站一区二区三区 | 亚洲精品日产精品乱码不卡| 日韩一区二区在线看片| 91麻豆精品秘密| 激情综合色播激情啊| 一区二区三区日韩在线观看| 国产日韩欧美不卡| 日韩精品在线看片z| 欧美天堂一区二区三区| 成人亚洲一区二区一| 久久国产精品免费|