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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? usb-func.c

?? ARM嵌入式應(yīng)用開發(fā)實例USB項目控制器的實現(xiàn)源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
	else
		rv = 0;
	
	dbg("Leave");
	return rv;
}

static int go_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
	pusb_t s;
	s = (pusb_t) file->private_data;

	err("ioctl %x %x", cmd, arg);
	
	if(cmd != IOCTL_GO_COMMAND) {
		err("cmd != IOCTL_GO_COMMAND");
		return 0;
	}
	err("will OnIoctlProc");

	return OnIoctlProc(s, arg);
}

static int go_open (struct inode *inode, struct file *file)
{
	pusb_t s;
	int minor;
	int rv;

	dbg("Enter");

	rv = 0;
	minor = MINOR(inode->i_rdev);
	dbg("minor = %d", minor);

	if(minor < 0 || minor >= MAX_DEVICES){
		return -ENODEV;
	}

	down(&usb_dev_table_mutex);

	s = usb_dev_table[minor];

	if(s == NULL){
		err("device (%d) not exist", minor);
		up(&usb_dev_table_mutex);
		return -ENODEV;
	}

	if (s->DeviceState != DS_IDLE){
		err("ERROR: device is nod IDLE");
		rv = -EIO;
		goto exit;
	}

	down (&s->mutex);

	s->opened = 1;

	file->f_pos = 0;
	file->private_data = s;
	s->open_count++;

	StreamBuffer_Init(&(s->StreamBuffer));

	s->DeviceState = DS_OPENED;
	s->rd_irq_data.allow_irq = 1;

	up(&s->mutex);

exit:
	up(&usb_dev_table_mutex);

	dbg("Leave");
	return rv;
}

static int go_release (struct inode *inode, struct file *file)
{
	pusb_t s;
	int rv;

	dbg("Enter");

	s = (pusb_t) file->private_data;
	
	/* Lock minor table and our device */
	down(&usb_dev_table_mutex);
	down(&s->mutex);

	if(s->DeviceState != DS_OPENED && s->DeviceState != DS_RUNNING){
		rv = -ENODEV;
		goto exit;
	}

	lock_kernel();

	s->opened = 0;
	StreamBuffer_Uninit(&(s->StreamBuffer));
	
	unlock_kernel();

	if(s->usbdev == NULL){
		up(&s->mutex);
		go_delete(s);
		up(&usb_dev_table_mutex);
		return 0;
	}

	s->DeviceState = DS_IDLE;
	s->rd_irq_data.allow_irq = 0;

exit:
	up(&s->mutex);
	up(&usb_dev_table_mutex);

	dbg("Leave");
	return 0;
}
/*
static struct file_operations go_fops =
{
	owner:		THIS_MODULE,
	read:		go_read,
	write:		go_write,
	open:		go_open,
	release:	go_release,
};
*/

static struct file_operations go_fops =
{
	owner:		THIS_MODULE,
	read:		go_read,
	write:		go_write,
	ioctl:		go_ioctl,
	open:		go_open,
	release:	go_release,
};


