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

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

?? serial.c

?? Linux2.4.20針對三星公司的s3c2440內(nèi)核基礎上的一些設備驅(qū)動代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* Configuration description(s) */struct __devinitdata usb_configuration_description serial_description[] = {#ifdef CONFIG_USBD_SERIAL_CDC      {iConfiguration:"CDC 1.1 ACM Configuration",	      bmAttributes:BMATTRIBUTE,	      bMaxPower:BMAXPOWER,	      interfaces:sizeof (cdc_interfaces) /	 sizeof (struct usb_interface_description),      interface_list:cdc_interfaces,},#endif      {iConfiguration:"USB Simple Serial Configuration",	      bmAttributes:BMATTRIBUTE,	      bMaxPower:BMAXPOWER,	      interfaces:sizeof (serial_interfaces) /	 sizeof (struct usb_interface_description),      interface_list:serial_interfaces,},};/* Device Description */struct __devinitdata usb_device_description serial_device_description = {	bDeviceClass:COMMUNICATIONS_DEVICE_CLASS,	bDeviceSubClass:0,	// XXX	bDeviceProtocol:0,	// XXX	idVendor:CONFIG_USBD_VENDORID,	idProduct:CONFIG_USBD_PRODUCTID,	iManufacturer:CONFIG_USBD_MANUFACTURER,	iProduct:CONFIG_USBD_PRODUCT_NAME,	iSerialNumber:CONFIG_USBD_SERIAL_NUMBER_STR,};/* Transmit Function - called by serproto ****************************************************** */static int serial_xmit_data (int interface, unsigned char *data, int data_length){	int port = 0;		// XXX compound device	struct usb_serial_private *serial_private;	struct usb_device_instance *device;	struct urb *urb;	int packet_length = data_length;	dbg_tx (2, "data: %p data_length: %d", data, data_length);	if ((serial_private = get_serial_private (interface)) == NULL) {		dbg_tx (0, "cannot recover serial private");		return -EINVAL;	}	if ((device = serial_private->device) == NULL) {		dbg_tx (0, "cannot recover serial private device");		return -EINVAL;	}	// XXX Check if we are busy	if ((urb = usbd_alloc_urb (serial_private->device,				   (serial_private->device->function_instance_array + port),				   CONFIG_USBD_SERIAL_IN_ENDPOINT | IN, 0)) == NULL) {		dbg_tx (0, "failed to alloc urb");		return -EINVAL;	}#ifdef CONFIG_USBD_SERIAL_SAFE	if (safe) {		__u16 fcs;		dbg_tx (1, "safe mode: padded: %d data_length: %d packet_length: %d", padded,			data_length, packet_length);		// extend length to pad if required		if (padded) {			//packet_length = MAX(packet_length, CONFIG_USBD_SERIAL_IN_PKTSIZE - 2);			//packet_length = MIN(MAX(packet_length, packet_length), CONFIG_USBD_SERIAL_IN_PKTSIZE - 2);			packet_length = CONFIG_USBD_SERIAL_IN_PKTSIZE - 2;			//packet_length = 2;			//packet_length++;		}		// set length and a null byte 		data[packet_length] = data_length << 2;		data[packet_length + 1] = 0;		// compute CRC across data, padding, data_length and null byte		fcs = fcs_compute10 (data, packet_length + 2, CRC10_INITFCS);		// OR CRC into last two bytes		data[packet_length] |= fcs >> 8;		data[packet_length + 1] = fcs & 0xff;		packet_length += 2;		dbg_tx (1, "safe mode: data_length: %d packet_length: %d", data_length,			packet_length);	}#endif	urb->buffer = data;	urb->actual_length = packet_length;	//dbgPRINTmem(dbgflg_usbdfd_tx,3,urb->buffer,urb->actual_length);	dbgPRINTmem (dbgflg_usbdfd_tx, 3, urb->buffer, CONFIG_USBD_SERIAL_IN_PKTSIZE + 4);	// push it down into the usb-device layer	return usbd_send_urb (urb);}/* serial_urb_sent - called to indicate URB transmit finished * @urb: pointer to struct urb * @rc: result */int serial_urb_sent (struct urb *urb){	int port = 0;		// XXX compound device	struct usb_device_instance *device = urb->device;	struct usb_serial_private *serial_private =	    (device->function_instance_array + port)->privdata;	dbg_tx (2, "%s safe: %d length: %d", urb->device->name, safe, urb->actual_length);	serproto_done (serial_private->interface,		       urb->buffer,		       safe ? (urb->buffer[urb->actual_length - 2] >> 2) : urb->actual_length, 0);	usbd_dealloc_urb (urb);	return 0;}/* USB Device Functions ************************************************************************ *//* serial_event - process a device event * */void serial_event (struct usb_device_instance *device, usb_device_event_t event, int data){	int port = 0;		// XXX compound device	struct usb_function_instance *function;	unsigned int flags;	if ((function = device->function_instance_array + port) == NULL) {		dbg_usbe (1, "no function");		return;	}	dbg_usbe (3, "");        switch (event) {        case DEVICE_UNKNOWN:        case DEVICE_INIT:         case DEVICE_CREATE:             case DEVICE_HUB_CONFIGURED:        case DEVICE_RESET:        case DEVICE_ADDRESS_ASSIGNED:        case DEVICE_CONFIGURED:        case DEVICE_DE_CONFIGURED:        case DEVICE_SET_INTERFACE:        case DEVICE_SET_FEATURE:        case DEVICE_CLEAR_FEATURE:        case DEVICE_BUS_INACTIVE:        case DEVICE_BUS_ACTIVITY:        case DEVICE_POWER_INTERRUPTION:        case DEVICE_HUB_RESET:        case DEVICE_DESTROY:        case DEVICE_FUNCTION_PRIVATE:                dbg_usbe (1,"%s data: %d", usbd_device_events[event], data);                break;        default:                dbg_usbe (1,"%s", usbd_device_events[DEVICE_UNKNOWN]);                break;        }	switch (event) {	case DEVICE_UNKNOWN:	case DEVICE_INIT:		break;	case DEVICE_CREATE:		{			int i;			int interface;			struct usb_serial_private *serial_private;			// There is no way to indicate error, so make this unconditional			// and undo it in the DESTROY event unconditionally as well.			// It the responsibility of the USBD core and the bus interface			// to see that there is a matching DESTROY for every CREATE.			// XXX XXX MOD_INC_USE_COUNT;  // Before any sleepable fns such as kmalloc			// XXX XXX dbg_init(0,"CREATE sc=%d uc=%d",serial_created,GET_USE_COUNT(THIS_MODULE));			// sanity checks			if (serial_created >= MAX_INTERFACES) {				dbg_usbe (1,					  "---> CREATE %s serial_created >= MAX_INTERFACES %d %d",					  device->name, serial_created, MAX_INTERFACES);				dbg_init (0, "CREATE Z1 sc=%d uc=%d", serial_created,					  GET_USE_COUNT (THIS_MODULE));				return;			}			write_lock_irqsave (&serial_rwlock, flags);			for (i = 0; i < MAX_INTERFACES; i++) {				if (serial_private_array[i] == NULL) {					break;				}			}			if (i >= MAX_INTERFACES) {				write_unlock_irqrestore (&serial_rwlock, flags);				dbg_usbe (1, "---> CREATE %s no free interfaces %d %d",					  device->name, i, MAX_INTERFACES);				dbg_init (0, "CREATE Z2 sc=%d uc=%d", serial_created,					  GET_USE_COUNT (THIS_MODULE));				return;			}			serial_created++;			// allocate private data			if ((serial_private =			     kmalloc (sizeof (struct usb_serial_private), GFP_ATOMIC)) == NULL) {				serial_created--;				//MOD_DEC_USE_COUNT;				//dbg_init(0,"CREATE X1 sc=%d uc=%d",serial_created,GET_USE_COUNT(THIS_MODULE));				write_unlock_irqrestore (&serial_rwlock, flags);				dbg_usbe (1, "---> CREATE malloc failed %s", device->name);				return;			}			serial_private->rwlock = RW_LOCK_UNLOCKED;			serial_private_array[i] = serial_private;			write_unlock_irqrestore (&serial_rwlock, flags);			dbg_usbe (1, "---> calling serproto_create(%s,-,%u,%u,%u,%u,%u)", "ttyUSBx",				  CONFIG_USBD_SERIAL_IN_PKTSIZE, txqueue_urbs, txqueue_bytes, safe,				  safe ? 2 : 0);			if ((interface = serproto_create ("ttyUSBx", serial_xmit_data,							  (safe							   ? (CONFIG_USBD_SERIAL_IN_PKTSIZE -							      2) : CONFIG_USBD_SERIAL_IN_PKTSIZE),							  txqueue_urbs, txqueue_bytes, safe,							  safe ? 2 : 0)) < 0) {				// lock and modify device array				write_lock_irqsave (&serial_rwlock, flags);				kfree (serial_private);				serial_created--;				//MOD_DEC_USE_COUNT;				//dbg_init(0,"CREATE X2 sc=%d uc=%d",serial_created,GET_USE_COUNT(THIS_MODULE));				write_unlock_irqrestore (&serial_rwlock, flags);				dbg_usbe (1, "---> serproto_create FAILED");				return;			}			// lock and modify device array			write_lock_irqsave (&serial_rwlock, flags);			serial_private->interface = interface;			serial_private->device = device;			write_unlock_irqrestore (&serial_rwlock, flags);			function->privdata = serial_private;			dbg_usbe (1, "---> START %s privdata assigned: %p interface: %d",				  device->name, serial_private, interface);			return;		}		break;	case DEVICE_HUB_CONFIGURED:		break;	case DEVICE_RESET:		break;	case DEVICE_ADDRESS_ASSIGNED:		break;	case DEVICE_CONFIGURED:		{			struct usb_serial_private *serial_private;			int interface;			if ((serial_private =			     (device->function_instance_array + port)->privdata) == NULL) {				return;			}			interface = serial_private->interface;			if (interface < 0 || interface >= MAX_INTERFACES) {				return;			}			serproto_control (interface, SERPROTO_CONNECT);		}		break;	case DEVICE_SET_INTERFACE:#ifdef CONFIG_USBD_SERIAL_CDC#endif		break;	case DEVICE_SET_FEATURE:		break;	case DEVICE_CLEAR_FEATURE:		break;	case DEVICE_DE_CONFIGURED:		{			struct usb_serial_private *serial_private;			int interface;			if ((serial_private =			     (device->function_instance_array + port)->privdata) == NULL) {				return;			}			interface = serial_private->interface;			if (interface < 0 || interface >= MAX_INTERFACES) {				return;			}			serproto_control (interface, SERPROTO_DISCONNECT);		}		break;	case DEVICE_BUS_INACTIVE:		break;	case DEVICE_BUS_ACTIVITY:		break;	case DEVICE_POWER_INTERRUPTION:		break;	case DEVICE_HUB_RESET:		break;	case DEVICE_DESTROY:		{			struct usb_serial_private *serial_private;			int interface;			if ((serial_private =			     (device->function_instance_array + port)->privdata) == NULL) {				dbg_usbe (1, "---> DESTROY %s serial_private null", device->name);				// XXX XXX MOD_DEC_USE_COUNT;				// XXX XXX dbg_init(0,"DESTROY Z1 sc=%d uc=%d",serial_created,GET_USE_COUNT(THIS_MODULE));				return;			}			dbg_usbe (1, "---> DESTROY %s serial_private %p", device->name,				  serial_private);			interface = serial_private->interface;			if (interface < 0 || interface >= MAX_INTERFACES) {				// XXX XXX MOD_DEC_USE_COUNT;				// XXX XXX dbg_init(0,"DESTROY Z2 sc=%d uc=%d",serial_created,GET_USE_COUNT(THIS_MODULE));				return;			}			if (serial_private_array[interface] != serial_private) {				// XXX XXX MOD_DEC_USE_COUNT;				// XXX XXX dbg_init(0,"DESTROY Z3 sc=%d uc=%d",serial_created,GET_USE_COUNT(THIS_MODULE));				return;			}			write_lock_irqsave (&serial_rwlock, flags);			serial_private_array[interface] = NULL;			kfree (serial_private);			serial_created--;			write_unlock_irqrestore (&serial_rwlock, flags);			serproto_destroy (interface);			// XXX XXX MOD_DEC_USE_COUNT;			// XXX XXX dbg_init(0,"DESTROY sc=%d uc=%d",serial_created,GET_USE_COUNT(THIS_MODULE));			dbg_usbe (1, "---> STOP %s", device->name);			return;		}		break;	case DEVICE_FUNCTION_PRIVATE:		break;	}}/* serial_recv_urb - called to indicate URB has been received * @urb - pointer to struct urb * * Return non-zero if we failed and urb is still valid (not disposed) */int serial_recv_urb (struct urb *urb){	int port = 0;		// XXX compound device	struct usb_device_instance *device = urb->device;	struct usb_serial_private *serial_private =	    (device->function_instance_array + port)->privdata;	int interface = serial_private->interface;	dbg_rx (2, "length=%d", urb->actual_length);	dbgPRINTmem (dbgflg_usbdfd_rx, 3, urb->buffer, urb->actual_length);#ifdef CONFIG_USBD_SERIAL_SAFE	if (safe) {		__u16 fcs;		if ((fcs = fcs_compute10 (urb->buffer, urb->actual_length, CRC10_INITFCS))) {			dbg_rx (0, "CRC check failed");			//return -EINVAL;		} else {			// recover the length from the trailer			urb->actual_length = (urb->buffer[urb->actual_length - 2] >> 2);		}	}	dbg_rx (2, "revised length=%d", urb->actual_length);#endif#if 0	if (0 != dbgflg_usbdfd_loopback) {		if (usbd_send_urb (urb)) {			//XXX verify not freed in usbd_send_urb()			//urb->buffer = NULL;			//urb->actual_length = 0;			//usbd_dealloc_urb(urb);		}		return 0;	}#endif	// push the data up	if (serproto_recv (interface, urb->buffer, urb->actual_length)) {		return (1);	}	// free urb	usbd_recycle_urb (urb);	return (0);}struct usb_function_operations function_ops = {	event:serial_event,	recv_urb:serial_recv_urb,	urb_sent:serial_urb_sent};struct usb_function_driver function_driver = {	name:"function prototype",	ops:&function_ops,	device_description:&serial_device_description,	configurations:sizeof (serial_description) / sizeof (struct usb_configuration_description),	configuration_description:serial_description,	this_module:THIS_MODULE,};/* * serial_modinit - module init * */static int __init serial_modinit (void){	debug_option *op = find_debug_option (dbg_table, "ser");	printk (KERN_INFO "%s (%s)\n", __usbd_module_info, dbg);#ifdef CONFIG_USBD_SERIAL_SAFE	printk (KERN_INFO "vendor_id: %04x product_id: %04x safe: %d padded: %d\n", vendor_id,		product_id, safe, padded);#else	printk (KERN_INFO "vendor_id: %04x product_id: %04x\n", vendor_id, product_id);	if (safe || padded) {		printk (KERN_ERR "serial_fd: not compiled for safe mode\n");		return -EINVAL;	}#endif	printk (KERN_INFO "dbg: %s\n", dbg);	if (NULL != op) {		op->sub_table = serproto_get_dbg_table ();	}	if (0 != scan_debug_options ("serial_fd", dbg_table, dbg)) {		return (-EINVAL);	}	if (vendor_id) {		serial_device_description.idVendor = vendor_id;	}	if (product_id) {		serial_device_description.idProduct = product_id;	}	// Initialize the function registration code.	//	//if (usbd_strings_init()) {	//    return -EINVAL;	//}	// initialize the serproto library	//	if (serproto_modinit ("ttyUSBn", MAX_INTERFACES)) {		return -EINVAL;	}	// register us with the usb device support layer	//	if (usbd_register_function (&function_driver)) {		serproto_modexit ();		return -EINVAL;	}	dbg_loop (1, "LOOPBACK mode");	// return	return 0;}/* serial_modexit - module cleanup */static void __exit serial_modexit (void){	// de-register us with the usb device support layer	// 	usbd_deregister_function (&function_driver);	// tell the serproto library to exit	//	serproto_modexit ();}module_init (serial_modinit);module_exit (serial_modexit);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人午夜碰碰视频| 三级久久三级久久久| 盗摄精品av一区二区三区| 久久久久久一二三区| 中文字幕一区二区三区在线播放| 国产精品夜夜嗨| 国产欧美精品一区| av电影在线观看完整版一区二区| 亚洲视频在线观看一区| 精品视频在线视频| 最新不卡av在线| 色悠久久久久综合欧美99| 亚洲国产色一区| 91免费视频观看| 日本中文字幕不卡| 欧美日韩在线不卡| 久久99国产精品尤物| 中文字幕一区二区三区蜜月| 国产91富婆露脸刺激对白| 亚洲视频网在线直播| 7799精品视频| 成人av综合一区| 国产精品久久久久久亚洲毛片| 91老师片黄在线观看| 免费高清在线视频一区·| 5566中文字幕一区二区电影| 国产一区日韩二区欧美三区| 精品国产欧美一区二区| 94-欧美-setu| 激情综合五月天| 久久综合国产精品| 欧美午夜精品电影| 国产一区 二区 三区一级| 精品999在线播放| 另类小说欧美激情| 日韩欧美一区中文| 美国一区二区三区在线播放| 国产精品久久久久aaaa樱花| 欧美一区二区在线看| 美女精品一区二区| 精品国产91九色蝌蚪| 国产一区激情在线| 亚洲午夜一区二区三区| 国产清纯在线一区二区www| 成人黄色小视频在线观看| 国产精品成人午夜| 欧美大片在线观看一区二区| 色婷婷综合久久久久中文一区二区 | 日韩一区二区三区免费观看 | 91麻豆精品视频| 亚洲成人精品一区| 国产精品乱码久久久久久| 日韩欧美一级在线播放| 国内精品伊人久久久久av一坑| 久久久久久黄色| 日韩视频在线永久播放| 欧美色大人视频| 色老综合老女人久久久| 成人午夜视频在线| 亚洲一区二区成人在线观看| 欧美美女一区二区在线观看| 91免费版在线| 成人激情动漫在线观看| 国产成a人亚洲| 亚洲欧美日韩国产综合| 国产精品伦理在线| 精品污污网站免费看| 91高清在线观看| 精品一区二区综合| 久久精品国产成人一区二区三区| 婷婷中文字幕综合| 日韩精品一级二级 | 日韩精品一区二区三区视频| 欧美剧在线免费观看网站| 91国内精品野花午夜精品| 99国产精品久久久久久久久久久| 艳妇臀荡乳欲伦亚洲一区| 亚洲免费观看视频| 26uuu久久综合| 久久久亚洲精品石原莉奈| 欧美艳星brazzers| 欧美在线一区二区三区| 国产综合久久久久影院| 国产精品综合在线视频| 亚洲成人免费看| 亚洲国产激情av| 国产精品久久久久久久久快鸭| 欧美女孩性生活视频| 成人精品高清在线| 成人av网在线| 国产精品一级在线| 成人美女视频在线看| 91麻豆高清视频| 福利一区二区在线| 麻豆久久久久久久| 亚洲网友自拍偷拍| 美女在线视频一区| 国产福利91精品一区| 91美女在线视频| 成人性生交大合| 91在线视频播放| 国产宾馆实践打屁股91| 91蝌蚪porny| 91.xcao| 精品视频在线免费| 欧美mv日韩mv国产网站| 中文乱码免费一区二区| 久久网站最新地址| 日韩欧美成人一区二区| 91.麻豆视频| 中文字幕第一区综合| 久久精品在这里| 一区二区三区欧美亚洲| 黄一区二区三区| 久久99精品视频| 91网站在线观看视频| 日韩视频一区在线观看| 国产精品久久国产精麻豆99网站| 亚洲国产精品久久久男人的天堂| 国内精品视频666| 久久99精品久久久久久动态图| 日韩精品高清不卡| 天天av天天翘天天综合网色鬼国产 | 日韩欧美精品在线| 欧美一区二区视频网站| 国产精品国产三级国产普通话蜜臀 | 在线免费观看日本欧美| 欧美精品一区二区在线观看| 欧美电影在哪看比较好| 中文字幕不卡在线观看| 免费观看在线综合| 欧美性受xxxx黑人xyx性爽| 国产日韩欧美综合一区| 青青草国产精品亚洲专区无| 另类综合日韩欧美亚洲| 精品一区二区在线免费观看| 欧美日韩综合在线| 亚洲欧洲精品一区二区三区| 亚洲欧美激情一区二区| 亚洲福利电影网| 成人国产精品免费观看| 精品乱人伦一区二区三区| 中文字幕欧美日本乱码一线二线| 国产精品久久久久久久久免费丝袜 | 中文字幕免费在线观看视频一区| 美女尤物国产一区| 成人亚洲精品久久久久软件| 日韩欧美国产一区在线观看| 中文字幕精品一区二区精品绿巨人| 日本欧美大码aⅴ在线播放| 九九**精品视频免费播放| 国产成人免费在线| 91美女视频网站| 国产精品水嫩水嫩| 性做久久久久久久久| 捆绑调教美女网站视频一区| 欧美精选在线播放| 欧美激情在线看| 国产精品自拍av| 久久美女高清视频| 国产在线国偷精品免费看| 欧美一二三四在线| 看片的网站亚洲| 一本到一区二区三区| 欧美一区二区三区免费在线看| 亚洲福利视频一区| 成人午夜短视频| 在线播放日韩导航| 天堂一区二区在线| 欧美老肥妇做.爰bbww视频| 久久日一线二线三线suv| 久久国产综合精品| 久久一二三国产| 日韩在线一二三区| av亚洲精华国产精华精华| 久久无码av三级| 成人白浆超碰人人人人| 一区二区三区在线视频免费观看| 91社区在线播放| 亚洲国产精品麻豆| 日韩一区二区三区免费观看| 国内久久精品视频| 中文字幕亚洲在| 韩国v欧美v日本v亚洲v| 国产欧美一区二区精品忘忧草 | 久久综合久色欧美综合狠狠| 国产精品99久久久久久似苏梦涵| 欧美国产日本韩| 91福利区一区二区三区| 日韩成人dvd| 欧美精品一区二区三区在线| 日韩影院精彩在线| 日本韩国精品在线| 蜜臀av一区二区在线免费观看| 91一区二区在线观看| 日韩中文字幕麻豆| 国产精品视频一二三区| 欧美午夜一区二区三区免费大片| 免费观看日韩电影| 日韩一区二区三区电影在线观看|