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

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

?? usb-func.c

?? ARM嵌入式應用開發實例USB項目控制器的實現源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
#include <linux/module.h>
#include <linux/socket.h>
#include <linux/miscdevice.h>
#include <linux/list.h>
#include <linux/vmalloc.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <asm/uaccess.h>
#include <asm/atomic.h>
#include <linux/delay.h>
#include <linux/usb.h>
#include <linux/smp_lock.h>
#include <linux/devfs_fs_kernel.h>

#include "define.h"
#include "go7007drv.h"

/* Debug status */
static int debug = 0;

/* Redefine debug macro */
#undef	dbg
#define dbg(format, arg...) \
	do { if (debug) printk(KERN_DEBUG __FILE__ ": [" __FUNCTION__ "] " \
		format "\n" , ## arg); \
	} while (0)

#undef	err
#define err(format, arg...) printk(KERN_ERR __FILE__ ": [" __FUNCTION__ "] " \
		format "\n" , ## arg)

/* Version Information */
#define	DRIVER_VERSION	"v0.4"
#define	DRIVER_DESC		"USB Skeleton Driver"

/* basic usb pipe function */
#define STREAM_PIPE 		1
#define CONTROL_PIPE		2
#define DOWNLOAD_PIPE 		3
#define INTERRUPT_PIPE 		4

#define USB_TIMEOUT 		5   // second

/*
 * Devices information
 */

#define	USB_GO_MAJOR			240
#define	USB_GO_MINOR_BASE	0
#define MAX_DEVICES				256

#define	GODEV_MINOR(busnum, devnum) \
	((((busnum-1) & 7)*32) + ((devnum-1) & 31))

/* Device array and mutex */
static usb_t			*usb_dev_table[MAX_DEVICES];
static DECLARE_MUTEX	(usb_dev_table_mutex);

static int buffers = 256;

//char  tmpCMD_PACKET[72];
/* Local purpose */
#define IOCTL_GO_COMMAND	_IOWR('W', 0x80, CMD_PACKET)	
//#define IOCTL_GO_COMMAND   _IOWR('W', 0X80, tmpCMD_PACKET)   
/*
static struct
{
	short	allow_irq;
	unsigned short	ready;
	unsigned short	retval;
	unsigned short	retdata;
} rd_irq_data;
*/

/* static void interrupt_pipe_complete(purb_t purb); */

/*
 * Begin of basic usb pipe function
 */

/* Stream buffer */
DECLARE_WAIT_QUEUE_HEAD(stream_pipe_wq);

static void read_stream_submit(pusb_t s);

void stream_pipe_complete(purb_t purb)
{
	pusb_t s = (pusb_t) purb->context;

	dbg("Usb transfer complete");

	if(s->StreamThreadState) {
#if 0
		StreamBuffer_AddBlock(&(s->StreamBuffer),
								s->bulk_in_buffer,
								BULK_IN_BUFSIZE);

		read_stream_submit(s);
#else
		tasklet_schedule(&(s->bh));
#endif

		// read_stream_submit(s);
		// err("stream pipe complete");
	}
	else {
		wake_up(&(s->wq_stop_stream_thread));
	}
}

int ReadStreamPipe(pusb_t s, unsigned char *pbuf, int len)
{
	int pipe;	
	purb_t purb = NULL;
	int r=0;
		
	pipe = usb_rcvbulkpipe(s->usbdev, STREAM_PIPE);
	purb = s->bulkin_urb;
	
	s->stream_in_ready = 0;

	FILL_BULK_URB(purb, s->usbdev, pipe, pbuf, len, stream_pipe_complete, s);
	usb_submit_urb(purb);
	
	// r = sleep_on_timeout(&s->wq_stream_pipe, USB_TIMEOUT*HZ);
	while(!s->stream_in_ready)
		r = sleep_on_timeout(&stream_pipe_wq, USB_TIMEOUT*HZ);

	return r;
}

static void read_stream_submit(pusb_t s)
{
	int pipe;
	purb_t	purb = NULL;
	unsigned char *pbuf;

	pipe = usb_rcvbulkpipe(s->usbdev, STREAM_PIPE);
	purb = s->bulkin_urb;
	pbuf = s->bulk_in_buffer;

	FILL_BULK_URB(purb, s->usbdev, pipe, pbuf, BULK_IN_BUFSIZE, stream_pipe_complete, s);
	usb_submit_urb(purb);
}


static void read_stream_bh(unsigned long data)
{
	pusb_t s = (pusb_t) data;

	StreamBuffer_AddBlock(&(s->StreamBuffer),
			s->bulk_in_buffer, BULK_IN_BUFSIZE);

	read_stream_submit(s);
}

void begin_stream_input(pusb_t s)
{
	read_stream_submit(s);
}

/// init buffer

// DECLARE_WAIT_QUEUE_HEAD(download_pipe_wq);

void download_pipe_complete(purb_t purb)
{
	pusb_t s = (pusb_t) purb->context;

	dbg("Usb transfer complete");
	wake_up(&s->wq_download_pipe);
}

int DownloadBuffer(pusb_t s, unsigned char *pbuf, int len)
{
	int pipe;	
	purb_t purb = NULL;
	int r;

	pipe = usb_sndbulkpipe(s->usbdev, DOWNLOAD_PIPE);
	purb = usb_alloc_urb(0);
	
	dbg("download pipe : %x",pipe);
	dbg("bulk size / max bulk out size : %d / %d",
		len, s->bulk_out_size);
	
	{
		unsigned char *trans_buf;

		trans_buf	= kmalloc(len, GFP_KERNEL | __GFP_DMA);
		copy_from_user(trans_buf, pbuf, len);

		FILL_BULK_URB_TO(purb, s->usbdev, pipe, trans_buf, len,
						 download_pipe_complete, s, 500);
		purb->transfer_flags |= USB_QUEUE_BULK;

		r = usb_submit_urb(purb);
		if(r)
			dbg("usb_submit_urb error: %d", r);

		r = sleep_on_timeout(&s->wq_download_pipe, USB_TIMEOUT*HZ);
		if(!r)
		{
			dbg("download timeout : %d",r);
		}

		dbg("download return: %d", r);
		kfree(trans_buf);
	}

	usb_unlink_urb(purb);
	usb_free_urb(purb);	

	return r;
}

//// read interrupt

// DECLARE_WAIT_QUEUE_HEAD(interrupt_pipe_wq);

void interrupt_pipe_complete(purb_t purb)
{
	pusb_t s;

	s = (pusb_t) purb->context;

	if(!s->rd_irq_data.allow_irq)
	{
		dbg("IRQ is not allowed!");
		return;
	}

	dbg("USB interrupt complete: status = %d", purb->status);

	s->rd_irq_data.ready = 1;
	memcpy(&(s->rd_irq_data.retdata), purb->transfer_buffer, 2);
	memcpy(&(s->rd_irq_data.retval),  purb->transfer_buffer+2, 2);

	dbg("rd_irq_data.ready = %d", s->rd_irq_data.ready);

	wake_up(&s->wq_interrupt_pipe);
}
	
int ReadInterruptPipe(pusb_t s, unsigned short *pIntRetVal, unsigned short *pIntRetData)
{
	int r;
	int cnt;
	
	dbg("Enter");

	cnt = 0;
	while(!s->rd_irq_data.ready)
	{
		r = sleep_on_timeout(&s->wq_interrupt_pipe, 0.1*HZ);

		cnt++;
		if(cnt > 10) break;
	}
	
	dbg("irq_data: 0x%04X, 0x%04X, 0x%04X",
			s->rd_irq_data.ready,
			s->rd_irq_data.retdata,
			s->rd_irq_data.retval);

	if(s->rd_irq_data.ready)
	{
		*pIntRetData	= s->rd_irq_data.retdata;
		*pIntRetVal		= s->rd_irq_data.retval;

		s->rd_irq_data.ready	= 0;
		r = 1;
	}
	else
	{
		r = 0;
	}
 
	dbg("interrupt sleep return : %d, val : %04x, data : %04x", r, *pIntRetVal, *pIntRetData);

	dbg("Leave");

	return r;
}

//// write interrupt through control pipe

// DECLARE_WAIT_QUEUE_HEAD(control_pipe_wq);

void control_pipe_complete(purb_t purb)
{
	pusb_t s = (pusb_t) purb->context;

	dbg("Usb control complete");
	wake_up(&s->wq_control_pipe);
}

int WriteInterrupt(pusb_t s, unsigned short Addr, unsigned short Data)
{
	int pipe;	
	purb_t purb = NULL;
	int r;
	unsigned short *transbuf;
	unsigned char *setuppacket;	
	
	transbuf=kmalloc(8,GFP_KERNEL);
	setuppacket=kmalloc(8,GFP_KERNEL);
		
	transbuf[0] = Data;	
	transbuf[1] = Addr;	
	transbuf[2] = 0;	
	transbuf[3] = 0;	
	
	setuppacket[0] = 0x42;
	setuppacket[1] = 0x00;
	setuppacket[2] = 0xaa;
	setuppacket[3] = 0x55;
	setuppacket[4] = 0xf0;
	setuppacket[5] = 0xf0;
	setuppacket[6] = 0x08;
	setuppacket[7] = 0x00;
	
	pipe = usb_sndctrlpipe(s->usbdev, CONTROL_PIPE);
	dbg("control pipe : %x",pipe);
	
	purb = usb_alloc_urb(0);
	
	FILL_CONTROL_URB_TO(purb, s->usbdev, pipe, setuppacket, transbuf, 8,
						control_pipe_complete, s, 100);
	usb_submit_urb(purb);
	
	r = sleep_on_timeout(&s->wq_control_pipe, USB_TIMEOUT*HZ);
	
	kfree(transbuf);
	kfree(setuppacket);
	
	dbg("control sleep return : %d",r);

	usb_unlink_urb(purb);
	dbg("WriteInterrupt: free urb");
	usb_free_urb(purb);	

	return r;
}

// end of basic usb pipe function

/*
 * Driver interface
 */

static inline void go_delete(usb_t *s)
{
	usb_dev_table[s->minor] = NULL;

	if(s->irq_buf != NULL)
		kfree(s->irq_buf);

	kfree(s);
}

static ssize_t go_read (struct file *file, char *buf, size_t count, loff_t * ppos)
{
	pusb_t s;
	int rv;
	int FrameSize = count;

	dbg("Enter");
	
	s = (pusb_t) file->private_data;

	/* Get data from stream buffer */
	rv = StreamBuffer_GetFrame(&(s->StreamBuffer), buf, &FrameSize);

	if(rv == 0)
		rv = FrameSize;
	else
		rv = 0;

	dbg("Leave");
	return rv;
}

static ssize_t go_write(struct file *file, const char *buf, size_t count, loff_t * ppos)
{
	pusb_t s;
	int rv;

	dbg("Enter");
	err("go_write %d %d", buf[0], count);

	s = (pusb_t) file->private_data;

	/* Process writing */
	if(OnWriteProc(s,buf)==0)
		rv = count;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品人人做人人综合 | 蜜臀久久99精品久久久久久9| 欧美成人vps| 国产精品久久久久久久久免费樱桃| 亚洲免费在线看| 美女被吸乳得到大胸91| 波多野结衣91| 欧美大片免费久久精品三p| 中文字幕欧美区| 免费人成网站在线观看欧美高清| www.久久久久久久久| 欧美日韩高清影院| 国产精品美女久久久久aⅴ国产馆| 亚洲大片精品永久免费| 国产一区二区91| 欧美肥妇bbw| 亚洲欧洲无码一区二区三区| 九一久久久久久| 在线观看日韩av先锋影音电影院| 国产三级精品视频| 亚洲一本大道在线| 国产成人精品亚洲日本在线桃色 | 久久久三级国产网站| 亚洲日本va在线观看| 亚洲国产精品麻豆| www.日本不卡| 欧美高清在线一区| 蜜桃av一区二区在线观看| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 波多野结衣的一区二区三区| 日韩欧美aaaaaa| 婷婷成人激情在线网| 在线观看不卡一区| 亚洲精品视频在线观看网站| 岛国一区二区在线观看| 久久女同性恋中文字幕| 久久成人免费网站| 国产亚洲福利社区一区| 成人激情校园春色| 欧美国产精品专区| 成人免费视频一区| 国产精品免费av| 99re这里只有精品首页| 91精品国产综合久久香蕉麻豆| 亚洲欧美在线aaa| 国产成人午夜高潮毛片| 国产亚洲一本大道中文在线| 久久99国产精品久久99| 日韩精品一区二区三区四区| 玖玖九九国产精品| 日韩视频在线你懂得| 久久99精品国产91久久来源| 日韩欧美中文字幕精品| 久久国产精品免费| 精品国产伦一区二区三区观看体验| 麻豆91免费观看| 精品国产乱子伦一区| 国产成人免费视| 一区二区三区四区不卡在线| 欧美日韩免费视频| 国产米奇在线777精品观看| 日本一区二区三区国色天香| 成人午夜电影久久影院| 亚洲卡通欧美制服中文| 欧美日韩高清影院| 精品制服美女丁香| 国产欧美日韩另类一区| 91蜜桃网址入口| 性做久久久久久免费观看| 欧美日韩综合在线免费观看| 麻豆国产精品一区二区三区| 久久蜜桃av一区二区天堂| 国产精品亚洲一区二区三区在线| 国产精品乱人伦| 欧美日本在线看| 国产成人免费在线观看不卡| 一区二区三区四区在线| 日韩一区二区三区在线| 国产美女视频91| 精品免费国产二区三区 | 国产又粗又猛又爽又黄91精品| 亚洲六月丁香色婷婷综合久久| 欧美精品一区二区三区蜜桃| 99国产精品国产精品毛片| 日韩精品亚洲一区| 亚洲国产精品成人综合色在线婷婷 | 美日韩黄色大片| 国产精品美日韩| 欧美一区三区四区| 色综合久久久久久久久| 免费亚洲电影在线| 一区二区三区小说| 欧美激情中文不卡| 欧美另类久久久品| youjizz国产精品| 青青草91视频| 亚洲在线成人精品| 国产精品私房写真福利视频| 欧美一级夜夜爽| 在线视频国产一区| 成人精品视频.| 久久超级碰视频| 亚洲一区二区三区爽爽爽爽爽| www一区二区| 日韩欧美国产精品一区| 欧美性一级生活| 91色婷婷久久久久合中文| 国产在线不卡视频| 麻豆成人免费电影| 日韩中文字幕区一区有砖一区| 日韩一区中文字幕| 亚洲国产精品二十页| 日韩欧美一二区| 欧美一区二区三区公司| 一本大道久久a久久综合婷婷 | 91首页免费视频| 国产成人免费在线观看不卡| 国产91在线|亚洲| 亚洲一级二级三级| 亚洲欧美视频在线观看视频| 国产精品欧美一级免费| www国产精品av| 精品国产网站在线观看| 欧美xingq一区二区| 6080yy午夜一二三区久久| 欧美日韩一本到| 欧美精品第1页| 欧美欧美欧美欧美| 91在线播放网址| 一本久道久久综合中文字幕| 色综合久久88色综合天天6 | 久久精品国产在热久久| 国产精品美女视频| 日韩美女精品在线| 中文字幕一区二区三区视频| 最好看的中文字幕久久| 亚洲欧美综合另类在线卡通| 国产精品色一区二区三区| 国产午夜精品福利| 国产精品久久久久天堂| 国产精品无遮挡| 亚洲婷婷综合色高清在线| 亚洲欧洲精品天堂一级 | 中文字幕欧美一| **欧美大码日韩| 亚洲一区二区三区四区在线| 性做久久久久久免费观看| 日本aⅴ精品一区二区三区| 免费观看成人av| 国产精品乱人伦中文| 日韩一级片网址| 国产精品丝袜91| 亚洲高清免费观看高清完整版在线观看| 喷水一区二区三区| k8久久久一区二区三区| 欧美一级片在线观看| 中文字幕一区二区三中文字幕| 午夜视频一区二区| 丁香激情综合国产| 欧美一区二区女人| 亚洲精品综合在线| 国产一区二区电影| 69久久99精品久久久久婷婷| 日本一区二区成人| 另类小说综合欧美亚洲| 欧美综合在线视频| 国产精品久久久久久久蜜臀 | 精品亚洲成a人| 在线观看欧美日本| 国产欧美日韩在线视频| 日韩精品午夜视频| 欧美性猛交xxxxxxxx| 国产精品卡一卡二卡三| 精品亚洲porn| 日韩欧美国产三级| 午夜欧美大尺度福利影院在线看| 成人性生交大片免费看中文网站| 欧美电视剧在线看免费| 亚洲高清在线视频| 日本乱人伦aⅴ精品| 国产精品嫩草久久久久| 国产精品自拍网站| 久久久噜噜噜久噜久久综合| 蜜臂av日日欢夜夜爽一区| 欧美日韩激情一区二区| 一区二区三区在线视频播放| av毛片久久久久**hd| 日本道色综合久久| 中文字幕av一区 二区| 精品在线观看视频| 欧美成人bangbros| 天天综合色天天综合| 色成年激情久久综合| 亚洲美女视频在线| 在线亚洲精品福利网址导航| 一区二区三区在线观看欧美 | 亚洲国产精品影院| 色吊一区二区三区| 亚洲成人av中文| 一区二区三区四区不卡在线 |