/* --------------------------------------------------------------------- */
static void *go_probe (struct usb_device *usbdev, unsigned int ifnum,
			   const struct usb_device_id *id)
{
	int i;
	int minor;
	struct usb_endpoint_descriptor *pEP;
	pusb_t s = NULL;

	dbg("Enter");
	
	dbg("vendor id 0x%x, device id 0x%x ifnum:%d",
		usbdev->descriptor.idVendor, usbdev->descriptor.idProduct, ifnum);

	/* We don't handle multiple configurations */
	if (usbdev->descriptor.bNumConfigurations != 1)
		return NULL;

	down(&usb_dev_table_mutex);

	minor = GODEV_MINOR(usbdev->bus->busnum, usbdev->devnum);
	info("go_probe: Device %d on Bus %d, minor = %d",
		  usbdev->devnum, usbdev->bus->busnum, minor);

	if(minor < 0 || minor >= 256) {
		err("Invalid minor: %d", minor);
		goto failed;
	}

	if(usb_dev_table[minor] != NULL) {
		err("ERROR: minor conflict");
		goto failed;
	}

	/* Allocate dev data structure */
	s = kmalloc(sizeof(usb_t), GFP_KERNEL);
	if(s == NULL){
		err("Out of memory");
		goto failed;
	}
	usb_dev_table[minor] = s;

	/* Initialization */
	memset (s, 0, sizeof (usb_t));

	init_MUTEX (&s->mutex);
	s->usbdev				= usbdev;
	s->minor				= minor;
	s->total_buffer_size	= buffers;

	s->bh.func	= read_stream_bh;
	s->bh.data	= (unsigned long) s;

	sprintf(s->StreamBuffer.cachename, "DEV%d", minor);

	init_waitqueue_head(&s->wq_control_pipe);
	init_waitqueue_head(&s->wq_download_pipe);
	init_waitqueue_head(&s->wq_stream_pipe);
	init_waitqueue_head(&s->wq_interrupt_pipe);
	init_waitqueue_head(&s->wq_stop_stream_thread);

	init_waitqueue_head(&s->wait);
	init_waitqueue_head(&s->remove_ok);

	spin_lock_init(&s->lock);
	INIT_LIST_HEAD(&s->free_buff_list);
	INIT_LIST_HEAD(&s->rec_buff_list);

	/* ----------- */
	down (&s->mutex);

	/* Enumerate endpoints */
	for(i=0;i<usbdev->config[0].interface[0].altsetting[0].bNumEndpoints;i++) {
		pEP = &(usbdev->config[0].interface[0].altsetting[0].endpoint[i]);
		dbg("------- %d 0x%02x %02d %x %d",
			pEP->bDescriptorType,
			pEP->bEndpointAddress,
			pEP->wMaxPacketSize,
			pEP->bmAttributes, pEP->bInterval);

		if((pEP->bEndpointAddress & 0x80) &&
			((pEP->bmAttributes & 3) == 0x02)) {
				/* we found a bulk in endpoint */
				s->bulk_in_buffer = kmalloc(BULK_IN_BUFSIZE, GFP_KERNEL);
				s->bulkin_urb	  = usb_alloc_urb(0);
		}

		if(((pEP->bEndpointAddress & 0x80) == 0x00) &&
			((pEP->bmAttributes & 3) == 0x02)) {
				/* we found a bulk out endpoint */
				s->bulk_out_size = pEP->wMaxPacketSize;
		}
	}

	s->remove_pending	= 0;
	s->usbdev			= usbdev;

	/* Pre-allocate Interrupt URB */
	s->irq_urb	= usb_alloc_urb(0);
	s->irq_buf	= kmalloc(4, GFP_KERNEL);

	FILL_INT_URB(s->irq_urb, s->usbdev, 
				 usb_rcvintpipe(s->usbdev, INTERRUPT_PIPE),
				 s->irq_buf, 4,
				 interrupt_pipe_complete, s, 0x40);
	s->irq_urb->transfer_flags = 0x10;

	{
		int rv;

		s->rd_irq_data.ready     = 0;
		s->rd_irq_data.allow_irq = 0;
		rv = usb_submit_urb(s->irq_urb);
		dbg("usb_submit_urb: %d\n", rv);
	}

#if 0
	if (usb_set_configuration (usbdev, usbdev->config[0].bConfigurationValue) < 0) {
		err("set_configuration failed");
		goto failed;
	}
#endif
	
	/* --------- */
	up (&s->mutex);

	s->DeviceState = DS_IDLE;

	up(&usb_dev_table_mutex);

	dbg("Leave (successful)");
	return s;

failed:
	up(&usb_dev_table_mutex);

	dbg("Leave (probe failed)");
	return NULL;
}

static void go_disconnect (struct usb_device *usbdev, void *ptr)
{
	int minor;
	pusb_t s = (pusb_t) ptr;

	dbg("Enter");

	down (&s->mutex);

	minor = s->minor;

	s->remove_pending = 1;
	wake_up (&s->wait);

	s->usbdev = NULL;
	s->overruns = 0;

	if(s->irq_urb)
	{
		dbg("Unlink IRQ URB");
		usb_unlink_urb(s->irq_urb);
		usb_free_urb(s->irq_urb);
	}

	if(s->bulkin_urb)
	{
		dbg("Unlink Bulk-In URB");
		usb_unlink_urb(s->bulkin_urb);
		usb_free_urb(s->bulkin_urb);
	}

	if(s->DeviceState == DS_IDLE){
		up(&s->mutex);
		go_delete(s);
	} else {
		s->usbdev = NULL;
		up(&s->mutex);
	}

	info("GO7007 #%d now disconnected", minor);
	dbg("Leave");
}

