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

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

?? bluetooth.c

?? S3C2440ARM9開發板的USB驅動程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
			printk ("%.2x ", data[i]);		}		printk ("\n");	}#endif#ifdef BTBUGGYHARDWARE	if ((count == 4) && (data[0] == 0x00) && (data[1] == 0x00)	    && (data[2] == 0x00) && (data[3] == 0x00)) {		urb->actual_length = 0;		FILL_BULK_URB(bluetooth->read_urb, bluetooth->dev, 			      usb_rcvbulkpipe(bluetooth->dev, bluetooth->bulk_in_endpointAddress),			      bluetooth->bulk_in_buffer, bluetooth->bulk_in_buffer_size, 			      bluetooth_read_bulk_callback, bluetooth);		result = usb_submit_urb(bluetooth->read_urb);		if (result)			err ("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);		return;	}#endif	/* We add  a packet type identifier to the beginning of each	   HCI frame.  This makes the data in the tty look like a	   serial USB devices.  Each HCI frame can be broken across	   multiple URBs so we buffer them until we have a full hci	   packet */		if (!bluetooth->bulk_packet_pos) {		bluetooth->bulk_buffer[0] = ACL_PKT;		bluetooth->bulk_packet_pos++;	}	if (bluetooth->bulk_packet_pos + count > ACL_BUFFER_SIZE) {		err("%s - exceeded ACL_BUFFER_SIZE", __FUNCTION__);		bluetooth->bulk_packet_pos = 0;		goto exit;	}	memcpy (&bluetooth->bulk_buffer[bluetooth->bulk_packet_pos],		urb->transfer_buffer, count);	bluetooth->bulk_packet_pos += count;	urb->actual_length = 0;	if (bluetooth->bulk_packet_pos >= ACL_HDR_SIZE) {		packet_size = CHAR2INT16(bluetooth->bulk_buffer[4],bluetooth->bulk_buffer[3]);	} else {		goto exit;	}	if (packet_size + ACL_HDR_SIZE < bluetooth->bulk_packet_pos) {		err("%s - packet was too long", __FUNCTION__);		bluetooth->bulk_packet_pos = 0;		goto exit;	}	if (packet_size + ACL_HDR_SIZE == bluetooth->bulk_packet_pos) {		for (i = 0; i < bluetooth->bulk_packet_pos; ++i) {			/* if we insert more than TTY_FLIPBUF_SIZE characters, we drop them. */			if (bluetooth->tty->flip.count >= TTY_FLIPBUF_SIZE) {				tty_flip_buffer_push(bluetooth->tty);			}			tty_insert_flip_char(bluetooth->tty, bluetooth->bulk_buffer[i], 0);		}		tty_flip_buffer_push(bluetooth->tty);		bluetooth->bulk_packet_pos = 0;	}	exit:	if (!bluetooth || !bluetooth->open_count)		return;	FILL_BULK_URB(bluetooth->read_urb, bluetooth->dev, 		      usb_rcvbulkpipe(bluetooth->dev, bluetooth->bulk_in_endpointAddress),		      bluetooth->bulk_in_buffer, bluetooth->bulk_in_buffer_size, 		      bluetooth_read_bulk_callback, bluetooth);	result = usb_submit_urb(bluetooth->read_urb);	if (result)		err ("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);	return;}static void bluetooth_write_bulk_callback (struct urb *urb){	struct usb_bluetooth *bluetooth = get_usb_bluetooth ((struct usb_bluetooth *)urb->context, __FUNCTION__);	dbg("%s", __FUNCTION__);	if (!bluetooth) {		dbg("%s - bad bluetooth pointer, exiting", __FUNCTION__);		return;	}	if (urb->status) {		dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);		return;	}	/* wake up our little function to let the tty layer know that something happened */	queue_task(&bluetooth->tqueue, &tq_immediate);	mark_bh(IMMEDIATE_BH);	return;}static void bluetooth_softint(void *private){	struct usb_bluetooth *bluetooth = get_usb_bluetooth ((struct usb_bluetooth *)private, __FUNCTION__);	struct tty_struct *tty;	dbg("%s", __FUNCTION__);	if (!bluetooth) {		return;	}	tty = bluetooth->tty;	if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup) {		dbg("%s - write wakeup call.", __FUNCTION__);		(tty->ldisc.write_wakeup)(tty);	}	wake_up_interruptible(&tty->write_wait);}static void * usb_bluetooth_probe(struct usb_device *dev, unsigned int ifnum,			 	  const struct usb_device_id *id){	struct usb_bluetooth *bluetooth = NULL;	struct usb_interface_descriptor *interface;	struct usb_endpoint_descriptor *endpoint;	struct usb_endpoint_descriptor *interrupt_in_endpoint[8];	struct usb_endpoint_descriptor *bulk_in_endpoint[8];	struct usb_endpoint_descriptor *bulk_out_endpoint[8];	int control_out_endpoint;	int minor;	int buffer_size;	int i;	int num_interrupt_in = 0;	int num_bulk_in = 0;	int num_bulk_out = 0;	interface = &dev->actconfig->interface[ifnum].altsetting[0];	control_out_endpoint = interface->bInterfaceNumber;	/* find the endpoints that we need */	for (i = 0; i < interface->bNumEndpoints; ++i) {		endpoint = &interface->endpoint[i];		if ((endpoint->bEndpointAddress & 0x80) &&		    ((endpoint->bmAttributes & 3) == 0x02)) {			/* we found a bulk in endpoint */			dbg("found bulk in");			bulk_in_endpoint[num_bulk_in] = endpoint;			++num_bulk_in;		}		if (((endpoint->bEndpointAddress & 0x80) == 0x00) &&		    ((endpoint->bmAttributes & 3) == 0x02)) {			/* we found a bulk out endpoint */			dbg("found bulk out");			bulk_out_endpoint[num_bulk_out] = endpoint;			++num_bulk_out;		}		if ((endpoint->bEndpointAddress & 0x80) &&		    ((endpoint->bmAttributes & 3) == 0x03)) {			/* we found a interrupt in endpoint */			dbg("found interrupt in");			interrupt_in_endpoint[num_interrupt_in] = endpoint;			++num_interrupt_in;		}	}	/* according to the spec, we can only have 1 bulk_in, 1 bulk_out, and 1 interrupt_in endpoints */	if ((num_bulk_in != 1) ||	    (num_bulk_out != 1) ||	    (num_interrupt_in != 1)) {		dbg ("%s - improper number of endpoints. Bluetooth driver not bound.", __FUNCTION__);		return NULL;	}	MOD_INC_USE_COUNT;	info("USB Bluetooth converter detected");	for (minor = 0; minor < BLUETOOTH_TTY_MINORS && bluetooth_table[minor]; ++minor)		;	if (bluetooth_table[minor]) {		err("No more free Bluetooth devices");		MOD_DEC_USE_COUNT;		return NULL;	}	if (!(bluetooth = kmalloc(sizeof(struct usb_bluetooth), GFP_KERNEL))) {		err("Out of memory");		MOD_DEC_USE_COUNT;		return NULL;	}	memset(bluetooth, 0, sizeof(struct usb_bluetooth));	bluetooth->magic = USB_BLUETOOTH_MAGIC;	bluetooth->dev = dev;	bluetooth->minor = minor;	bluetooth->tqueue.routine = bluetooth_softint;	bluetooth->tqueue.data = bluetooth;	init_MUTEX(&bluetooth->lock);	/* record the interface number for the control out */	bluetooth->control_out_bInterfaceNum = control_out_endpoint;		/* create our control out urb pool */ 	for (i = 0; i < NUM_CONTROL_URBS; ++i) {		struct urb  *urb = usb_alloc_urb(0);		if (urb == NULL) {			err("No free urbs available");			goto probe_error;		}		urb->transfer_buffer = NULL;		bluetooth->control_urb_pool[i] = urb;	}	/* set up the endpoint information */	endpoint = bulk_in_endpoint[0];	bluetooth->read_urb = usb_alloc_urb (0);	if (!bluetooth->read_urb) {		err("No free urbs available");		goto probe_error;	}	bluetooth->bulk_in_buffer_size = buffer_size = endpoint->wMaxPacketSize;	bluetooth->bulk_in_endpointAddress = endpoint->bEndpointAddress;	bluetooth->bulk_in_buffer = kmalloc (buffer_size, GFP_KERNEL);	if (!bluetooth->bulk_in_buffer) {		err("Couldn't allocate bulk_in_buffer");		goto probe_error;	}	FILL_BULK_URB(bluetooth->read_urb, dev, usb_rcvbulkpipe(dev, endpoint->bEndpointAddress),		      bluetooth->bulk_in_buffer, buffer_size, bluetooth_read_bulk_callback, bluetooth);	endpoint = bulk_out_endpoint[0];	bluetooth->bulk_out_endpointAddress = endpoint->bEndpointAddress;	bluetooth->bulk_out_buffer_size = endpoint->wMaxPacketSize * 2;	/* create our write urb pool */ 	for (i = 0; i < NUM_BULK_URBS; ++i) {		struct urb  *urb = usb_alloc_urb(0);		if (urb == NULL) {			err("No free urbs available");			goto probe_error;		}		urb->transfer_buffer = kmalloc (bluetooth->bulk_out_buffer_size, GFP_KERNEL);		if (urb->transfer_buffer == NULL) {			err("out of memory");			goto probe_error;		}		bluetooth->write_urb_pool[i] = urb;	}	endpoint = interrupt_in_endpoint[0];	bluetooth->interrupt_in_urb = usb_alloc_urb(0);	if (!bluetooth->interrupt_in_urb) {		err("No free urbs available");		goto probe_error;	}	bluetooth->interrupt_in_buffer_size = buffer_size = endpoint->wMaxPacketSize;	bluetooth->interrupt_in_endpointAddress = endpoint->bEndpointAddress;	bluetooth->interrupt_in_interval = endpoint->bInterval;	bluetooth->interrupt_in_buffer = kmalloc (buffer_size, GFP_KERNEL);	if (!bluetooth->interrupt_in_buffer) {		err("Couldn't allocate interrupt_in_buffer");		goto probe_error;	}	FILL_INT_URB(bluetooth->interrupt_in_urb, dev, usb_rcvintpipe(dev, endpoint->bEndpointAddress),		     bluetooth->interrupt_in_buffer, buffer_size, bluetooth_int_callback,		     bluetooth, endpoint->bInterval);	/* initialize the devfs nodes for this device and let the user know what bluetooths we are bound to */	tty_register_devfs (&bluetooth_tty_driver, 0, minor);	info("Bluetooth converter now attached to ttyUB%d (or usb/ttub/%d for devfs)", minor, minor);	bluetooth_table[minor] = bluetooth;	return bluetooth; /* success */probe_error:	if (bluetooth->read_urb)		usb_free_urb (bluetooth->read_urb);	if (bluetooth->bulk_in_buffer)		kfree (bluetooth->bulk_in_buffer);	if (bluetooth->interrupt_in_urb)		usb_free_urb (bluetooth->interrupt_in_urb);	if (bluetooth->interrupt_in_buffer)		kfree (bluetooth->interrupt_in_buffer);	for (i = 0; i < NUM_BULK_URBS; ++i)		if (bluetooth->write_urb_pool[i]) {			if (bluetooth->write_urb_pool[i]->transfer_buffer)				kfree (bluetooth->write_urb_pool[i]->transfer_buffer);			usb_free_urb (bluetooth->write_urb_pool[i]);		}	for (i = 0; i < NUM_CONTROL_URBS; ++i) 		if (bluetooth->control_urb_pool[i]) {			if (bluetooth->control_urb_pool[i]->transfer_buffer)				kfree (bluetooth->control_urb_pool[i]->transfer_buffer);			usb_free_urb (bluetooth->control_urb_pool[i]);		}	bluetooth_table[minor] = NULL;	/* free up any memory that we allocated */	kfree (bluetooth);	MOD_DEC_USE_COUNT;	return NULL;}static void usb_bluetooth_disconnect(struct usb_device *dev, void *ptr){	struct usb_bluetooth *bluetooth = (struct usb_bluetooth *) ptr;	int i;	if (bluetooth) {		if ((bluetooth->open_count) && (bluetooth->tty))			tty_hangup(bluetooth->tty);		bluetooth->open_count = 0;		if (bluetooth->read_urb) {			usb_unlink_urb (bluetooth->read_urb);			usb_free_urb (bluetooth->read_urb);		}		if (bluetooth->bulk_in_buffer)			kfree (bluetooth->bulk_in_buffer);		if (bluetooth->interrupt_in_urb) {			usb_unlink_urb (bluetooth->interrupt_in_urb);			usb_free_urb (bluetooth->interrupt_in_urb);		}		if (bluetooth->interrupt_in_buffer)			kfree (bluetooth->interrupt_in_buffer);		tty_unregister_devfs (&bluetooth_tty_driver, bluetooth->minor);		for (i = 0; i < NUM_BULK_URBS; ++i) {			if (bluetooth->write_urb_pool[i]) {				usb_unlink_urb (bluetooth->write_urb_pool[i]);				if (bluetooth->write_urb_pool[i]->transfer_buffer)					kfree (bluetooth->write_urb_pool[i]->transfer_buffer);				usb_free_urb (bluetooth->write_urb_pool[i]);			}		}		for (i = 0; i < NUM_CONTROL_URBS; ++i) {			if (bluetooth->control_urb_pool[i]) {				usb_unlink_urb (bluetooth->control_urb_pool[i]);				if (bluetooth->control_urb_pool[i]->transfer_buffer)					kfree (bluetooth->control_urb_pool[i]->transfer_buffer);				usb_free_urb (bluetooth->control_urb_pool[i]);			}		}				info("Bluetooth converter now disconnected from ttyUB%d", bluetooth->minor);		bluetooth_table[bluetooth->minor] = NULL;		/* free up any memory that we allocated */		kfree (bluetooth);	} else {		info("device disconnected");	}	MOD_DEC_USE_COUNT;}static struct tty_driver bluetooth_tty_driver = {	.magic =		TTY_DRIVER_MAGIC,	.driver_name =		"usb-bluetooth",	.name =			"usb/ttub/%d",	.major =		BLUETOOTH_TTY_MAJOR,	.minor_start =		0,	.num =			BLUETOOTH_TTY_MINORS,	.type =			TTY_DRIVER_TYPE_SERIAL,	.subtype =		SERIAL_TYPE_NORMAL,	.flags =		TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS,	.refcount =		&bluetooth_refcount,	.table =		bluetooth_tty,	.termios =		bluetooth_termios,	.termios_locked =	bluetooth_termios_locked,	.open =			bluetooth_open,	.close =		bluetooth_close,	.write =		bluetooth_write,	.write_room =		bluetooth_write_room,	.ioctl =		bluetooth_ioctl,	.set_termios =		bluetooth_set_termios,	.throttle =		bluetooth_throttle,	.unthrottle =		bluetooth_unthrottle,	.chars_in_buffer =	bluetooth_chars_in_buffer,};int usb_bluetooth_init(void){	int i;	int result;	/* Initalize our global data */	for (i = 0; i < BLUETOOTH_TTY_MINORS; ++i) {		bluetooth_table[i] = NULL;	}	info ("USB Bluetooth support registered");	/* register the tty driver */	bluetooth_tty_driver.init_termios          = tty_std_termios;	bluetooth_tty_driver.init_termios.c_cflag  = B9600 | CS8 | CREAD | HUPCL | CLOCAL;	if (tty_register_driver (&bluetooth_tty_driver)) {		err("%s - failed to register tty driver", __FUNCTION__);		return -1;	}	/* register the USB driver */	result = usb_register(&usb_bluetooth_driver);	if (result < 0) {		tty_unregister_driver(&bluetooth_tty_driver);		err("usb_register failed for the USB bluetooth driver. Error number %d", result);		return -1;	}	info(DRIVER_DESC " " DRIVER_VERSION);	return 0;}void usb_bluetooth_exit(void){	usb_deregister(&usb_bluetooth_driver);	tty_unregister_driver(&bluetooth_tty_driver);}module_init(usb_bluetooth_init);module_exit(usb_bluetooth_exit);/* Module information */MODULE_AUTHOR( DRIVER_AUTHOR );MODULE_DESCRIPTION( DRIVER_DESC );MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产呦精品一区二区三区网站| 国产高清久久久久| 狠狠色丁香婷综合久久| 99久久综合精品| 欧美zozozo| 日韩高清国产一区在线| 色婷婷一区二区| 国产精品亲子伦对白| 成人av午夜电影| 欧美一区二区播放| 亚洲影视在线播放| 91免费在线播放| 中文字幕不卡在线| 国产麻豆欧美日韩一区| 欧美成人官网二区| 美国十次综合导航| 欧美一级久久久| 天天av天天翘天天综合网色鬼国产| va亚洲va日韩不卡在线观看| 久久久午夜电影| 狠狠色综合播放一区二区| 91精品在线麻豆| 午夜精彩视频在线观看不卡| 欧美午夜视频网站| 亚洲第一电影网| 欧美日韩黄色影视| 亚洲国产一区二区视频| 欧美影视一区二区三区| 亚洲激情中文1区| 在线一区二区三区四区五区| 综合色中文字幕| 菠萝蜜视频在线观看一区| 国产喷白浆一区二区三区| 国产成人在线色| 国产精品欧美一区二区三区| 国产馆精品极品| 国产三级一区二区三区| 成人综合婷婷国产精品久久蜜臀| 欧美激情一区在线| 成人av在线影院| 一区二区三区色| 91精品国产综合久久福利软件| 免费观看在线色综合| 精品国产百合女同互慰| 国产成人午夜精品影院观看视频 | 国产精品视频线看| 成人综合婷婷国产精品久久 | 国产欧美一区二区三区鸳鸯浴| 国内久久精品视频| 国产精品视频九色porn| 91免费看片在线观看| 亚洲国产一区二区在线播放| 日韩免费在线观看| 成人午夜免费视频| 亚洲综合激情小说| 欧美videossexotv100| 成人精品一区二区三区四区| 亚洲精品乱码久久久久久久久| 正在播放一区二区| 国产精品资源在线看| 亚洲女子a中天字幕| 日韩欧美亚洲另类制服综合在线| 国产精品自拍av| 亚洲国产精品一区二区www在线| 欧美大尺度电影在线| 成人午夜视频网站| 日本不卡一区二区三区| 中文av一区二区| 9191成人精品久久| 国产成人av电影在线观看| 亚洲一二三四区不卡| 精品福利av导航| 欧洲另类一二三四区| 国产乱码精品一区二区三区五月婷 | 中文字幕亚洲视频| 欧美精品免费视频| 99re在线精品| 极品少妇xxxx精品少妇偷拍| 亚洲精品伦理在线| 欧美国产成人精品| 精品国产乱码久久久久久免费| 色噜噜狠狠一区二区三区果冻| 久久国产精品99精品国产| 一区二区三区在线不卡| 国产三级一区二区| 精品国产乱码久久久久久影片| 欧美性猛交xxxxxx富婆| 99精品视频一区二区| 国产不卡一区视频| 久久99精品国产.久久久久久| 亚洲自拍都市欧美小说| 日韩一区有码在线| 国产亚洲女人久久久久毛片| 制服丝袜激情欧洲亚洲| 欧美午夜精品久久久久久孕妇 | 国内精品第一页| 日韩高清不卡在线| 图片区小说区国产精品视频| 中文字幕五月欧美| 日韩女优制服丝袜电影| 久久久久国产精品麻豆ai换脸| 国产一区二区三区视频在线播放| 久久精品国产99久久6| 精品国产91久久久久久久妲己 | 国产精品私人影院| 26uuu亚洲综合色| 日韩一区二区影院| 欧美精品在线观看一区二区| 欧美影片第一页| 欧美体内she精高潮| 色综合天天综合网天天看片| 91丨九色porny丨蝌蚪| 91一区二区在线观看| 99r精品视频| 在线免费观看日本一区| 在线免费观看不卡av| 欧美在线视频全部完| 欧美三级中文字| 91麻豆精品国产91久久久使用方法 | 欧美精品xxxxbbbb| 91麻豆精品国产91久久久资源速度| 91精品一区二区三区久久久久久| 欧美男男青年gay1069videost| 欧美精选午夜久久久乱码6080| 5858s免费视频成人| 日韩一级黄色大片| 精品久久国产字幕高潮| 久久久国产午夜精品| 国产精品美女久久久久久久久久久 | bt欧美亚洲午夜电影天堂| 福利电影一区二区| 91猫先生在线| 欧美老女人在线| 日韩欧美一区二区不卡| 欧美极品少妇xxxxⅹ高跟鞋| 亚洲手机成人高清视频| 首页国产欧美日韩丝袜| 国产永久精品大片wwwapp| av中文字幕不卡| 欧美三电影在线| 337p粉嫩大胆噜噜噜噜噜91av | 国产精品狼人久久影院观看方式| 一区视频在线播放| 日本视频中文字幕一区二区三区| 精品亚洲国内自在自线福利| 9人人澡人人爽人人精品| 69久久99精品久久久久婷婷| 久久精品免费在线观看| 一区二区三区成人| 国内精品第一页| 欧美性感一区二区三区| 国产亚洲女人久久久久毛片| 玉米视频成人免费看| 精品一区二区三区免费播放| 色综合久久久久综合体桃花网| 欧美一区二区三区色| 中文字幕在线观看不卡视频| 男人操女人的视频在线观看欧美 | 国产精品一色哟哟哟| 欧美性受xxxx| 国产精品麻豆视频| 美日韩一区二区| 在线欧美小视频| 久久久国产午夜精品 | 久久一夜天堂av一区二区三区| 亚洲日本免费电影| 国产一区二区在线视频| 欧美另类一区二区三区| 亚洲视频在线观看一区| 国产麻豆视频精品| 日韩免费观看高清完整版在线观看| 亚洲同性gay激情无套| 国产精品一区免费在线观看| 91精品国产综合久久香蕉麻豆| ●精品国产综合乱码久久久久| 国产在线国偷精品产拍免费yy| 在线成人午夜影院| 亚洲一区二区在线播放相泽| 99久久精品国产导航| 亚洲国产成人一区二区三区| 久久99热99| 欧美成人a∨高清免费观看| 午夜精品久久久久久久| 色婷婷av一区二区| 成人欧美一区二区三区黑人麻豆| 国产精品一区二区黑丝| 欧美va天堂va视频va在线| 奇米精品一区二区三区四区| 欧美一区二区视频在线观看| 亚洲成人激情综合网| 91福利在线导航| 一区二区三区在线高清| 欧美亚洲禁片免费| 亚洲国产三级在线| 欧美日韩免费视频| 五月天网站亚洲| 欧美一级二级三级蜜桃| 日韩和欧美的一区| 日韩午夜av电影| 久久99精品久久久|