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

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

?? hid-core.c

?? 是關于linux2.5.1的完全源碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * Free a device structure, all reports, and all fields. */static void hid_free_device(struct hid_device *device){	unsigned i,j;	for (i = 0; i < HID_REPORT_TYPES; i++) {		struct hid_report_enum *report_enum = device->report_enum + i;		for (j = 0; j < 256; j++) {			struct hid_report *report = report_enum->report_id_hash[j];			if (report) hid_free_report(report);		}	}	if (device->rdesc) kfree(device->rdesc);}/* * Fetch a report description item from the data stream. We support long * items, though they are not used yet. */static u8 *fetch_item(__u8 *start, __u8 *end, struct hid_item *item){	u8 b;	if ((end - start) <= 0)		return NULL;	b = *start++;	item->type = (b >> 2) & 3;	item->tag  = (b >> 4) & 15;	if (item->tag == HID_ITEM_TAG_LONG) {		item->format = HID_ITEM_FORMAT_LONG;		if ((end - start) < 2)			return NULL;		item->size = *start++;		item->tag  = *start++;		if ((end - start) < item->size) 			return NULL;		item->data.longdata = start;		start += item->size;		return start;	} 	item->format = HID_ITEM_FORMAT_SHORT;	item->size = b & 3;	switch (item->size) {		case 0:			return start;		case 1:			if ((end - start) < 1)				return NULL;			item->data.u8 = *start++;			return start;		case 2:			if ((end - start) < 2) 				return NULL;			item->data.u16 = le16_to_cpu(get_unaligned(((__u16*)start)++));			return start;		case 3:			item->size++;			if ((end - start) < 4)				return NULL;			item->data.u32 = le32_to_cpu(get_unaligned(((__u32*)start)++));			return start;	}	return NULL;}/* * Parse a report description into a hid_device structure. Reports are * enumerated, fields are attached to these reports. */static struct hid_device *hid_parse_report(__u8 *start, unsigned size){	struct hid_device *device;	struct hid_parser *parser;	struct hid_item item;	__u8 *end;	unsigned i;	static int (*dispatch_type[])(struct hid_parser *parser,				      struct hid_item *item) = {		hid_parser_main,		hid_parser_global,		hid_parser_local,		hid_parser_reserved	};	if (!(device = kmalloc(sizeof(struct hid_device), GFP_KERNEL)))		return NULL;	memset(device, 0, sizeof(struct hid_device));	for (i = 0; i < HID_REPORT_TYPES; i++)		INIT_LIST_HEAD(&device->report_enum[i].report_list);	if (!(device->rdesc = (__u8 *)kmalloc(size, GFP_KERNEL))) {		kfree(device);		return NULL;	}	memcpy(device->rdesc, start, size);	if (!(parser = kmalloc(sizeof(struct hid_parser), GFP_KERNEL))) {		kfree(device->rdesc);		kfree(device);		return NULL;	}	memset(parser, 0, sizeof(struct hid_parser));	parser->device = device;	end = start + size;	while ((start = fetch_item(start, end, &item)) != 0) {		if (item.format != HID_ITEM_FORMAT_SHORT) {			dbg("unexpected long global item");			hid_free_device(device);			kfree(parser);			return NULL;		}		if (dispatch_type[item.type](parser, &item)) {			dbg("item %u %u %u %u parsing failed\n",				item.format, (unsigned)item.size, (unsigned)item.type, (unsigned)item.tag);			hid_free_device(device);			kfree(parser);			return NULL;		}		if (start == end) {			if (parser->collection_stack_ptr) {				dbg("unbalanced collection at end of report description");				hid_free_device(device);				kfree(parser);				return NULL;			}			if (parser->local.delimiter_depth) {				dbg("unbalanced delimiter at end of report description");				hid_free_device(device);				kfree(parser);				return NULL;			}			kfree(parser);			return device;		}	}	dbg("item fetching failed at offset %d\n", (int)(end - start));	hid_free_device(device);	kfree(parser);	return NULL;}/* * Convert a signed n-bit integer to signed 32-bit integer. Common * cases are done through the compiler, the screwed things has to be * done by hand. */static __inline__ __s32 snto32(__u32 value, unsigned n){	switch (n) {		case 8:  return ((__s8)value);		case 16: return ((__s16)value);		case 32: return ((__s32)value);	}	return value & (1 << (n - 1)) ? value | (-1 << n) : value;}/* * Convert a signed 32-bit integer to a signed n-bit integer. */static __inline__ __u32 s32ton(__s32 value, unsigned n){	__s32 a = value >> (n - 1);	if (a && a != -1) return value < 0 ? 1 << (n - 1) : (1 << (n - 1)) - 1;	return value & ((1 << n) - 1);}/* * Extract/implement a data field from/to a report. */static __inline__ __u32 extract(__u8 *report, unsigned offset, unsigned n){	report += (offset >> 5) << 2; offset &= 31;	return (le64_to_cpu(get_unaligned((__u64*)report)) >> offset) & ((1 << n) - 1);}static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u32 value){	report += (offset >> 5) << 2; offset &= 31;	put_unaligned((get_unaligned((__u64*)report)		& cpu_to_le64(~((((__u64) 1 << n) - 1) << offset)))		| cpu_to_le64((__u64)value << offset), (__u64*)report);}/* * Search an array for a value. */static __inline__ int search(__s32 *array, __s32 value, unsigned n){	while (n--) if (*array++ == value) return 0;	return -1;}static void hid_process_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value){	hid_dump_input(usage, value);	if (hid->claimed & HID_CLAIMED_INPUT)		hidinput_hid_event(hid, field, usage, value);#ifdef CONFIG_USB_HIDDEV	if (hid->claimed & HID_CLAIMED_HIDDEV) {		struct hiddev_usage_ref uref;		unsigned type = field->report_type;		uref.report_type = 		  (type == HID_INPUT_REPORT) ? HID_REPORT_TYPE_INPUT :		  ((type == HID_OUTPUT_REPORT) ? HID_REPORT_TYPE_OUTPUT : 		   ((type == HID_FEATURE_REPORT) ? HID_REPORT_TYPE_FEATURE:0));		uref.report_id = field->report->id;		uref.field_index = field->index;		uref.usage_index = (usage - field->usage);		uref.usage_code = usage->hid;		uref.value = value;		hiddev_hid_event(hid, &uref);	}#endif}/* * Analyse a received field, and fetch the data from it. The field * content is stored for next report processing (we do differential * reporting to the layer). */static void hid_input_field(struct hid_device *hid, struct hid_field *field, __u8 *data){	unsigned n;	unsigned count = field->report_count;	unsigned offset = field->report_offset;	unsigned size = field->report_size;	__s32 min = field->logical_minimum;	__s32 max = field->logical_maximum;	__s32 value[count]; /* WARNING: gcc specific */	for (n = 0; n < count; n++) {			value[n] = min < 0 ? snto32(extract(data, offset + n * size, size), size) :						    extract(data, offset + n * size, size);			if (!(field->flags & HID_MAIN_ITEM_VARIABLE) /* Ignore report if ErrorRollOver */			    && value[n] >= min && value[n] <= max			    && field->usage[value[n] - min].hid == HID_UP_KEYBOARD + 1)				return;	}	for (n = 0; n < count; n++) {		if (HID_MAIN_ITEM_VARIABLE & field->flags) {			if (field->flags & HID_MAIN_ITEM_RELATIVE) {				if (!value[n]) continue;			} else {				if (value[n] == field->value[n]) continue;			}				hid_process_event(hid, field, &field->usage[n], value[n]);			continue;		}		if (field->value[n] >= min && field->value[n] <= max			&& field->usage[field->value[n] - min].hid			&& search(value, field->value[n], count))				hid_process_event(hid, field, &field->usage[field->value[n] - min], 0);		if (value[n] >= min && value[n] <= max			&& field->usage[value[n] - min].hid			&& search(field->value, value[n], count))				hid_process_event(hid, field, &field->usage[value[n] - min], 1);	}	memcpy(field->value, value, count * sizeof(__s32));}static int hid_input_report(int type, struct urb *urb){	struct hid_device *hid = urb->context;	struct hid_report_enum *report_enum = hid->report_enum + type;	u8 *data = urb->transfer_buffer;	int len = urb->actual_length;	struct hid_report *report;	int n, size;	if (!len) {		dbg("empty report");		return -1;	}#ifdef DEBUG_DATA	printk(KERN_DEBUG __FILE__ ": report (size %u) (%snumbered)\n", len, report_enum->numbered ? "" : "un");#endif	n = 0;				/* Normally report number is 0 */	if (report_enum->numbered) {	/* Device uses numbered reports, data[0] is report number */		n = *data++;		len--;	}#ifdef DEBUG_DATA	{		int i;		printk(KERN_DEBUG __FILE__ ": report %d (size %u) = ", n, len);		for (i = 0; i < n; i++)			printk(" %02x", data[i]);		printk("\n");	}#endif	if (!(report = report_enum->report_id_hash[n])) {		dbg("undefined report_id %d received", n);		return -1;	}#ifdef CONFIG_USB_HIDDEV	/* Notify listeners that a report has been received */	if (hid->claimed & HID_CLAIMED_HIDDEV) {		struct hiddev_usage_ref uref;		memset(&uref, 0, sizeof(uref));		uref.report_type = 		  (type == HID_INPUT_REPORT) ? HID_REPORT_TYPE_INPUT :		  ((type == HID_OUTPUT_REPORT) ? HID_REPORT_TYPE_OUTPUT : 		   ((type == HID_FEATURE_REPORT) ? HID_REPORT_TYPE_FEATURE:0));		uref.report_id = report->id;		uref.field_index = HID_FIELD_INDEX_NONE;		hiddev_hid_event(hid, &uref);	}#endif	size = ((report->size - 1) >> 3) + 1;	if (len < size) {		dbg("report %d is too short, (%d < %d)", report->id, len, size);		return -1;	}	for (n = 0; n < report->maxfield; n++)		hid_input_field(hid, report->field[n], data);	return 0;}/* * Input interrupt completion handler. */static void hid_irq_in(struct urb *urb){	if (urb->status) {		dbg("nonzero status in input irq %d", urb->status);		return;	}	hid_input_report(HID_INPUT_REPORT, urb);}/* * 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 (%d) exceeds report_count (%d)", offset, field->report_count);		hid_dump_field(field, 8);		return -1;	}	if (field->logical_minimum < 0) {		if (value != snto32(s32ton(value, size), size)) {			dbg("value %d is out of range", value);			return -1;		}	}	field->value[offset] = value;	return 0;}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;}/* * Find a report with a specified HID usage. */int hid_find_report_by_usage(struct hid_device *hid, __u32 wanted_usage, struct hid_report **report, int type){	struct hid_report_enum *report_enum = hid->report_enum + type;	struct list_head *list = report_enum->report_list.next;	int i, j;	while (list != &report_enum->report_list) {		*report = (struct hid_report *) list;		list = list->next;		for (i = 0; i < (*report)->maxfield; i++) {			struct hid_field *field = (*report)->field[i];			for (j = 0; j < field->maxusage; j++)				if (field->logical == wanted_usage)					return j;		}	}	return -1;}int hid_find_field_in_report(struct hid_report *report, __u32 wanted_usage, struct hid_field **field){	int i, j;	for (i = 0; i < report->maxfield; i++) {		*field = report->field[i];		for (j = 0; j < (*field)->maxusage; j++)			if ((*field)->usage[j].hid == wanted_usage)				return j;	}	return -1;}static int hid_submit_out(struct hid_device *hid){	struct hid_report *report;	report = hid->out[hid->outtail];	hid_output_report(report, hid->outbuf);	hid->urbout->transfer_buffer_length = ((report->size - 1) >> 3) + 1;	hid->urbout->dev = hid->dev;	dbg("submitting out urb");	if (usb_submit_urb(hid->urbout, GFP_ATOMIC)) {		err("usb_submit_urb(out) failed");		return -1;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av集中营| 欧美电影免费观看高清完整版在线观看| 一区二区三区免费看视频| 国产午夜精品福利| www国产成人| www国产成人| 国产亚洲综合性久久久影院| 欧美精品一区二区久久婷婷| 欧美mv和日韩mv国产网站| 91精品国产综合久久久蜜臀图片| 777a∨成人精品桃花网| 日韩精品一区二区三区在线观看| 在线成人免费视频| 欧美一区二区三区性视频| 日韩欧美黄色影院| 久久精品一区蜜桃臀影院| 国产精品久久毛片| 一区二区三区在线免费播放| 亚洲成人激情社区| 久草热8精品视频在线观看| 国产美女精品人人做人人爽| 高清在线成人网| 色婷婷精品大视频在线蜜桃视频 | 欧美一区二区视频观看视频| 在线播放亚洲一区| 久久久九九九九| 亚洲国产精品影院| 国产麻豆午夜三级精品| 色综合色综合色综合色综合色综合 | 亚洲国产精品t66y| 亚洲一区二区在线播放相泽| 五月天激情小说综合| 另类中文字幕网| www.性欧美| 日韩一区国产二区欧美三区| 久久久高清一区二区三区| 亚洲欧美另类小说视频| 国产曰批免费观看久久久| 91免费精品国自产拍在线不卡 | 91麻豆精品91久久久久同性| 久久蜜臀中文字幕| 亚洲一级二级在线| 国产91清纯白嫩初高中在线观看| 欧美日韩在线电影| 中文在线一区二区| 久久国产麻豆精品| 欧美视频精品在线| 亚洲欧洲精品一区二区精品久久久| 视频一区中文字幕国产| av色综合久久天堂av综合| 日韩欧美国产一区二区在线播放| 亚洲免费在线电影| 丁香婷婷综合五月| 26uuu色噜噜精品一区二区| 一区二区三区成人| 91视频91自| 亚洲欧洲在线观看av| 久久国内精品视频| 欧美成va人片在线观看| 三级一区在线视频先锋| 日本韩国欧美在线| 亚洲女与黑人做爰| 成人午夜视频免费看| 久久久精品日韩欧美| 日韩av一区二区在线影视| 欧洲视频一区二区| 亚洲综合精品久久| 在线一区二区三区四区五区| 国产精品大尺度| av午夜一区麻豆| 成人免费在线播放视频| 成人午夜免费视频| 中日韩免费视频中文字幕| 视频一区国产视频| 97se亚洲国产综合在线| 欧美激情一区二区| 偷拍日韩校园综合在线| 在线电影一区二区三区| 五月婷婷久久综合| 欧美va在线播放| 国产一区二区免费视频| 久久网站最新地址| 成人免费福利片| 久久久亚洲国产美女国产盗摄| 精品一区二区三区视频在线观看| 精品国产凹凸成av人导航| 国内成人自拍视频| 亚洲国产精品激情在线观看 | 在线区一区二视频| 亚洲一二三区在线观看| 在线免费观看一区| 日韩精品乱码免费| 久久蜜桃av一区二区天堂| 国产高清久久久| 亚洲精品中文在线影院| 欧美日韩欧美一区二区| 久久99精品一区二区三区三区| 国产欧美日韩视频一区二区| www.久久久久久久久| 亚洲午夜久久久| 久久久亚洲午夜电影| 91免费精品国自产拍在线不卡| 石原莉奈一区二区三区在线观看| 精品国产自在久精品国产| 成人毛片老司机大片| 亚洲成人资源网| 国产午夜亚洲精品午夜鲁丝片 | 欧美美女网站色| 国产在线一区二区综合免费视频| 国产精品色一区二区三区| 欧美日韩在线播放三区| 国产精品一区二区在线观看网站| 欧美激情一区三区| 欧美日本韩国一区二区三区视频| 国产在线不卡一区| 亚洲欧洲日韩女同| 日韩欧美久久一区| 在线观看亚洲一区| 丁香婷婷综合激情五月色| 三级在线观看一区二区| 亚洲欧洲在线观看av| 欧美另类高清zo欧美| 丁香天五香天堂综合| 亚洲高清免费在线| 国产精品黄色在线观看| 久久五月婷婷丁香社区| 91精品国产日韩91久久久久久| 成人av网站在线观看免费| 奇米精品一区二区三区在线观看一| 中文字幕一区在线观看视频| 精品国产乱码久久久久久久| 欧美三级资源在线| 97国产一区二区| 成人一区二区三区中文字幕| 老鸭窝一区二区久久精品| 天天免费综合色| 夜夜爽夜夜爽精品视频| 国产精品女同互慰在线看| 久久美女高清视频| 精品国产免费人成电影在线观看四季 | 国产大陆a不卡| 久久99最新地址| 美国av一区二区| 日韩av一区二区在线影视| 香蕉加勒比综合久久| 亚洲精品一二三四区| 亚洲精品成人天堂一二三| 中文字幕一区二区三区在线播放| 国产欧美一区二区精品忘忧草| 日韩欧美国产一区二区三区| 91精品国产综合久久蜜臀| 欧美一区二区三区喷汁尤物| 欧美日韩第一区日日骚| 欧美精品国产精品| 欧美乱熟臀69xxxxxx| 3d动漫精品啪啪| 欧美一区二区三级| 精品国产在天天线2019| 久久免费看少妇高潮| 国产欧美一区二区在线| 亚洲婷婷综合色高清在线| 亚洲日本va在线观看| 亚洲日本在线天堂| 亚洲一区在线视频| 五月天久久比比资源色| 日产欧产美韩系列久久99| 毛片不卡一区二区| 国产激情视频一区二区三区欧美| 成人高清伦理免费影院在线观看| 99久久婷婷国产| 欧美亚日韩国产aⅴ精品中极品| 欧美视频精品在线| 久久免费午夜影院| 一区二区三区视频在线看| 午夜欧美在线一二页| 国产真实乱偷精品视频免| 91丨九色丨黑人外教| 91.成人天堂一区| 国产女人aaa级久久久级| 亚洲最快最全在线视频| 久热成人在线视频| 成人h动漫精品一区二区| 欧美日韩中文字幕一区| 欧美精品一区二区精品网| 亚洲精品中文在线| 精品在线一区二区| 91在线一区二区| 精品少妇一区二区三区视频免付费 | 久久电影网站中文字幕 | 亚洲伊人色欲综合网| 黄页网站大全一区二区| 色吊一区二区三区| www日韩大片| 视频一区二区国产| 成人黄色网址在线观看| 欧美精品vⅰdeose4hd| 亚洲欧洲无码一区二区三区| 美女一区二区三区| 欧美三级在线视频| 一区在线中文字幕|