static struct usb_device_id go_ids [] = {
//	{ USB_DEVICE(0x0547, 0x1002) },
	{ USB_DEVICE(0x0EB1, 0x7007) },
	{ }						/* Terminating entry */
};

MODULE_DEVICE_TABLE (usb, go_ids);

static struct usb_driver go_driver =
{
	name:			"go",
	probe:			go_probe,
	disconnect:		go_disconnect,
	id_table:		go_ids,
};

/* --------------------------------------------------------------------- */

static int __init go_init (void)
{
	int rv;
	unsigned u;

	/* initialize struct */
	for (u = 0; u < MAX_DEVICES; u++){
		usb_dev_table[u] = NULL;
	}

	/* Register devfs device*/
	rv = devfs_register_chrdev(USB_GO_MAJOR,
				"go7007", &go_fops);

	if(rv){
		err("failed to register devfs device. Error number %d", rv);
		return -1;
	}

	/* Register usb device */
	rv = usb_register(&go_driver);
	if(rv){
		err("usb_register failed. Error number %d", rv);
		return -1;
	}

	dbg("usb_init: driver registered");

	info(DRIVER_DESC " " DRIVER_VERSION);
	return 0;
}

static void __exit go_cleanup (void)
{
	dbg("usb_cleanup");

	usb_deregister (&go_driver);
	devfs_unregister_chrdev(USB_GO_MAJOR, "go7007");
}

/* --------------------------------------------------------------------- */

MODULE_AUTHOR ("JUN DING & HONGJUN YUAN");
MODULE_DESCRIPTION (" GO 7007 Driver for Linux (c)2002");
MODULE_PARM (buffers, "i");
MODULE_PARM_DESC (buffers, "Number of buffers (default=256)");
MODULE_LICENSE("-Tech");

