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

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

?? usb-skeleton.c

?? 三星公司s3c2410的usb驅動的基本框架 復雜,但挺清晰的
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * USB Skeleton driver - 0.6 * * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) * *	This program is free software; you can redistribute it and/or *	modify it under the terms of the GNU General Public License as *	published by the Free Software Foundation; either version 2 of *	the License, or (at your option) any later version. * * * This driver is to be used as a skeleton driver to be able to create a * USB driver quickly.  The design of it is based on the usb-serial and * dc2xx drivers. * * Thanks to Oliver Neukum and David Brownell for their help in debugging * this driver. * * TODO: *	- fix urb->status race condition in write sequence *	- move minor_table to a dynamic list. * * History: * * 2001_11_05 - 0.6 - fix minor locking problem in skel_disconnect. *			Thanks to Pete Zaitcev for the fix. * 2001_09_04 - 0.5 - fix devfs bug in skel_disconnect. Thanks to wim delvaux * 2001_08_21 - 0.4 - more small bug fixes. * 2001_05_29 - 0.3 - more bug fixes based on review from linux-usb-devel * 2001_05_24 - 0.2 - bug fixes based on review from linux-usb-devel people * 2001_05_01 - 0.1 - first version *  */#include <linux/config.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/signal.h>#include <linux/errno.h>#include <linux/poll.h>#include <linux/init.h>#include <linux/slab.h>#include <linux/fcntl.h>#include <linux/module.h>#include <linux/spinlock.h>#include <linux/list.h>#include <linux/smp_lock.h>#include <linux/devfs_fs_kernel.h>#include <linux/usb.h>#ifdef CONFIG_USB_DEBUG	static int debug = 1;#else	static int debug;#endif/* Use our own dbg macro */#undef dbg#define dbg(format, arg...) do { if (debug) printk(KERN_DEBUG __FILE__ ": " format "\n" , ## arg); } while (0)/* Version Information */#define DRIVER_VERSION "v0.4"#define DRIVER_AUTHOR "Greg Kroah-Hartman, greg@kroah.com"#define DRIVER_DESC "USB Skeleton Driver"/* Module paramaters */MODULE_PARM(debug, "i");MODULE_PARM_DESC(debug, "Debug enabled or not");/* Define these values to match your device */#define USB_SKEL_VENDOR_ID	0xfff0#define USB_SKEL_PRODUCT_ID	0xfff0/* table of devices that work with this driver */static struct usb_device_id skel_table [] = {	{ USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) },	{ }					/* Terminating entry */};MODULE_DEVICE_TABLE (usb, skel_table);/* Get a minor range for your devices from the usb maintainer */#define USB_SKEL_MINOR_BASE	200	/* we can have up to this number of device plugged in at once */#define MAX_DEVICES		16/* Structure to hold all of our device specific stuff */struct usb_skel {	struct usb_device *	udev;			/* save off the usb device pointer */	struct usb_interface *	interface;		/* the interface for this device */	devfs_handle_t		devfs;			/* devfs device node */	unsigned char		minor;			/* the starting minor number for this device */	unsigned char		num_ports;		/* the number of ports this device has */	char			num_interrupt_in;	/* number of interrupt in endpoints we have */	char			num_bulk_in;		/* number of bulk in endpoints we have */	char			num_bulk_out;		/* number of bulk out endpoints we have */	unsigned char *		bulk_in_buffer;		/* the buffer to receive data */	int			bulk_in_size;		/* the size of the receive buffer */	__u8			bulk_in_endpointAddr;	/* the address of the bulk in endpoint */	unsigned char *		bulk_out_buffer;	/* the buffer to send data */	int			bulk_out_size;		/* the size of the send buffer */	struct urb *		write_urb;		/* the urb used to send data */	__u8			bulk_out_endpointAddr;	/* the address of the bulk out endpoint */	struct tq_struct	tqueue;			/* task queue for line discipline waking up */	int			open_count;		/* number of times this port has been opened */	struct semaphore	sem;			/* locks this structure */};/* the global usb devfs handle */extern devfs_handle_t usb_devfs_handle;/* local function prototypes */static ssize_t skel_read	(struct file *file, char *buffer, size_t count, loff_t *ppos);static ssize_t skel_write	(struct file *file, const char *buffer, size_t count, loff_t *ppos);static int skel_ioctl		(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);static int skel_open		(struct inode *inode, struct file *file);static int skel_release		(struct inode *inode, struct file *file);	static void * skel_probe	(struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id);static void skel_disconnect	(struct usb_device *dev, void *ptr);static void skel_write_bulk_callback	(struct urb *urb);/* array of pointers to our devices that are currently connected */static struct usb_skel		*minor_table[MAX_DEVICES];/* lock to protect the minor_table structure */static DECLARE_MUTEX (minor_table_mutex);/* * File operations needed when we register this driver. * This assumes that this driver NEEDS file operations, * of course, which means that the driver is expected * to have a node in the /dev directory. If the USB * device were for a network interface then the driver * would use "struct net_driver" instead, and a serial * device would use "struct tty_driver".  */static struct file_operations skel_fops = {	/*	 * The owner field is part of the module-locking	 * mechanism. The idea is that the kernel knows	 * which module to increment the use-counter of	 * BEFORE it calls the device's open() function.	 * This also means that the kernel can decrement	 * the use-counter again before calling release()	 * or should the open() function fail.	 *	 * Not all device structures have an "owner" field	 * yet. "struct file_operations" and "struct net_device"	 * do, while "struct tty_driver" does not. If the struct	 * has an "owner" field, then initialize it to the value	 * THIS_MODULE and the kernel will handle all module	 * locking for you automatically. Otherwise, you must	 * increment the use-counter in the open() function	 * and decrement it again in the release() function	 * yourself.	 */	owner:		THIS_MODULE,	read:		skel_read,	write:		skel_write,	ioctl:		skel_ioctl,	open:		skel_open,	release:	skel_release,};      /* usb specific object needed to register this driver with the usb subsystem */static struct usb_driver skel_driver = {	name:		"skeleton",	probe:		skel_probe,	disconnect:	skel_disconnect,	fops:		&skel_fops,	minor:		USB_SKEL_MINOR_BASE,	id_table:	skel_table,};/** *	usb_skel_debug_data */static inline void usb_skel_debug_data (const char *function, int size, const unsigned char *data){	int i;	if (!debug)		return;		printk (KERN_DEBUG __FILE__": %s - length = %d, data = ", 		function, size);	for (i = 0; i < size; ++i) {		printk ("%.2x ", data[i]);	}	printk ("\n");}/** *	skel_delete */static inline void skel_delete (struct usb_skel *dev){	minor_table[dev->minor] = NULL;	if (dev->bulk_in_buffer != NULL)		kfree (dev->bulk_in_buffer);	if (dev->bulk_out_buffer != NULL)		kfree (dev->bulk_out_buffer);	if (dev->write_urb != NULL)		usb_free_urb (dev->write_urb);	kfree (dev);}/** *	skel_open */static int skel_open (struct inode *inode, struct file *file){	struct usb_skel *dev = NULL;	int subminor;	int retval = 0;		dbg(__FUNCTION__);	subminor = MINOR (inode->i_rdev) - USB_SKEL_MINOR_BASE;	if ((subminor < 0) ||	    (subminor >= MAX_DEVICES)) {		return -ENODEV;	}	/* Increment our usage count for the module.	 * This is redundant here, because "struct file_operations"	 * has an "owner" field. This line is included here soley as	 * a reference for drivers using lesser structures... ;-)	 */	MOD_INC_USE_COUNT;	/* lock our minor table and get our local data for this minor */	down (&minor_table_mutex);	dev = minor_table[subminor];	if (dev == NULL) {		up (&minor_table_mutex);		MOD_DEC_USE_COUNT;		return -ENODEV;	}	/* lock this device */	down (&dev->sem);	/* unlock the minor table */	up (&minor_table_mutex);	/* increment our usage count for the driver */	++dev->open_count;	/* save our object in the file's private structure */	file->private_data = dev;	/* unlock this device */	up (&dev->sem);	return retval;}/** *	skel_release */static int skel_release (struct inode *inode, struct file *file){	struct usb_skel *dev;	int retval = 0;	dev = (struct usb_skel *)file->private_data;	if (dev == NULL) {		dbg (__FUNCTION__ " - object is NULL");		return -ENODEV;	}	dbg(__FUNCTION__ " - minor %d", dev->minor);	/* lock our minor table */	down (&minor_table_mutex);	/* lock our device */	down (&dev->sem);	if (dev->open_count <= 0) {		dbg (__FUNCTION__ " - device not opened");		retval = -ENODEV;		goto exit_not_opened;	}	if (dev->udev == NULL) {		/* the device was unplugged before the file was released */		up (&dev->sem);		skel_delete (dev);		up (&minor_table_mutex);		MOD_DEC_USE_COUNT;		return 0;	}	/* decrement our usage count for the device */	--dev->open_count;	if (dev->open_count <= 0) {		/* shutdown any bulk writes that might be going on */		usb_unlink_urb (dev->write_urb);		dev->open_count = 0;	}	/* decrement our usage count for the module */	MOD_DEC_USE_COUNT;exit_not_opened:	up (&dev->sem);	up (&minor_table_mutex);	return retval;}/** *	skel_read */static ssize_t skel_read (struct file *file, char *buffer, size_t count, loff_t *ppos){	struct usb_skel *dev;	int retval = 0;	dev = (struct usb_skel *)file->private_data;	

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产电影一区在线| 久久精品噜噜噜成人av农村| 欧美精品一区二区三区在线 | 欧美激情综合网| 26uuu国产电影一区二区| 日韩欧美成人一区二区| 日韩一区二区在线观看视频| 欧美一级日韩免费不卡| 欧美一卡二卡在线| 精品日韩一区二区| 久久久久久久久久电影| 欧美激情在线看| 国产精品成人网| 中文字幕第一区| 韩国av一区二区| 精品国产电影一区二区| 欧美变态凌虐bdsm| 久久精品男人天堂av| 久久精品这里都是精品| 中文字幕av一区二区三区高| 亚洲柠檬福利资源导航| 三级不卡在线观看| 韩国欧美国产一区| 97久久精品人人爽人人爽蜜臀| 色综合久久九月婷婷色综合| 欧美日韩一区二区在线观看视频| 在线播放/欧美激情| 欧美精品一区二区三区在线播放 | 亚洲主播在线播放| 美女视频网站久久| 国产成人8x视频一区二区| 91美女蜜桃在线| 欧美一区日韩一区| 国产欧美日韩卡一| 亚洲超碰97人人做人人爱| 国产中文字幕一区| 在线观看欧美精品| 久久久精品免费观看| 亚洲欧美电影院| 狠狠网亚洲精品| 色综合婷婷久久| 久久网这里都是精品| 亚洲综合在线五月| 国产麻豆精品一区二区| 欧美亚洲一区二区在线| 国产欧美日韩激情| 男女性色大片免费观看一区二区| www.性欧美| 久久你懂得1024| 亚洲福利视频一区二区| 成人免费毛片aaaaa**| 欧美一级电影网站| 亚洲精品成人a在线观看| 国产成人综合在线| 日韩欧美三级在线| 午夜a成v人精品| 色综合天天视频在线观看 | 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | av电影天堂一区二区在线观看| 欧美区视频在线观看| 亚洲欧美日韩一区二区三区在线观看 | 久久久国际精品| 免费人成精品欧美精品| 欧美日韩美女一区二区| 亚洲图片激情小说| 成人午夜私人影院| 久久先锋资源网| 久久精品国产成人一区二区三区 | 国产高清在线精品| 精品少妇一区二区三区在线播放 | 91久久精品一区二区| 国产精品理论片| 国产91高潮流白浆在线麻豆| 26uuu精品一区二区三区四区在线| 午夜伦欧美伦电影理论片| 91国内精品野花午夜精品| 亚洲欧美日韩国产一区二区三区| 成人av手机在线观看| 国产精品毛片久久久久久久| 丁香婷婷综合色啪| 国产精品初高中害羞小美女文| 成人免费av网站| 国产精品国产自产拍高清av王其| 成人综合在线观看| 国产精品久久久爽爽爽麻豆色哟哟| 成人激情小说乱人伦| 中文字幕一区二区三中文字幕| av网站一区二区三区| 亚洲国产成人av| 欧美精选一区二区| 青青草原综合久久大伊人精品优势 | 国产成人午夜精品影院观看视频 | 无码av免费一区二区三区试看| 欧美日本在线视频| 日韩精品一二三四| 精品盗摄一区二区三区| 丰满放荡岳乱妇91ww| 亚洲精品免费在线| 欧美人狂配大交3d怪物一区| 日韩二区在线观看| 国产夜色精品一区二区av| 91丨九色丨黑人外教| 舔着乳尖日韩一区| 国产三级精品视频| 欧美中文一区二区三区| 精品在线免费观看| 国产精品久久久久精k8 | 国产美女在线精品| 亚洲欧美激情一区二区| 日韩亚洲电影在线| 99久久婷婷国产| 久久精品国产亚洲5555| 亚洲欧美日韩中文字幕一区二区三区 | 精品视频在线免费| 国内精品久久久久影院薰衣草| 国产亲近乱来精品视频 | 精品免费国产一区二区三区四区| 成人激情电影免费在线观看| 偷拍一区二区三区| 久久久久亚洲蜜桃| 欧美片网站yy| 99久免费精品视频在线观看| 日本不卡免费在线视频| 成人欧美一区二区三区黑人麻豆| 日韩一级片在线观看| 97精品国产露脸对白| 国产在线视频一区二区| 五月天一区二区三区| 日韩毛片视频在线看| 久久久精品综合| 日韩一区二区三区免费观看| 97aⅴ精品视频一二三区| 国产精品一线二线三线精华| 日韩福利电影在线| 亚洲一区二区三区四区的| 国产精品蜜臀在线观看| 国产亚洲欧洲997久久综合| 欧美日本在线一区| 欧美三级资源在线| 91一区二区在线观看| 国产成人综合在线| 国产河南妇女毛片精品久久久| 免费看日韩精品| 免费精品99久久国产综合精品| 午夜精品国产更新| 亚洲一二三四区| 亚洲欧美另类在线| 亚洲丝袜美腿综合| √…a在线天堂一区| 中文字幕亚洲一区二区av在线| 国产区在线观看成人精品 | 成人免费一区二区三区在线观看| 久久亚洲精品小早川怜子| 精品播放一区二区| 精品国产一区二区国模嫣然| 欧美变态tickle挠乳网站| 日韩欧美一级片| 久久一区二区三区国产精品| 精品国产91乱码一区二区三区 | 久久久久久久一区| 久久精品免费在线观看| 欧美韩日一区二区三区四区| 国产精品乱人伦一区二区| 日韩美女视频一区二区| 一区二区三区中文字幕在线观看| 亚洲综合一二区| 奇米777欧美一区二区| 美国av一区二区| 国产91精品一区二区麻豆网站| 成人自拍视频在线观看| 色综合色狠狠天天综合色| 欧美日韩精品一区二区三区四区| 日韩一区二区三区四区| 久久久国产一区二区三区四区小说| 国产日韩欧美在线一区| 亚洲精品国产品国语在线app| 午夜视频在线观看一区二区三区| 天堂久久一区二区三区| 激情欧美一区二区三区在线观看| 岛国av在线一区| 色又黄又爽网站www久久| 欧美男人的天堂一二区| 欧美xxxxx裸体时装秀| 国产精品久久久久一区二区三区共 | 国产网站一区二区| 亚洲精品少妇30p| 免费亚洲电影在线| 91丨九色丨蝌蚪富婆spa| 欧美一区二区三区在线视频| 国产欧美一区二区精品仙草咪| 一区二区三区精品在线| 久久精品国产99| 色欧美日韩亚洲| 精品国产伦一区二区三区观看体验 | 久久久久久一级片| 夜夜爽夜夜爽精品视频| 国产电影一区二区三区| 在线播放日韩导航| 国产精品盗摄一区二区三区| 免费成人性网站|