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

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

?? usb-midi.c

?? 優龍2410linux2.6.8內核源代碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
	if ( m->singlebyte != 0 ) {		/** Simple code to handle the single-byte USB-MIDI protocol. */		spin_lock_irqsave( &ep->lock, flags );		if ( ep->bufWrPtr+4 > ep->bufSize ) {			ret = flush_midi_buffer( ep );			if ( !ret ) {				spin_unlock_irqrestore( &ep->lock, flags );				return ret;			}		}		ep->buf[ep->bufWrPtr++] = (m->mout.cableId<<4) |  0x0f; /* single byte */		ep->buf[ep->bufWrPtr++] = c;		ep->buf[ep->bufWrPtr++] = 0;		ep->buf[ep->bufWrPtr++] = 0;		if ( ep->bufWrPtr >= ep->bufSize ) {			ret = flush_midi_buffer( ep );		}		spin_unlock_irqrestore( &ep->lock, flags );		return ret;	}	/** Normal USB-MIDI protocol begins here. */	if ( c > 0xf7 ) {	/* system: Realtime messages */		/** Realtime messages are written IMMEDIATELY. */		sysrt_buf[0] = (m->mout.cableId<<4) | 0x0f;		sysrt_buf[1] = c;		sysrt_buf[2] = 0;		sysrt_buf[3] = 0;		spin_lock_irqsave( &ep->lock, flags );		ret = usb_write( ep, sysrt_buf, 4 );		spin_unlock_irqrestore( &ep->lock, flags );		/* m->mout.lastEvent = 0; */		return ret;	}	if ( c >= 0x80 ) {		if ( c < 0xf0 ) {			m->mout.lastEvent = c;			m->mout.isInExclusive = 0;			m->mout.bufRemains = get_remains(c);		} else if ( c == 0xf0 ) {			/* m->mout.lastEvent = 0; */			m->mout.isInExclusive = 1;			m->mout.bufRemains = get_remains(c);		} else if ( c == 0xf7 && m->mout.isInExclusive == 1 ) {			/* m->mout.lastEvent = 0; */			m->mout.isInExclusive = 0;			m->mout.bufRemains = 1;		} else if ( c > 0xf0 ) {			/* m->mout.lastEvent = 0; */			m->mout.isInExclusive = 0;			m->mout.bufRemains = get_remains(c);		}    	} else if ( m->mout.bufRemains == 0 && m->mout.isInExclusive == 0 ) {		if ( m->mout.lastEvent == 0 ) {			return 0; /* discard, waiting for the first event */		}		/** track status **/		m->mout.buf[0] = m->mout.lastEvent;		m->mout.bufPtr = 1;		m->mout.bufRemains = get_remains(m->mout.lastEvent)-1;	}  	m->mout.buf[m->mout.bufPtr++] = c;	m->mout.bufRemains--;	if ( m->mout.bufRemains == 0 || m->mout.bufPtr >= 3) {		ret = put_one_midi_event(m);	}	return ret;}/* ------------------------------------------------------------------------- *//** Basic operation on /dev/midiXX as registered through struct file_operations. * *  Basic contract: Used to change the current read/write position in a file. *  On success, the non-negative position is reported. *  On failure, the negative of an error code is reported. * *  Because a MIDIStream is not a file, all seek operations are doomed to fail. * **/static loff_t usb_midi_llseek(struct file *file, loff_t offset, int origin){	/** Tell user you cannot seek on a PIPE-like device. **/	return -ESPIPE;}/** Basic operation on /dev/midiXX as registered through struct file_operations. * * Basic contract: Block until count bytes have been read or an error occurs. * **/static ssize_t usb_midi_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos){	struct usb_mididev *m = (struct usb_mididev *)file->private_data;	struct midi_in_endpoint *ep = m->min.ep;	ssize_t ret;	DECLARE_WAITQUEUE(wait, current);	if ( !access_ok(VERIFY_READ, buffer, count) ) {		return -EFAULT;	}	if ( count == 0 ) {		return 0;	}	add_wait_queue( &ep->wait, &wait );	ret = 0;	while( count > 0 ) {		int cnt;		int d = (int)count;		cnt = m->min.bufRemains;		if ( cnt > d ) {			cnt = d;		}		if ( cnt <= 0 ) {			if ( file->f_flags & O_NONBLOCK ) {				if (!ret) 					ret = -EAGAIN;				break;			}			__set_current_state(TASK_INTERRUPTIBLE);			schedule();			if (signal_pending(current)) {				if(!ret)					ret=-ERESTARTSYS;				break;			}			continue;		}		{			int i;			unsigned long flags; /* used to synchronize access to the endpoint */			spin_lock_irqsave( &ep->lock, flags );			for (i = 0; i < cnt; i++) {				if ( copy_to_user( buffer+i, m->min.buf+m->min.bufRdPtr, 1 ) ) {					if ( !ret )						ret = -EFAULT;					break;				}				m->min.bufRdPtr = (m->min.bufRdPtr+1)%MIDI_IN_BUFSIZ;				m->min.bufRemains -= 1;			}			spin_unlock_irqrestore( &ep->lock, flags );		}		count-=cnt;		buffer+=cnt;		ret+=cnt;		break;	}	remove_wait_queue( &ep->wait, &wait );	set_current_state(TASK_RUNNING);	return ret;}/** Basic operation on /dev/midiXX as registered through struct file_operations. * *  Basic Contract: Take MIDI data byte-by-byte and pass it to *  writeMidi() which packages MIDI data into USB-MIDI stream. *  Then flushMidiData() is called to ensure all bytes have been written *  in a timely fashion. * **/static ssize_t usb_midi_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos){	struct usb_mididev *m = (struct usb_mididev *)file->private_data;	ssize_t ret;	unsigned long int flags;	if ( !access_ok(VERIFY_READ, buffer, count) ) {		return -EFAULT;	}	if ( count == 0 ) {		return 0;	}	ret = 0;	while( count > 0 ) {		unsigned char c;		if (copy_from_user((unsigned char *)&c, buffer, 1)) {			if ( ret == 0 )				ret = -EFAULT;			break;		}		if( midi_write(m, (int)c) ) {			if ( ret == 0 )				ret = -EFAULT;			break;		}		count--;		buffer++;		ret++;	}	spin_lock_irqsave( &m->mout.ep->lock, flags );	if ( flush_midi_buffer(m->mout.ep) < 0 ) {		ret = -EFAULT;	}	spin_unlock_irqrestore( &m->mout.ep->lock, flags );	return ret;}/** Basic operation on /dev/midiXX as registered through struct file_operations. * * Basic contract:  Wait (spin) until ready to read or write on the file. * **/static unsigned int usb_midi_poll(struct file *file, struct poll_table_struct *wait){	struct usb_mididev *m = (struct usb_mididev *)file->private_data;	struct midi_in_endpoint *iep = m->min.ep;	struct midi_out_endpoint *oep = m->mout.ep;	unsigned long flags;	unsigned int mask = 0;  	if ( file->f_mode & FMODE_READ ) {		poll_wait( file, &iep->wait, wait );		spin_lock_irqsave( &iep->lock, flags );		if ( m->min.bufRemains > 0 )			mask |= POLLIN | POLLRDNORM;		spin_unlock_irqrestore( &iep->lock, flags );	}	if ( file->f_mode & FMODE_WRITE ) {		poll_wait( file, &oep->wait, wait );		spin_lock_irqsave( &oep->lock, flags );		if ( oep->bufWrPtr < oep->bufSize )			mask |= POLLOUT | POLLWRNORM;		spin_unlock_irqrestore( &oep->lock, flags );	}	return mask;}/** Basic operation on /dev/midiXX as registered through struct file_operations. * * Basic contract: This is always the first operation performed on the * device node. If no method is defined, the open succeeds without any * notification given to the module. * **/static int usb_midi_open(struct inode *inode, struct file *file){	int minor = iminor(inode);	DECLARE_WAITQUEUE(wait, current);	struct list_head      *devs, *mdevs;	struct usb_midi_state *s;	struct usb_mididev    *m;	unsigned long flags;	int succeed = 0;#if 0	printk(KERN_INFO "usb-midi: Open minor= %d.\n", minor);#endif	for(;;) {		down(&open_sem);		for (devs = mididevs.next; devs != &mididevs; devs = devs->next) {			s = list_entry(devs, struct usb_midi_state, mididev);			for (mdevs = s->midiDevList.next; mdevs != &s->midiDevList; mdevs = mdevs->next) {				m = list_entry(mdevs, struct usb_mididev, list);				if ( !((m->dev_midi ^ minor) & ~0xf) )					goto device_found;			}		}		up(&open_sem);		return -ENODEV;	device_found:		if ( !s->usbdev ) {			up(&open_sem);			return -EIO;		}		if ( !(m->open_mode & file->f_mode) ) {			break;		}		if ( file->f_flags & O_NONBLOCK ) {			up(&open_sem);			return -EBUSY;		}		__set_current_state(TASK_INTERRUPTIBLE);		add_wait_queue( &open_wait, &wait );		up(&open_sem);		schedule();		remove_wait_queue( &open_wait, &wait );		if ( signal_pending(current) ) {			return -ERESTARTSYS;		}	}	file->private_data = m;	spin_lock_irqsave( &s->lock, flags );	if ( !(m->open_mode & (FMODE_READ | FMODE_WRITE)) ) {		//FIXME: intented semantics unclear here		m->min.bufRdPtr       = 0;		m->min.bufWrPtr       = 0;		m->min.bufRemains     = 0;		spin_lock_init(&m->min.ep->lock);		m->mout.bufPtr        = 0;		m->mout.bufRemains    = 0;		m->mout.isInExclusive = 0;		m->mout.lastEvent     = 0;		spin_lock_init(&m->mout.ep->lock);	}	if ( (file->f_mode & FMODE_READ) && m->min.ep != NULL ) {		unsigned long int flagsep;		spin_lock_irqsave( &m->min.ep->lock, flagsep );		m->min.ep->cables[m->min.cableId] = m;		m->min.ep->readers += 1;		m->min.bufRdPtr       = 0;		m->min.bufWrPtr       = 0;		m->min.bufRemains     = 0;		spin_unlock_irqrestore( &m->min.ep->lock, flagsep );		if ( !(m->min.ep->urbSubmitted)) {			/* urb->dev must be reinitialized on 2.4.x kernels */			m->min.ep->urb->dev = m->min.ep->usbdev;			if ( usb_submit_urb(m->min.ep->urb, GFP_ATOMIC) ) {				printk(KERN_ERR "usbmidi: Cannot submit urb for MIDI-IN\n");			}			m->min.ep->urbSubmitted = 1;		}		m->open_mode |= FMODE_READ;		succeed = 1;	}	if ( (file->f_mode & FMODE_WRITE) && m->mout.ep != NULL ) {		m->mout.bufPtr        = 0;		m->mout.bufRemains    = 0;		m->mout.isInExclusive = 0;		m->mout.lastEvent     = 0;		m->open_mode |= FMODE_WRITE;		succeed = 1;	}	spin_unlock_irqrestore( &s->lock, flags );	s->count++;	up(&open_sem);	/** Changed to prevent extra increments to USE_COUNT. **/	if (!succeed) {		return -EBUSY;	}#if 0	printk(KERN_INFO "usb-midi: Open Succeeded. minor= %d.\n", minor);#endif	return nonseekable_open(inode, file); /** Success. **/}/** Basic operation on /dev/midiXX as registered through struct file_operations. * *  Basic contract: Close an opened file and deallocate anything we allocated. *  Like open(), this can be missing. If open set file->private_data, *  release() must clear it. * **/static int usb_midi_release(struct inode *inode, struct file *file){	struct usb_mididev *m = (struct usb_mididev *)file->private_data;	struct usb_midi_state *s = (struct usb_midi_state *)m->midi;#if 0	printk(KERN_INFO "usb-midi: Close.\n");#endif	down(&open_sem);	if ( m->open_mode & FMODE_WRITE ) {		m->open_mode &= ~FMODE_WRITE;		usb_unlink_urb( m->mout.ep->urb );	}	if ( m->open_mode & FMODE_READ ) {	        unsigned long int flagsep;	        spin_lock_irqsave( &m->min.ep->lock, flagsep );                m->min.ep->cables[m->min.cableId] = NULL; // discard cable                m->min.ep->readers -= 1;		m->open_mode &= ~FMODE_READ;		if ( m->min.ep->readers == 0 &&                     m->min.ep->urbSubmitted ) {			m->min.ep->urbSubmitted = 0;			usb_unlink_urb(m->min.ep->urb);		}	        spin_unlock_irqrestore( &m->min.ep->lock, flagsep );	}	s->count--;	up(&open_sem);	wake_up(&open_wait);	file->private_data = NULL;	return 0;}static struct file_operations usb_midi_fops = {	.owner =	THIS_MODULE,	.llseek =	usb_midi_llseek,	.read =		usb_midi_read,	.write =	usb_midi_write,	.poll =		usb_midi_poll,	.open =		usb_midi_open,	.release =	usb_midi_release,};/* ------------------------------------------------------------------------- *//** Returns filled midi_in_endpoint structure or null on failure. * * Parameters: *	d        - a usb_device *	endPoint - An usb endpoint in the range 0 to 15. * Called by allocUsbMidiDev(); * **/static struct midi_in_endpoint *alloc_midi_in_endpoint( struct usb_device *d, int endPoint ){	struct midi_in_endpoint *ep;	int bufSize;	int pipe;	endPoint &= 0x0f; /* Silently force endPoint to lie in range 0 to 15. */	pipe =  usb_rcvbulkpipe( d, endPoint );	bufSize = usb_maxpacket( d, pipe, usb_pipein(pipe) );	/* usb_pipein() = ! usb_pipeout() = true for an in Endpoint */	ep = (struct midi_in_endpoint *)kmalloc(sizeof(struct midi_in_endpoint), GFP_KERNEL);	if ( !ep ) {		printk(KERN_ERR "usbmidi: no memory for midi in-endpoint\n");		return NULL;	}	memset( ep, 0, sizeof(struct midi_in_endpoint) );//      this sets cables[] and readers to 0, too.//      for (i=0; i<16; i++) ep->cables[i] = 0; // discard cable//      ep->readers = 0;	ep->endpoint = endPoint;	ep->recvBuf = (unsigned char *)kmalloc(sizeof(unsigned char)*(bufSize), GFP_KERNEL);	if ( !ep->recvBuf ) {		printk(KERN_ERR "usbmidi: no memory for midi in-endpoint buffer\n");		kfree(ep);		return NULL;	}	ep->urb = usb_alloc_urb(0, GFP_KERNEL); /* no ISO */	if ( !ep->urb ) {		printk(KERN_ERR "usbmidi: no memory for midi in-endpoint urb\n");		kfree(ep->recvBuf);		kfree(ep);		return NULL;	}	usb_fill_bulk_urb( ep->urb, d, 		       usb_rcvbulkpipe(d, endPoint),		       (unsigned char *)ep->recvBuf, bufSize,		       usb_bulk_read, ep );	/* ep->bufRdPtr     = 0; */	/* ep->bufWrPtr     = 0; */	/* ep->bufRemains   = 0; */	/* ep->urbSubmitted = 0; */	ep->recvBufSize  = bufSize;	init_waitqueue_head(&ep->wait);	return ep;}static int remove_midi_in_endpoint( struct midi_in_endpoint *min ){	usb_unlink_urb( min->urb );	usb_free_urb( min->urb );	kfree( min->recvBuf );	kfree( min );	return 0;}/** Returns filled midi_out_endpoint structure or null on failure. * * Parameters: *	d        - a usb_device *	endPoint - An usb endpoint in the range 0 to 15. * Called by allocUsbMidiDev(); * **/static struct midi_out_endpoint *alloc_midi_out_endpoint( struct usb_device *d, int endPoint ){	struct midi_out_endpoint *ep = NULL;	int pipe;	int bufSize;	endPoint &= 0x0f;	pipe =  usb_sndbulkpipe( d, endPoint );	bufSize = usb_maxpacket( d, pipe, usb_pipeout(pipe) );	ep = (struct midi_out_endpoint *)kmalloc(sizeof(struct midi_out_endpoint), GFP_KERNEL);	if ( !ep ) {		printk(KERN_ERR "usbmidi: no memory for midi out-endpoint\n");		return NULL;	}	memset( ep, 0, sizeof(struct midi_out_endpoint) );	ep->endpoint = endPoint;	ep->buf = (unsigned char *)kmalloc(sizeof(unsigned char)*bufSize, GFP_KERNEL);	if ( !ep->buf ) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲免费观看高清在线观看| 久久电影网站中文字幕| 欧美性生活大片视频| 蜜臀久久99精品久久久画质超高清 | 欧美日韩午夜在线| 国产成人精品三级麻豆| 天堂成人国产精品一区| 国产精品免费免费| 精品日韩一区二区| 欧美日韩久久一区| 波多野结衣中文一区| 蜜桃视频一区二区三区在线观看| 亚洲美女视频一区| 国产精品国产三级国产有无不卡 | 日韩精品一二三区| 亚洲婷婷在线视频| 亚洲国产精品二十页| 日韩一级免费观看| 欧美日韩五月天| 欧美最猛黑人xxxxx猛交| 高清国产一区二区三区| 蜜臂av日日欢夜夜爽一区| 亚洲自拍偷拍麻豆| 亚洲日本电影在线| 一区视频在线播放| 国产女同性恋一区二区| 亚洲精品在线网站| 欧美大片免费久久精品三p | 欧美国产一区二区在线观看| 欧美美女bb生活片| 欧美视频日韩视频| 欧洲日韩一区二区三区| 色综合久久久久网| 99国内精品久久| 99久久精品情趣| 波波电影院一区二区三区| 国产91精品一区二区麻豆网站| 久久99精品国产| 激情六月婷婷久久| 国产一区二区在线观看视频| 精品制服美女丁香| 狠狠色2019综合网| 国产麻豆精品theporn| 国内一区二区在线| 国产精品影音先锋| 国产成人aaa| 99久久伊人网影院| 91色综合久久久久婷婷| 色综合久久99| 欧美日韩精品一区二区三区蜜桃| 精品视频在线免费看| 欧美三级三级三级爽爽爽| 欧美日韩国产成人在线91| 欧美人体做爰大胆视频| 这里只有精品电影| 欧美大片在线观看一区二区| 久久久久成人黄色影片| 国产精品久久久久影院| 亚洲男人天堂av| 亚洲mv大片欧洲mv大片精品| 日韩精品欧美成人高清一区二区| 蜜桃免费网站一区二区三区| 国产在线一区二区| 99久久综合国产精品| 色吊一区二区三区| 欧美一区欧美二区| 久久久久久久久蜜桃| 国产精品一区二区在线看| 国产黄人亚洲片| 色综合中文字幕国产| 91久久精品一区二区三区| 欧美一区二区三区小说| 久久久精品欧美丰满| 伊人性伊人情综合网| 日本视频一区二区三区| 国产精品66部| 在线视频中文字幕一区二区| 91精品国产综合久久福利软件| 久久久欧美精品sm网站| 亚洲视频一区二区在线| 日本不卡1234视频| 成人在线一区二区三区| 欧美三区在线观看| 欧美激情自拍偷拍| 日韩精品电影在线| 成人黄色在线网站| 欧美一二三四在线| 国产精品毛片大码女人| 五月天一区二区三区| 国产成人精品综合在线观看| 欧美中文字幕亚洲一区二区va在线| 精品少妇一区二区三区日产乱码 | 欧美视频一区二区| 国产三级精品三级在线专区| 天天免费综合色| 成人综合在线观看| 日韩视频免费观看高清完整版| 中文字幕日韩av资源站| 日本欧美一区二区| 色菇凉天天综合网| 欧美激情一区二区三区在线| 免费高清视频精品| 欧美午夜精品理论片a级按摩| 国产亚洲综合av| 青青草97国产精品免费观看 | 日本视频免费一区| 色狠狠一区二区| 久久99国内精品| 911精品国产一区二区在线| 国产精品国产a| 国内精品久久久久影院薰衣草| 色妹子一区二区| 欧美高清一级片在线观看| 蜜桃久久久久久久| 91麻豆精品国产| 亚洲成av人片在www色猫咪| 99久久精品国产一区| 国产欧美1区2区3区| 狠狠色综合播放一区二区| 9191成人精品久久| 天天av天天翘天天综合网| 在线视频一区二区免费| 亚洲欧美一区二区在线观看| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 国产一区二区三区在线观看免费| 制服丝袜日韩国产| 亚洲成人免费视频| 欧美色爱综合网| 亚洲图片自拍偷拍| 欧美丝袜丝交足nylons图片| 亚洲欧洲性图库| 99久久精品国产毛片| 中国色在线观看另类| 懂色av中文字幕一区二区三区| 精品久久久久久最新网址| 久久精品国产免费| 欧美大片拔萝卜| 九色综合狠狠综合久久| 精品久久久久久综合日本欧美| 精品一区二区三区免费播放| 日韩欧美一区中文| 激情图区综合网| 国产精品天美传媒| 91在线精品秘密一区二区| 亚洲综合精品自拍| 在线成人av影院| 精品无码三级在线观看视频 | 91色综合久久久久婷婷| 国产精品国产三级国产普通话蜜臀 | 欧美一区二区视频在线观看2022| 亚洲成av人片观看| 日韩欧美中文一区二区| 国产在线精品一区在线观看麻豆| 国产校园另类小说区| 99精品视频在线观看| 一区二区在线免费| 欧美精品第1页| 国产高清亚洲一区| 亚洲色图视频免费播放| 欧美日韩一二三区| 精品一区二区av| 国产精品的网站| 欧美三级电影精品| 久久精品国产亚洲高清剧情介绍 | 午夜精品一区在线观看| 欧美一区二区三区小说| 国产成人精品三级| 亚洲国产中文字幕在线视频综合| 欧美一区二区三区在线电影| 国产精品资源网| 亚洲综合成人在线| 久久人人爽人人爽| 色婷婷精品久久二区二区蜜臂av| 亚洲123区在线观看| 久久视频一区二区| 色婷婷综合久久久中文一区二区 | 久99久精品视频免费观看| 成人欧美一区二区三区小说| 欧美精品免费视频| 成人爽a毛片一区二区免费| 亚洲午夜激情av| xnxx国产精品| 亚洲三级在线播放| 欧美一区二区三区视频免费| 福利一区在线观看| 五月综合激情日本mⅴ| 国产精品私人影院| 欧美岛国在线观看| 欧美日韩精品欧美日韩精品| 国产一区二三区| 日韩av电影免费观看高清完整版 | 日韩女优毛片在线| 91视频91自| 国产成人8x视频一区二区| 日韩精品免费视频人成| 亚洲乱码日产精品bd| 久久精品一区二区三区不卡 | 欧美本精品男人aⅴ天堂| 欧美性极品少妇| 99国产一区二区三精品乱码|