module_init (go_init);
module_exit (go_cleanup);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
www国产成人| 日韩精品欧美精品| 日韩主播视频在线| 91亚洲精品乱码久久久久久蜜桃| 欧美日韩精品欧美日韩精品| 日本一区二区三级电影在线观看| 视频在线观看国产精品| 一本大道av伊人久久综合| 国产色91在线| 久久综合综合久久综合| 欧美视频一区二| 亚洲欧洲精品一区二区三区不卡| 久久aⅴ国产欧美74aaa| 欧美亚洲日本国产| 亚洲视频免费观看| 国产iv一区二区三区| 日韩欧美一级二级三级| 亚洲国产sm捆绑调教视频| 91美女视频网站| 国产精品欧美久久久久一区二区| 国内精品视频666| 欧美一区二区三区视频在线| 午夜激情久久久| 在线精品观看国产| 一区二区三区在线播放| 色域天天综合网| 亚洲另类春色校园小说| av午夜精品一区二区三区| 欧美经典三级视频一区二区三区| 国产一区在线精品| 久久久综合视频| 国产成人精品免费在线| 久久久久久久久久久久久女国产乱| 蜜桃视频在线一区| 精品久久免费看| 国产精品自拍av| 国产午夜精品久久久久久久 | 日韩影院在线观看| 欧美三片在线视频观看 | 欧美日韩成人激情| 日韩精品一区第一页| 欧美二区三区的天堂| 秋霞午夜av一区二区三区| 日韩欧美黄色影院| 国产一区激情在线| 久久精品人人做人人爽人人| 国产成人小视频| 中文字幕在线播放不卡一区| 日本高清视频一区二区| 午夜欧美在线一二页| 欧美一区二区三区白人 | 丝袜美腿亚洲一区二区图片| 制服丝袜亚洲网站| 国产一二精品视频| 中文字幕一区二区三区在线不卡| 91视视频在线观看入口直接观看www | 亚洲最新视频在线观看| 欧美日韩国产高清一区| 国产一区三区三区| 亚洲视频一区二区在线观看| 欧美日本国产视频| 国产一区二区免费视频| 亚洲美女在线一区| 日韩三级高清在线| av一区二区三区四区| 日韩精品午夜视频| 国产人久久人人人人爽| 日本久久一区二区三区| 久久国产精品免费| 亚洲欧美激情在线| 日韩女优av电影| av不卡免费在线观看| 亚洲高清视频在线| 国产日产欧产精品推荐色 | 亚洲综合一区二区三区| 2020国产精品自拍| 欧美伊人久久大香线蕉综合69| 国产真实精品久久二三区| 最新中文字幕一区二区三区| 日韩欧美一区电影| 色欧美88888久久久久久影院| 久久精品国产秦先生| 亚洲第一综合色| ...av二区三区久久精品| 欧美精品一区二区三| 欧美日韩综合色| 99视频有精品| 国产毛片一区二区| 久久国产精品一区二区| 亚洲sss视频在线视频| 亚洲嫩草精品久久| 精品国产污污免费网站入口 | 精品一二三四在线| 亚洲免费在线播放| 精品久久久久久亚洲综合网 | 偷拍日韩校园综合在线| 亚洲嫩草精品久久| 欧美r级在线观看| 欧美综合一区二区| 国产中文字幕精品| 亚洲午夜私人影院| 中文一区二区在线观看| 久久综合色播五月| 欧美日韩一级二级三级| heyzo一本久久综合| 黑人精品欧美一区二区蜜桃 | 日本欧美一区二区在线观看| 国产精品欧美一区喷水| 欧美大片在线观看| 精品视频免费看| 色一区在线观看| 国产成a人无v码亚洲福利| 另类小说一区二区三区| 天天综合网天天综合色| 亚洲精选免费视频| 国产精品系列在线| 久久久www免费人成精品| 91精品免费在线| 日韩欧美中文字幕一区| 欧美日韩国产美| 欧美私人免费视频| 欧美在线观看一区二区| 91浏览器在线视频| 99热国产精品| 成人天堂资源www在线| 成人网在线免费视频| 成人永久aaa| 成人午夜视频免费看| 亚洲大片免费看| 久久99国产精品尤物| 久久不见久久见免费视频7| 麻豆精品国产91久久久久久| 日韩二区三区在线观看| 日韩国产在线一| 国产呦精品一区二区三区网站| 日韩电影在线一区二区三区| 偷拍与自拍一区| 日韩电影免费一区| 老司机一区二区| 日韩黄色片在线观看| 国产高清精品久久久久| 国产成人亚洲综合a∨猫咪| 国产福利一区在线| 成人av电影观看| 一本大道综合伊人精品热热| 欧美一级夜夜爽| 精品国产电影一区二区| 久久久久久久久久久久电影| 国产精品亲子伦对白| 尤物在线观看一区| 亚洲女同女同女同女同女同69| 首页国产欧美日韩丝袜| 久久66热偷产精品| 国产黄色精品视频| 91欧美激情一区二区三区成人| 色综合天天综合色综合av | 国产91精品在线观看| 国产成人精品综合在线观看 | 91久久久免费一区二区| 欧美一区二区三区婷婷月色| 久久久久久久电影| 亚洲欧美国产77777| 丝袜脚交一区二区| 国产精品一区二区三区四区| 日本亚洲电影天堂| 色域天天综合网| 日韩欧美国产不卡| 亚洲图片欧美激情| 美女视频黄 久久| 成人一区二区三区中文字幕| 在线不卡a资源高清| 国产亚洲一区字幕| 水蜜桃久久夜色精品一区的特点| 精彩视频一区二区三区| 99精品在线免费| 国产日韩欧美精品在线| 亚洲国产一区二区三区| 国产激情视频一区二区三区欧美 | 日本高清无吗v一区| 日韩精品一区二区三区老鸭窝| 中日韩av电影| 国产91精品欧美| 69久久99精品久久久久婷婷| 中文一区二区在线观看| 精品亚洲国产成人av制服丝袜| 在线欧美日韩精品| 国产肉丝袜一区二区| 日韩经典中文字幕一区| 91老师片黄在线观看| 国产精品九色蝌蚪自拍| 国产曰批免费观看久久久| 制服丝袜av成人在线看| 亚洲精品乱码久久久久久日本蜜臀| 日本女优在线视频一区二区| 欧美午夜电影在线播放| 国产精品久久久久影院老司| 国产精品888| 亚洲精品一区二区三区四区高清| 一区二区在线观看视频| 色欧美乱欧美15图片|