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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? hid-core.c

?? 優(yōu)龍2410linux2.6.8內(nèi)核源代碼
?? C
?? 第 1 頁(yè) / 共 4 頁(yè)
字號(hào):
			return 0;		default:			dbg("unknown local item tag 0x%x", item->tag);			return 0;	}	return 0;}/* * Process a main item. */static int hid_parser_main(struct hid_parser *parser, struct hid_item *item){	__u32 data;	int ret;	data = item_udata(item);	switch (item->tag) {		case HID_MAIN_ITEM_TAG_BEGIN_COLLECTION:			ret = open_collection(parser, data & 0xff);			break;		case HID_MAIN_ITEM_TAG_END_COLLECTION:			ret = close_collection(parser);			break;		case HID_MAIN_ITEM_TAG_INPUT:			ret = hid_add_field(parser, HID_INPUT_REPORT, data);			break;		case HID_MAIN_ITEM_TAG_OUTPUT:			ret = hid_add_field(parser, HID_OUTPUT_REPORT, data);			break;		case HID_MAIN_ITEM_TAG_FEATURE:			ret = hid_add_field(parser, HID_FEATURE_REPORT, data);			break;		default:			dbg("unknown main item tag 0x%x", item->tag);			ret = 0;	}	memset(&parser->local, 0, sizeof(parser->local));	/* Reset the local parser environment */	return ret;}/* * Process a reserved item. */static int hid_parser_reserved(struct hid_parser *parser, struct hid_item *item){	dbg("reserved item type, tag 0x%x", item->tag);	return 0;}/* * Free a report and all registered fields. The field->usage and * field->value table's are allocated behind the field, so we need * only to free(field) itself. */static void hid_free_report(struct hid_report *report){	unsigned n;	for (n = 0; n < report->maxfield; n++)		kfree(report->field[n]);	kfree(report);}/* * Free a device structure, all reports, and all fields. */static void hid_free_device(struct hid_device *device){	unsigned i,j;	hid_ff_exit(device);	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);	kfree(device);}/* * 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));			start = (__u8 *)((__u16 *)start + 1);			return start;		case 3:			item->size++;			if ((end - start) < 4)				return NULL;			item->data.u32 = le32_to_cpu(get_unaligned((__u32*)start));			start = (__u8 *)((__u32 *)start + 1);			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));	if (!(device->collection =kmalloc(sizeof(struct hid_collection) *				   HID_DEFAULT_NUM_COLLECTIONS, GFP_KERNEL))) {		kfree(device);		return NULL;	}	memset(device->collection, 0, sizeof(struct hid_collection) *	       HID_DEFAULT_NUM_COLLECTIONS);	device->collection_size = HID_DEFAULT_NUM_COLLECTIONS;	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->collection);		kfree(device);		return NULL;	}	memcpy(device->rdesc, start, size);	device->rsize = size;	if (!(parser = kmalloc(sizeof(struct hid_parser), GFP_KERNEL))) {		kfree(device->rdesc);		kfree(device->collection);		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");			kfree(device->collection);			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);			kfree(device->collection);			hid_free_device(device);			kfree(parser);			return NULL;		}		if (start == end) {			if (parser->collection_stack_ptr) {				dbg("unbalanced collection at end of report description");				kfree(device->collection);				hid_free_device(device);				kfree(parser);				return NULL;			}			if (parser->local.delimiter_depth) {				dbg("unbalanced delimiter at end of report description");				kfree(device->collection);				hid_free_device(device);				kfree(parser);				return NULL;			}			kfree(parser);			return device;		}	}	dbg("item fetching failed at offset %d\n", (int)(end - start));	kfree(device->collection);	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, struct pt_regs *regs){	hid_dump_input(usage, value);	if (hid->claimed & HID_CLAIMED_INPUT)		hidinput_hid_event(hid, field, usage, value, regs);	if (hid->claimed & HID_CLAIMED_HIDDEV)		hiddev_hid_event(hid, field, usage, value, regs);}/* * 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, struct pt_regs *regs){	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;	value = kmalloc(sizeof(__s32)*count, GFP_ATOMIC);	if (!value)		return;	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)				goto exit;	}	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], regs);			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, regs);		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, regs);	}	memcpy(field->value, value, count * sizeof(__s32));exit:	kfree(value);}static int hid_input_report(int type, struct urb *urb, struct pt_regs *regs){	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 < len; 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;	}	size = ((report->size - 1) >> 3) + 1;	if (len < size) {		dbg("report %d is too short, (%d < %d)", report->id, len, size);		return -1;	}	if (hid->claimed & HID_CLAIMED_HIDDEV)		hiddev_report_event(hid, report);	for (n = 0; n < report->maxfield; n++)		hid_input_field(hid, report->field[n], data, regs);	if (hid->claimed & HID_CLAIMED_INPUT)		hidinput_report_event(hid, report);	return 0;}/* * Input interrupt completion handler. */static void hid_irq_in(struct urb *urb, struct pt_regs *regs){	struct hid_device	*hid = urb->context;	int			status;

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕欧美日韩一区| 99久久99久久精品国产片果冻| 亚洲风情在线资源站| 亚洲蜜臀av乱码久久精品| 亚洲图片你懂的| 国产欧美日韩卡一| 国产精品久久久久久久久图文区| 中文字幕一区二区三区在线播放 | 国产精品人成在线观看免费| 国产三级精品在线| 一色屋精品亚洲香蕉网站| 一区二区三区在线高清| 亚洲午夜三级在线| 麻豆成人久久精品二区三区红 | 成人精品免费看| 成人18视频在线播放| 97精品久久久久中文字幕| 欧美亚洲国产一区二区三区| 91麻豆精品国产自产在线| 日韩一区二区电影网| www一区二区| 椎名由奈av一区二区三区| 一区二区三区在线视频观看58 | 极品瑜伽女神91| 国产成人亚洲综合色影视 | 中文字幕日韩一区二区| 一区二区高清免费观看影视大全| 视频一区视频二区中文| 欧美高清视频不卡网| 欧美电影免费提供在线观看| 中文字幕欧美激情| 亚洲蜜臀av乱码久久精品| 日韩二区三区四区| 国产精品99久久久久| 91福利小视频| 欧美成人精品福利| 中文字幕一区二区三区在线观看| 午夜精品123| 国产99久久久国产精品| 欧美三级在线看| 久久人人爽爽爽人久久久| 一区二区成人在线| 久久99精品国产麻豆不卡| 91在线观看免费视频| 日韩色在线观看| 国产精品大尺度| 久久综合综合久久综合| 91在线观看视频| 日韩精品在线网站| 亚洲综合成人在线| 国产成人亚洲精品狼色在线| 欧美日韩一二区| 中文字幕av一区二区三区高| 日韩影视精彩在线| 菠萝蜜视频在线观看一区| 日韩欧美激情四射| 一区二区三区四区乱视频| 国产综合色在线| 欧美日韩在线综合| 国产精品乱码人人做人人爱| 蜜臀av性久久久久av蜜臀妖精| 91视视频在线直接观看在线看网页在线看| 日韩亚洲欧美一区二区三区| 亚洲精品v日韩精品| 国产精品99精品久久免费| 88在线观看91蜜桃国自产| 亚洲欧美日韩一区| 成人一区二区视频| 欧美videossexotv100| 亚洲一区二区偷拍精品| 成人高清伦理免费影院在线观看| 精品少妇一区二区三区在线播放| 亚洲一区二区三区在线播放| 99精品热视频| 欧美国产一区在线| 国产九九视频一区二区三区| 欧美一区二区三区在线电影| 亚洲一区欧美一区| 99免费精品视频| 中文字幕免费不卡在线| 国产乱人伦偷精品视频不卡| 精品日产卡一卡二卡麻豆| 视频一区视频二区中文| 欧美日韩另类一区| 亚洲一区二区三区自拍| 色一区在线观看| 亚洲另类色综合网站| www.亚洲精品| 国产精品成人一区二区艾草 | 国产在线国偷精品免费看| 日韩欧美在线123| 欧美日韩极品在线观看一区| 亚洲图片激情小说| av在线综合网| 国产精品久久久久久户外露出| 国产精品亚洲一区二区三区在线 | 精品久久久久久无| 麻豆成人久久精品二区三区小说| 91精品国产91久久久久久最新毛片| 亚洲一区av在线| 在线观看日韩毛片| 亚洲在线视频网站| 日本黄色一区二区| 亚洲一区在线看| 欧美日韩国产美| 日日夜夜免费精品| 日韩欧美一区二区视频| 免费黄网站欧美| 欧美精品一区二区三| 国产毛片精品一区| 欧美激情一区在线观看| 不卡av电影在线播放| 亚洲欧美一区二区三区孕妇| 欧美亚洲一区二区在线| 日韩中文字幕麻豆| 不卡视频在线观看| 欧美精品在线一区二区三区| 久久精品人人做人人爽人人| 日本亚洲天堂网| 欧美成人在线直播| 另类小说色综合网站| 日韩欧美国产一区二区三区 | 亚洲自拍偷拍麻豆| 天堂av在线一区| 国产一区二区精品在线观看| 欧美国产激情一区二区三区蜜月| 91福利小视频| 国内精品写真在线观看| 亚洲高清免费视频| 国产日韩精品视频一区| 欧美日本乱大交xxxxx| eeuss国产一区二区三区| 欧美aaa在线| 亚洲三级电影网站| 久久这里只有精品6| 欧美性受xxxx| 国产成人免费视| 日本视频一区二区| 亚洲欧美色一区| 国产欧美日韩激情| 日韩欧美成人一区二区| 欧美色综合网站| av激情成人网| 国产精品夜夜爽| 免费在线观看成人| 麻豆精品久久精品色综合| 亚洲精品免费看| 久久久精品综合| 欧美一卡2卡三卡4卡5免费| 色婷婷精品久久二区二区蜜臀av| 国产米奇在线777精品观看| 日韩激情一二三区| 亚洲精品国久久99热| 国产精品成人免费在线| 久久色在线视频| 石原莉奈在线亚洲二区| 一区二区三区美女| 综合av第一页| 中文字幕人成不卡一区| 国产日韩影视精品| 久久久久久黄色| 337p日本欧洲亚洲大胆精品| 777奇米成人网| 欧美色成人综合| 欧美伊人久久大香线蕉综合69| av电影一区二区| 不卡电影一区二区三区| 国产成人亚洲综合a∨婷婷图片| 韩国三级电影一区二区| 麻豆久久久久久久| 日韩电影网1区2区| 日韩激情视频网站| 首页综合国产亚洲丝袜| 亚洲成人动漫在线观看| 亚洲国产视频在线| 亚洲国产另类精品专区| 亚洲一区二区黄色| 亚洲妇女屁股眼交7| 亚洲第一会所有码转帖| 亚洲国产日韩a在线播放性色| 一区二区在线免费| 亚洲一区精品在线| 亚洲国产视频一区二区| 午夜精品成人在线视频| 日韩精品久久理论片| 美女诱惑一区二区| 久久99精品国产.久久久久久| 久久精品久久99精品久久| 九九国产精品视频| 国产尤物一区二区| 国产成人精品影视| 成人午夜私人影院| 91在线免费视频观看| 欧美中文字幕一区二区三区亚洲| 91国产精品成人| 欧美精品久久一区二区三区| 日韩欧美综合在线| 国产欧美日韩视频一区二区 | 成人毛片视频在线观看| aaa亚洲精品|