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

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

?? usb-midi.c

?? 底層驅動開發(fā)
?? C
?? 第 1 頁 / 共 4 頁
字號:
	unsigned char sysrt_buf[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 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);		list_for_each_entry(s, &mididevs, mididev) {			list_for_each_entry(m, &s->midiDevList, 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_kill_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_kill_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, 0 );	/* 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_kill_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, 1 );	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 ) {		printk(KERN_ERR "usbmidi: no memory for midi out-endpoint buffer\n");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女网站在线免费欧美精品| 欧美电影精品一区二区| 亚洲国产精品99久久久久久久久| 婷婷国产在线综合| 在线精品视频免费观看| 亚洲精品一二三四区| 成人自拍视频在线观看| 久久精品日韩一区二区三区| 亚洲午夜在线电影| 国产丶欧美丶日本不卡视频| 久久麻豆一区二区| 国产精品99久久不卡二区| 欧美成人性福生活免费看| 美女视频黄a大片欧美| 欧美精品久久天天躁| 天堂一区二区在线| 6080日韩午夜伦伦午夜伦| 香港成人在线视频| 91精品国产综合久久久久久久久久 | 99久久久久免费精品国产 | 国产网站一区二区三区| 国产精品乡下勾搭老头1| 2023国产精品自拍| 国产成人精品影院| 日韩美女精品在线| 欧美性生活一区| 亚洲免费观看高清完整版在线| 在线观看91精品国产入口| 亚洲欧美成人一区二区三区| 欧美三级电影在线看| 日本欧美韩国一区三区| 欧美一区二区在线免费观看| 狂野欧美性猛交blacked| 精品嫩草影院久久| 成人在线一区二区三区| 一区二区三区丝袜| 色8久久人人97超碰香蕉987| 一区二区在线观看视频 | 国内一区二区视频| 中文字幕一区二区三区av| 成人网在线免费视频| 日本一区二区动态图| 色女孩综合影院| 免费在线看成人av| 亚洲国产精品99久久久久久久久 | 中文字幕一区二区三区四区| 欧美久久免费观看| 九九精品一区二区| 综合av第一页| 欧美成人伊人久久综合网| 成人黄色一级视频| 视频一区国产视频| 国产精品青草久久| 欧美精品粉嫩高潮一区二区| 国产精品夜夜嗨| 一区二区三区产品免费精品久久75| 91精品国产综合久久婷婷香蕉| 国产成人精品午夜视频免费 | 亚洲综合一区二区三区| 久久婷婷国产综合精品青草| 欧洲一区二区三区在线| 国产乱人伦精品一区二区在线观看 | 亚洲精品成人在线| 欧美日韩国产成人在线91| 毛片不卡一区二区| 亚洲已满18点击进入久久| 久久久久综合网| 6080亚洲精品一区二区| 在线亚洲高清视频| 成人精品小蝌蚪| 国内欧美视频一区二区| 亚洲午夜成aⅴ人片| 亚洲丝袜另类动漫二区| 久久久91精品国产一区二区三区| 欧洲精品在线观看| 成人av电影在线观看| 国产在线精品国自产拍免费| 偷拍与自拍一区| 亚洲一区二区中文在线| 国产精品白丝在线| 国产亚洲精品7777| 26uuu精品一区二区| 91精品国产全国免费观看| 欧洲一区二区三区免费视频| 国产东北露脸精品视频| 韩国三级在线一区| 久久99日本精品| 免费观看30秒视频久久| 日韩高清一级片| 性做久久久久久免费观看欧美| 一区二区三区日韩在线观看| 国产精品伦一区二区三级视频| 久久综合精品国产一区二区三区| 91精品国产色综合久久久蜜香臀| 欧美日韩一区二区电影| 91国产免费观看| 日本精品一区二区三区高清| 91香蕉视频黄| 91色婷婷久久久久合中文| 色综合久久久久| 色偷偷88欧美精品久久久| 91在线视频官网| 欧美在线不卡视频| 成人av在线播放网址| 国产一区不卡视频| 成人av综合在线| 91麻豆免费视频| 在线观看国产日韩| 欧美一级黄色片| 精品日产卡一卡二卡麻豆| 久久蜜桃香蕉精品一区二区三区| 欧美不卡一区二区三区四区| 精品国产乱码久久| 国产欧美日韩综合精品一区二区| 中文在线资源观看网站视频免费不卡| 欧美国产97人人爽人人喊| 国产日韩欧美麻豆| 亚洲日本va午夜在线影院| 亚洲一区二区成人在线观看| 肉色丝袜一区二区| 韩国一区二区在线观看| 国产一区二区三区香蕉| 成人不卡免费av| 欧美日韩精品欧美日韩精品| ww亚洲ww在线观看国产| 综合网在线视频| 日本欧美一区二区三区| 国产成人av电影在线| 91久久一区二区| 日韩免费观看高清完整版在线观看| 久久精品一区蜜桃臀影院| 亚洲激情图片qvod| 国产69精品久久久久毛片| 欧美日韩国产乱码电影| 亚洲国产精品成人综合色在线婷婷| 亚洲va韩国va欧美va精品| 国产精品996| 欧美tk丨vk视频| 日本中文字幕不卡| 一本色道亚洲精品aⅴ| 久久精品一区八戒影视| 亚洲va欧美va人人爽午夜| 91年精品国产| 日本一二三不卡| 国产综合久久久久影院| 911精品国产一区二区在线| 亚洲免费观看在线视频| 国产精品白丝jk白祙喷水网站| 欧美一卡二卡在线| 午夜精品久久久久久久久久| 91麻豆精品在线观看| 国产精品丝袜黑色高跟| 激情综合五月天| 国产精品久久久久影院亚瑟| 卡一卡二国产精品| 欧美一卡在线观看| 日韩专区中文字幕一区二区| 欧美在线不卡一区| 亚洲影院久久精品| 欧美在线观看18| 亚洲国产成人高清精品| 欧洲av一区二区嗯嗯嗯啊| 亚洲一区在线视频观看| 99国产欧美另类久久久精品| 国产精品久久久久影视| 成人免费视频免费观看| 中文字幕精品在线不卡| 国产成人免费9x9x人网站视频| 久久久精品欧美丰满| 国产一区二区视频在线播放| 精品不卡在线视频| 国产大片一区二区| 欧美国产一区在线| 成人av在线播放网站| 亚洲欧美一区二区三区久本道91 | 亚洲不卡av一区二区三区| 欧美日韩在线一区二区| 午夜精品免费在线| 日韩欧美国产成人一区二区| 麻豆精品视频在线观看视频| 日韩免费视频线观看| 国产盗摄视频一区二区三区| 国产精品久久久久7777按摩| 色天使色偷偷av一区二区| 亚洲成人资源网| 日韩免费性生活视频播放| 国内外精品视频| 中文字幕一区二区三区视频| 在线亚洲+欧美+日本专区| 石原莉奈在线亚洲三区| 日韩精品一区二区三区swag| 高清久久久久久| 中文字幕一区二| 欧美性大战久久久久久久| 美女尤物国产一区| 国产精品网站在线观看| 欧美在线观看一区二区| 麻豆精品一二三| 国产精品情趣视频| 欧美电影在线免费观看|