1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31#include <linux/module.h>
32#include <linux/kernel.h>
33#include <linux/sched.h>
34#include <linux/list.h>
35#include <linux/slab.h>
36#include <linux/wrapper.h>
37#include <linux/usb.h>
38#include <linux/poll.h>
39#include <linux/sound.h>
40#include <linux/init.h>
41#include <asm/semaphore.h>
42
43
44extern int usb_get_string(struct usb_device *dev, unsigned short langid, unsigned char index, void *buf, int size);
45
46#include "usb-midi.h"
47
48
49
50
51#undef MIDI_DEBUG
52
53#define MIDI_IN_BUFSIZ 1024
54
55#define HAVE_SUPPORT_USB_MIDI_CLASS
56
57#undef HAVE_SUPPORT_ALSA
58
59#undef MOD_INC_EACH_PROBE
60
61
62
63static int singlebyte = 0;
64MODULE_PARM(singlebyte,"i");
65MODULE_PARM_DESC(singlebyte,"Enable sending MIDI messages with single message packet");
66
67static int maxdevices = 4;
68MODULE_PARM(maxdevices,"i");
69MODULE_PARM_DESC(maxdevices,"Max number of allocatable MIDI device");
70
71static int uvendor = -1;
72MODULE_PARM(uvendor,"i");
73MODULE_PARM_DESC(uvendor, "The USB Vendor ID of a semi-compliant interface");
74
75static int uproduct = -1;
76MODULE_PARM(uproduct,"i");
77MODULE_PARM_DESC(uproduct, "The USB Product ID of a semi-compliant interface");
78
79static int uinterface = -1;
80MODULE_PARM(uinterface,"i");
81MODULE_PARM_DESC(uinterface, "The Interface number of a semi-compliant interface");
82
83static int ualt = -1;
84MODULE_PARM(ualt,"i");
85MODULE_PARM_DESC(ualt, "The optional alternative setting of a semi-compliant interface");
86
87static int umin = -1;
88MODULE_PARM(umin,"i");
89MODULE_PARM_DESC(umin, "The input endpoint of a semi-compliant interface");
90
91static int umout = -1;
92MODULE_PARM(umout,"i");
93MODULE_PARM_DESC(umout, "The output endpoint of a semi-compliant interface");
94
95static int ucable = -1;
96MODULE_PARM(ucable,"i");
97MODULE_PARM_DESC(ucable, "The cable number used for a semi-compliant interface");
98
99
100
101
102
103static unsigned short ulangid = 0x0409;
104MODULE_PARM(ulangid,"h");
105MODULE_PARM_DESC(ulangid, "The optional preferred USB Language ID for all devices");
106
107MODULE_AUTHOR("NAGANO Daisuke <breeze.nagano@nifty.ne.jp>");
108MODULE_DESCRIPTION("USB-MIDI driver");
109#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,14)
110MODULE_LICENSE("GPL");
111#endif
112
113
114
115
116
117#define MS_DESCRIPTOR_UNDEFINED 0
118#define MS_HEADER 1
119#define MIDI_IN_JACK 2
120#define MIDI_OUT_JACK 3
121
122#define ELEMENT_DESCRIPTOR 4
123
124#define MS_HEADER_LENGTH 7
125
126
127
128#define DESCRIPTOR_UNDEFINED 0
129
130#define MS_GENERAL_ENDPOINT 1
131
132
133
134#define JACK_TYPE_UNDEFINED 0
135
136#define EMBEDDED_JACK 1
137
138#define EXTERNAL_JACK 2
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157struct usb_midi_state {
158 struct list_head mididev;
159
160 struct usb_device *usbdev;
161
162 struct list_head midiDevList;
163 struct list_head inEndpointList;
164 struct list_head outEndpointList;
165
166 spinlock_t lock;
167
168 unsigned int count;
169};
170
171
172struct midi_out_endpoint {
173 struct list_head list;
174
175 struct usb_device *usbdev;
176 int endpoint;
177 spinlock_t lock;
178 wait_queue_head_t wait;
179
180 unsigned char *buf;
181 int bufWrPtr;
182 int bufSize;
183
184 struct urb *urb;
185};
186
187
188struct midi_in_endpoint {
189 struct list_head list;
190
191 struct usb_device *usbdev;
192 int endpoint;
193 spinlock_t lock;
194 wait_queue_head_t wait;
195
196 struct usb_mididev *cables[16];
197 int readers;
198
199 struct urb *urb;
200 unsigned char *recvBuf;
201 int recvBufSize;
202 int urbSubmitted;
203};
204
205
206struct usb_mididev {
207 struct list_head list;
208
209 struct usb_midi_state *midi;
210 int dev_midi;
211 mode_t open_mode;
212
213 struct {
214 struct midi_in_endpoint *ep;
215 int cableId;
216
217
218
219 unsigned char buf[MIDI_IN_BUFSIZ];
220 int bufRdPtr;
221 int bufWrPtr;
222 int bufRemains;
223 } min;
224
225 struct {
226 struct midi_out_endpoint *ep;
227 int cableId;
228
229 unsigned char buf[3];
230 int bufPtr;
231 int bufRemains;
232
233 int isInExclusive;
234 unsigned char lastEvent;
235 } mout;
236
237 int singlebyte;
238};
239
240
241
242
243
244static int remains_80e0[] = {
245 3,
246 3,
247 3,
248 3,
249 2,
250 2,
251 3
252};
253
254
255
256
257static int remains_f0f6[] = {
258 0,
259 2,
260 3,
261 2,
262 2,
263 2,
264 1
265};
266
267
268
269
270static int cin_f0ff[] = {
271 4,
272 2,
273 3,
274 2,
275 2,
276 2,
277 5,
278 5,
279 5,
280 5,
281 5,
282 5,
283 5,
284 5,
285 5,
286 5
287};
288
289
290
291
292
293
294
295static int cin_to_len[] = {
296 0, 0, 2, 3,
297 3, 1, 2, 3,
298 3, 3, 3, 3,
299 2, 2, 3, 1
300};
301
302
303
304
305static struct list_head mididevs = LIST_HEAD_INIT(mididevs);
306
307static DECLARE_MUTEX(open_sem);
308static DECLARE_WAIT_QUEUE_HEAD(open_wait);
309
310
311
312
313static void usb_write_callback(struct urb *urb)
314{
315 struct midi_out_endpoint *ep = (struct midi_out_endpoint *)urb->context;
316
317 if ( waitqueue_active( &ep->wait ) )
318 wake_up_interruptible( &ep->wait );
319}
320
321
322static int usb_write( struct midi_out_endpoint *ep, unsigned char *buf, int len )
323{
324 struct usb_device *d;
325 int pipe;
326 int ret = 0;
327 int status;
328 int maxretry = 50;
329
330 DECLARE_WAITQUEUE(wait,current);
331 init_waitqueue_head(&ep->wait);
332
333 d = ep->usbdev;
334 pipe = usb_sndbulkpipe(d, ep->endpoint);
335 FILL_BULK_URB( ep->urb, d, pipe, (unsigned char*)buf, len,
336 (usb_complete_t)usb_write_callback, ep );
337
338 status = usb_submit_urb(ep->urb);
339
340 if (status) {
341 printk(KERN_ERR "usbmidi: Cannot submit urb (%d)\n",status);
342 ret = -EFAULT;
343 }
344
345 add_wait_queue( &ep->wait, &wait );
346 set_current_state( TASK_INTERRUPTIBLE );
347
348 while( ep->urb->status == -EINPROGRESS ) {
349 if ( maxretry-- < 0 ) {
350 printk(KERN_ERR "usbmidi: usb_bulk_msg timed out\n");
351 ret = -ETIME;
352 break;
353 }
354 interruptible_sleep_on_timeout( &ep->wait, 10 );
355 }
356 set_current_state( TASK_RUNNING );
357 remove_wait_queue( &ep->wait, &wait );
358
359 return ret;
360}
361
362
363
364
365
366
367
368
369static void usb_bulk_read(struct urb *urb)
370{
371 struct midi_in_endpoint *ep = (struct midi_in_endpoint *)(urb->context);
372 unsigned char *data = urb->transfer_buffer;
373 int i, j, wake;
374 unsigned long int flags;
375
376 if ( !ep->urbSubmitted ) {
377 return;
378 }
379
380 if ( (urb->status == 0) && (urb->actual_length > 0) ) {
381 wake = 0;
382 spin_lock_irqsave( &ep->lock, flags );
383
384 for(j = 0; j < urb->actual_length; j += 4) {
385 int cin = (data[j]>>0)&0xf;
386 int cab = (data[j]>>4)&0xf;
387 struct usb_mididev *cable = ep->cables[cab];
388 if ( cable ) {
389 int len = cin_to_len[cin];
390 for (i = 0; i < len; i++) {
391 cable->min.buf[cable->min.bufWrPtr] = data[1+i+j];
392 cable->min.bufWrPtr = (cable->min.bufWrPtr+1)%MIDI_IN_BUFSIZ;
393 if (cable->min.bufRemains < MIDI_IN_BUFSIZ)
394 cable->min.bufRemains += 1;
395 else
396 cable->min.bufRdPtr += (cable->min.bufRdPtr+1)%MIDI_IN_BUFSIZ;
397 wake = 1;
398 }
399 }
400 }
401
402 spin_unlock_irqrestore( &ep->lock, flags );
403 if ( wake ) {
404 wake_up( &ep->wait );
405 }
406 }
407
408
409 urb->dev = ep->usbdev;
410
411 urb->actual_length = 0;
412 usb_submit_urb(urb);
413}
414
415
416
417
418
419
420
421
422
423
424
425static int flush_midi_buffer( struct midi_out_endpoint *ep )
426{
427 int ret=0;
428
429 if ( ep->bufWrPtr > 0 ) {
430 ret = usb_write( ep, ep->buf, ep->bufWrPtr );
431 ep->bufWrPtr = 0;
432 }
433
434 return ret;
435}
436
437
438
439
440
441
442
443
444
445
446
447static int get_remains(int event)
448{
449 int ret;
450
451 if ( event < 0x80 ) {
452 ret = 1;
453 } else if ( event < 0xf0 ) {
454 ret = remains_80e0[((event-0x80)>>4)&0x0f];
455 } else if ( event < 0xf7 ) {
456 ret = remains_f0f6[event-0xf0];
457 } else {
458 ret = 1;
459 }
460
461 return ret;
462}
463
464
465
466
467
468static int get_CIN( struct usb_mididev *m )
469{
470 int cin;
471
472 if ( m->mout.buf[0] == 0xf7 ) {
473 cin = 5;
474 }
475 else if ( m->mout.buf[1] == 0xf7 ) {
476 cin = 6;
477 }
478 else if ( m->mout.buf[2] == 0xf7 ) {
479 cin = 7;
480 }
481 else {
482 if ( m->mout.isInExclusive == 1 ) {
483 cin = 4;
484 } else if ( m->mout.buf[0] < 0x80 ) {
485
486 cin = 0xF;
487 } else if ( m->mout.buf[0] < 0xf0 ) {
488
489 cin = (m->mout.buf[0]>>4)&0x0f;
490 }
491 else {
492
493 cin = cin_f0ff[m->mout.buf[0]-0xf0];
494 }
495 }
496
497 return cin;
498}
499
500
501
502
503
504
505
506
507
508static int put_one_midi_event(struct usb_mididev *m)
509{
510 int cin;
511 unsigned long flags;
512 struct midi_out_endpoint *ep = m->mout.ep;
513 int ret=0;
514
515 cin = get_CIN( m );
516 if ( cin > 0x0f || cin < 0 ) {
517 return -EINVAL;
518 }
519
520 spin_lock_irqsave( &ep->lock, flags );
521 ep->buf[ep->bufWrPtr++] = (m->mout.cableId<<4) | cin;
522 ep->buf[ep->bufWrPtr++] = m->mout.buf[0];
523 ep->buf[ep->bufWrPtr++] = m->mout.buf[1];
524 ep->buf[ep->bufWrPtr++] = m->mout.buf[2];
525 if ( ep->bufWrPtr >= ep->bufSize ) {
526 ret = flush_midi_buffer( ep );
527 }
528 spin_unlock_irqrestore( &ep->lock, flags);
529
530 m->mout.buf[0] = m->mout.buf[1] = m->mout.buf[2] = 0;
531 m->mout.bufPtr = 0;
532
533 return ret;
534}
535
536
537
538
539
540
541static int midi_write( struct usb_mididev *m, int v )
542{
543 unsigned long flags;
544 struct midi_out_endpoint *ep = m->mout.ep;
545 int ret=0;
546 unsigned char c = (unsigned char)v;
547 unsigned char sysrt_buf[4];
548
549 if ( m->singlebyte != 0 ) {
550
551 spin_lock_irqsave( &ep->lock, flags );
552 if ( ep->bufWrPtr+4 > ep->bufSize ) {
553 ret = flush_midi_buffer( ep );
554 if ( !ret ) {
555 spin_unlock_irqrestore( &ep->lock, flags );
556 return ret;
557 }
558 }
559 ep->buf[ep->bufWrPtr++] = (m->mout.cableId<<4) | 0x0f;
560 ep->buf[ep->bufWrPtr++] = c;
561 ep->buf[ep->bufWrPtr++] = 0;
562 ep->buf[ep->bufWrPtr++] = 0;
563 if ( ep->bufWrPtr >= ep->bufSize ) {
564 ret = flush_midi_buffer( ep );
565 }
566 spin_unlock_irqrestore( &ep->lock, flags );
567
568 return ret;
569 }
570
571
572 if ( c > 0xf7 ) {
573
574 sysrt_buf[0] = (m->mout.cableId<<4) | 0x0f;
575 sysrt_buf[1] = c;
576 sysrt_buf[2] = 0;
577 sysrt_buf[3] = 0;
578 spin_lock_irqsave( &ep->lock, flags );
579 ret = usb_write( ep, sysrt_buf, 4 );
580 spin_unlock_irqrestore( &ep->lock, flags );
581
582
583 return ret;
584 }
585
586 if ( c >= 0x80 ) {
587 if ( c < 0xf0 ) {
588 m->mout.lastEvent = c;
589 m->mout.isInExclusive = 0;
590 m->mout.bufRemains = get_remains(c);
591 } else if ( c == 0xf0 ) {
592
593 m->mout.isInExclusive = 1;
594 m->mout.bufRemains = get_remains(c);
595 } else if ( c == 0xf7 && m->mout.isInExclusive == 1 ) {
596
597 m->mout.isInExclusive = 0;
598 m->mout.bufRemains = 1;
599 } else if ( c > 0xf0 ) {
600
601 m->mout.isInExclusive = 0;
602 m->mout.bufRemains = get_remains(c);
603 }
604
605 } else if ( m->mout.bufRemains == 0 && m->mout.isInExclusive == 0 ) {
606 if ( m->mout.lastEvent == 0 ) {
607 return 0;
608 }
609
610 m->mout.buf[0] = m->mout.lastEvent;
611 m->mout.bufPtr = 1;
612 m->mout.bufRemains = get_remains(m->mout.lastEvent)-1;
613 }
614
615 m->mout.buf[m->mout.bufPtr++] = c;
616 m->mout.bufRemains--;
617 if ( m->mout.bufRemains == 0 || m->mout.bufPtr >= 3) {
618 ret = put_one_midi_event(m);
619 }
620
621 return ret;
622}
623
624
625
626
627
628
629
630
631
632
633
634
635
636static loff_t usb_midi_llseek(struct file *file, loff_t offset, int origin)
637{
638
639 return -ESPIPE;
640}
641
642
643
644
645
646
647
648
649static ssize_t usb_midi_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
650{
651 struct usb_mididev *m = (struct usb_mididev *)file->private_data;
652 struct midi_in_endpoint *ep = m->min.ep;
653 ssize_t ret;
654 DECLARE_WAITQUEUE(wait, current);
655
656 if ( ppos != &file->f_pos ) {
657 return -ESPIPE;
658 }
659 if ( !access_ok(VERIFY_READ, buffer, count) ) {
660 return -EFAULT;
661 }
662 if ( count == 0 ) {
663 return 0;
664 }
665
666 add_wait_queue( &ep->wait, &wait );
667 ret = 0;
668 while( count > 0 ) {
669 int cnt;
670 int d = (int)count;
671
672 cnt = m->min.bufRemains;
673 if ( cnt > d ) {
674 cnt = d;
675 }
676
677 if ( cnt <= 0 ) {
678 if ( file->f_flags & O_NONBLOCK ) {
679 if (!ret)
680 ret = -EAGAIN;
681 break;
682 }
683 __set_current_state(TASK_INTERRUPTIBLE);
684 schedule();
685 if (signal_pending(current)) {
686 if(!ret)
687 ret=-ERESTARTSYS;
688 break;
689 }
690 continue;
691 }
692
693 {
694 int i;
695 unsigned long flags;
696 spin_lock_irqsave( &ep->lock, flags );
697 for (i = 0; i < cnt; i++) {
698 if ( copy_to_user( buffer+i, m->min.buf+m->min.bufRdPtr, 1 ) ) {
699 if ( !ret )
700 ret = -EFAULT;
701 break;
702 }
703 m->min.bufRdPtr = (m->min.bufRdPtr+1)%MIDI_IN_BUFSIZ;
704 m->min.bufRemains -= 1;
705 }
706 spin_unlock_irqrestore( &ep->lock, flags );
707 }
708
709 count-=cnt;
710 buffer+=cnt;
711 ret+=cnt;
712
713 break;
714 }
715
716 remove_wait_queue( &ep->wait, &wait );
717 set_current_state(TASK_RUNNING);
718
719 return ret;
720}
721
722
723
724
725
726
727
728
729
730
731
732static ssize_t usb_midi_write(struct file *file, const char *buffer, size_t count, loff_t *ppos)
733{
734 struct usb_mididev *m = (struct usb_mididev *)file->private_data;
735 ssize_t ret;
736 unsigned long int flags;
737
738 if ( ppos != &file->f_pos ) {
739 return -ESPIPE;
740 }
741 if ( !access_ok(VERIFY_READ, buffer, count) ) {
742 return -EFAULT;
743 }
744 if ( count == 0 ) {
745 return 0;
746 }
747
748 ret = 0;
749 while( count > 0 ) {
750 unsigned char c;
751
752 if (copy_from_user((unsigned char *)&c, buffer, 1)) {
753 if ( ret == 0 )
754 ret = -EFAULT;
755 break;
756 }
757 if( midi_write(m, (int)c) ) {
758 if ( ret == 0 )
759 ret = -EFAULT;
760 break;
761 }
762 count--;
763 buffer++;
764 ret++;
765 }
766
767 spin_lock_irqsave( &m->mout.ep->lock, flags );
768 if ( flush_midi_buffer(m->mout.ep) < 0 ) {
769 ret = -EFAULT;
770 }
771 spin_unlock_irqrestore( &m->mout.ep->lock, flags );
772
773 return ret;
774}
775
776
777
778
779
780
781static unsigned int usb_midi_poll(struct file *file, struct poll_table_struct *wait)
782{
783 struct usb_mididev *m = (struct usb_mididev *)file->private_data;
784 struct midi_in_endpoint *iep = m->min.ep;
785 struct midi_out_endpoint *oep = m->mout.ep;
786 unsigned long flags;
787 unsigned int mask = 0;
788
789 if ( file->f_mode & FMODE_READ ) {
790 poll_wait( file, &iep->wait, wait );
791 spin_lock_irqsave( &iep->lock, flags );
792 if ( m->min.bufRemains > 0 )
793 mask |= POLLIN | POLLRDNORM;
794 spin_unlock_irqrestore( &iep->lock, flags );
795 }
796
797 if ( file->f_mode & FMODE_WRITE ) {
798 poll_wait( file, &oep->wait, wait );
799 spin_lock_irqsave( &oep->lock, flags );
800 if ( oep->bufWrPtr < oep->bufSize )
801 mask |= POLLOUT | POLLWRNORM;
802 spin_unlock_irqrestore( &oep->lock, flags );
803 }
804
805 return mask;
806}
807
808
809
810
811
812
813
814
815
816
817static int usb_midi_open(struct inode *inode, struct file *file)
818{
819 int minor = MINOR(inode->i_rdev);
820 DECLARE_WAITQUEUE(wait, current);
821 struct list_head *devs, *mdevs;
822 struct usb_midi_state *s;
823 struct usb_mididev *m;
824 int flags;
825 int succeed = 0;
826
827#if 0
828 printk(KERN_INFO "usb-midi: Open minor= %d.\n", minor);
829#endif
830
831 for(;;) {
832 down(&open_sem);
833 for (devs = mididevs.next; devs != &mididevs; devs = devs->next) {
834 s = list_entry(devs, struct usb_midi_state, mididev);
835 for (mdevs = s->midiDevList.next; mdevs != &s->midiDevList; mdevs = mdevs->next) {
836 m = list_entry(mdevs, struct usb_mididev, list);
837 if ( !((m->dev_midi ^ minor) & ~0xf) )
838 goto device_found;
839 }
840 }
841 up(&open_sem);
842 return -ENODEV;
843
844 device_found:
845 if ( !s->usbdev ) {
846 up(&open_sem);
847 return -EIO;
848 }
849 if ( !(m->open_mode & file->f_mode) ) {
850 break;
851 }
852 if ( file->f_flags & O_NONBLOCK ) {
853 up(&open_sem);
854 return -EBUSY;
855 }
856 __set_current_state(TASK_INTERRUPTIBLE);
857 add_wait_queue( &open_wait, &wait );
858 up(&open_sem);
859 schedule();
860 __set_current_state(TASK_RUNNING);
861 remove_wait_queue( &open_wait, &wait );
862 if ( signal_pending(current) ) {
863 return -ERESTARTSYS;
864 }
865 }
866
867 file->private_data = m;
868 spin_lock_irqsave( &s->lock, flags );
869
870 if ( !(m->open_mode & (FMODE_READ | FMODE_WRITE)) ) {
871
872 m->min.bufRdPtr = 0;
873 m->min.bufWrPtr = 0;
874 m->min.bufRemains = 0;
875 spin_lock_init(&m->min.ep->lock);
876
877 m->mout.bufPtr = 0;
878 m->mout.bufRemains = 0;
879 m->mout.isInExclusive = 0;
880 m->mout.lastEvent = 0;
881 spin_lock_init(&m->mout.ep->lock);
882 }
883
884 if ( (file->f_mode & FMODE_READ) && m->min.ep != NULL ) {
885 unsigned long int flagsep;
886 spin_lock_irqsave( &m->min.ep->lock, flagsep );
887 m->min.ep->cables[m->min.cableId] = m;
888 m->min.ep->readers += 1;
889 m->min.bufRdPtr = 0;
890 m->min.bufWrPtr = 0;
891 m->min.bufRemains = 0;
892 spin_unlock_irqrestore( &m->min.ep->lock, flagsep );
893
894 if ( !(m->min.ep->urbSubmitted)) {
895
896
897 m->min.ep->urb->dev = m->min.ep->usbdev;
898
899 if ( usb_submit_urb(m->min.ep->urb) ) {
900 printk(KERN_ERR "usbmidi: Cannot submit urb for MIDI-IN\n");
901 }
902 m->min.ep->urbSubmitted = 1;
903 }
904 m->open_mode |= FMODE_READ;
905 succeed = 1;
906 }
907
908 if ( (file->f_mode & FMODE_WRITE) && m->mout.ep != NULL ) {
909 m->mout.bufPtr = 0;
910 m->mout.bufRemains = 0;
911 m->mout.isInExclusive = 0;
912 m->mout.lastEvent = 0;
913 m->open_mode |= FMODE_WRITE;
914 succeed = 1;
915 }
916
917 spin_unlock_irqrestore( &s->lock, flags );
918
919 s->count++;
920 up(&open_sem);
921
922
923 if (!succeed) {
924 return -EBUSY;
925 }
926
927#if 0
928 printk(KERN_INFO "usb-midi: Open Succeeded. minor= %d.\n", minor);
929#endif
930
931
932#ifndef MOD_INC_EACH_PROBE
933 MOD_INC_USE_COUNT;
934#endif
935
936 return 0;
937}
938
939
940
941
942
943
944
945
946
947
948static int usb_midi_release(struct inode *inode, struct file *file)
949{
950 struct usb_mididev *m = (struct usb_mididev *)file->private_data;
951 struct usb_midi_state *s = (struct usb_midi_state *)m->midi;
952
953#if 0
954 printk(KERN_INFO "usb-midi: Close.\n");
955#endif
956
957 down(&open_sem);
958
959 if ( m->open_mode & FMODE_WRITE ) {
960 m->open_mode &= ~FMODE_WRITE;
961 usb_unlink_urb( m->mout.ep->urb );
962 }
963
964 if ( m->open_mode & FMODE_READ ) {
965 unsigned long int flagsep;
966 spin_lock_irqsave( &m->min.ep->lock, flagsep );
967 m->min.ep->cables[m->min.cableId] = 0;
968 m->min.ep->readers -= 1;
969 m->open_mode &= ~FMODE_READ;
970 if ( m->min.ep->readers == 0 &&
971 m->min.ep->urbSubmitted ) {
972 m->min.ep->urbSubmitted = 0;
973 usb_unlink_urb(m->min.ep->urb);
974 }
975 spin_unlock_irqrestore( &m->min.ep->lock, flagsep );
976 }
977
978 s->count--;
979
980 up(&open_sem);
981 wake_up(&open_wait);
982
983 file->private_data = 0;
984
985#ifndef MOD_INC_EACH_PROBE
986 MOD_DEC_USE_COUNT;
987#endif
988
989 return 0;
990}
991
992static struct file_operations usb_midi_fops = {
993 llseek: usb_midi_llseek,
994 read: usb_midi_read,
995 write: usb_midi_write,
996 poll: usb_midi_poll,
997 open: usb_midi_open,
998 release: usb_midi_release,
999};
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012static struct midi_in_endpoint *alloc_midi_in_endpoint( struct usb_device *d, int endPoint )
1013{
1014 struct midi_in_endpoint *ep;
1015 int bufSize;
1016 int pipe;
1017
1018 endPoint &= 0x0f;
1019
1020 pipe = usb_rcvbulkpipe( d, endPoint );
1021 bufSize = usb_maxpacket( d, pipe, usb_pipein(pipe) );
1022
1023
1024 ep = (struct midi_in_endpoint *)kmalloc(sizeof(struct midi_in_endpoint), GFP_KERNEL);
1025 if ( !ep ) {
1026 printk(KERN_ERR "usbmidi: no memory for midi in-endpoint\n");
1027 return NULL;
1028 }
1029 memset( ep, 0, sizeof(struct midi_in_endpoint) );
1030
1031
1032
1033
1034 ep->endpoint = endPoint;
1035
1036 ep->recvBuf = (unsigned char *)kmalloc(sizeof(unsigned char)*(bufSize), GFP_KERNEL);
1037 if ( !ep->recvBuf ) {
1038 printk(KERN_ERR "usbmidi: no memory for midi in-endpoint buffer\n");
1039 kfree(ep);
1040 return NULL;
1041 }
1042
1043 ep->urb = usb_alloc_urb(0);
1044 if ( !ep->urb ) {
1045 printk(KERN_ERR "usbmidi: no memory for midi in-endpoint urb\n");
1046 kfree(ep->recvBuf);
1047 kfree(ep);
1048 return NULL;
1049 }
1050 FILL_BULK_URB( ep->urb, d,
1051 usb_rcvbulkpipe(d, endPoint),
1052 (unsigned char *)ep->recvBuf, bufSize,
1053 (usb_complete_t)usb_bulk_read, ep );
1054
1055
1056
1057
1058
1059 ep->recvBufSize = bufSize;
1060
1061 init_waitqueue_head(&ep->wait);
1062
1063 return ep;
1064}
1065
1066static int remove_midi_in_endpoint( struct midi_in_endpoint *min )
1067{
1068 usb_unlink_urb( min->urb );
1069 usb_free_urb( min->urb );
1070 kfree( min->recvBuf );
1071 kfree( min );
1072
1073 return 0;
1074}
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084static struct midi_out_endpoint *alloc_midi_out_endpoint( struct usb_device *d, int endPoint )
1085{
1086 struct midi_out_endpoint *ep = NULL;
1087 int pipe;
1088 int bufSize;
1089
1090 endPoint &= 0x0f;
1091 pipe = usb_sndbulkpipe( d, endPoint );
1092 bufSize = usb_maxpacket( d, pipe, usb_pipeout(pipe) );
1093
1094 ep = (struct midi_out_endpoint *)kmalloc(sizeof(struct midi_out_endpoint), GFP_KERNEL);
1095 if ( !ep ) {
1096 printk(KERN_ERR "usbmidi: no memory for midi out-endpoint\n");
1097 return NULL;
1098 }
1099 memset( ep, 0, sizeof(struct midi_out_endpoint) );
1100
1101 ep->endpoint = endPoint;
1102 ep->buf = (unsigned char *)kmalloc(sizeof(unsigned char)*bufSize, GFP_KERNEL);
1103 if ( !ep->buf ) {
1104 printk(KERN_ERR "usbmidi: no memory for midi out-endpoint buffer\n");
1105 kfree(ep);
1106 return NULL;
1107 }
1108
1109 ep->urb = usb_alloc_urb(0);
1110 if ( !ep->urb ) {
1111 printk(KERN_ERR "usbmidi: no memory for midi out-endpoint urb\n");
1112 kfree(ep->buf);
1113 kfree(ep);
1114 return NULL;
1115 }
1116
1117 ep->bufSize = bufSize;
1118
1119
1120 init_waitqueue_head(&ep->wait);
1121
1122 return ep;
1123}
1124
1125
1126static int remove_midi_out_endpoint( struct midi_out_endpoint *mout )
1127{
1128 usb_unlink_urb( mout->urb );
1129 usb_free_urb( mout->urb );
1130 kfree( mout->buf );
1131 kfree( mout );
1132
1133 return 0;
1134}
1135
1136
1137
1138
1139
1140
1141
1142
1143static struct usb_mididev *allocMidiDev(
1144 struct usb_midi_state *s,
1145 struct midi_in_endpoint *min,
1146 struct midi_out_endpoint *mout,
1147 int inCableId,
1148 int outCableId )
1149{
1150 struct usb_mididev *m;
1151
1152 m = (struct usb_mididev *)kmalloc(sizeof(struct usb_mididev), GFP_KERNEL);
1153 if (!m) {
1154 printk(KERN_ERR "usbmidi: no memory for midi device\n");
1155 return NULL;
1156 }
1157
1158 memset(m, 0, sizeof(struct usb_mididev));
1159
1160 if ((m->dev_midi = register_sound_midi(&usb_midi_fops, -1)) < 0) {
1161 printk(KERN_ERR "usbmidi: cannot register midi device\n");
1162 kfree(m);
1163 return NULL;
1164 }
1165
1166 m->midi = s;
1167
1168
1169 if ( min ) {
1170 m->min.ep = min;
1171 m->min.ep->usbdev = s->usbdev;
1172 m->min.cableId = inCableId;
1173 }
1174
1175
1176
1177 if ( mout ) {
1178 m->mout.ep = mout;
1179 m->mout.ep->usbdev = s->usbdev;
1180 m->mout.cableId = outCableId;
1181 }
1182
1183
1184
1185
1186
1187 m->singlebyte = singlebyte;
1188
1189 return m;
1190}
1191
1192
1193static void release_midi_device( struct usb_midi_state *s )
1194{
1195 struct usb_mididev *m;
1196 struct midi_in_endpoint *min;
1197 struct midi_out_endpoint *mout;
1198
1199 if ( s->count > 0 ) {
1200 up(&open_sem);
1201 return;
1202 }
1203 up( &open_sem );
1204 wake_up( &open_wait );
1205
1206 while(!list_empty(&s->inEndpointList)) {
1207 min = list_entry(s->inEndpointList.next, struct midi_in_endpoint, list);
1208 list_del(&min->list);
1209 remove_midi_in_endpoint(min);
1210 }
1211
1212 while(!list_empty(&s->outEndpointList)) {
1213 mout = list_entry(s->outEndpointList.next, struct midi_out_endpoint, list);
1214 list_del(&mout->list);
1215 remove_midi_out_endpoint(mout);
1216 }
1217
1218 while(!list_empty(&s->midiDevList)) {
1219 m = list_entry(s->midiDevList.next, struct usb_mididev, list);
1220 list_del(&m->list);
1221 kfree(m);
1222 }
1223
1224 kfree(s);
1225
1226 return;
1227}
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245static void *find_descriptor( void *descStart, unsigned int descLength, void *after, unsigned char dtype, int iface, int altSetting )
1246{
1247 unsigned char *p, *end, *next;
1248 int interfaceNumber = -1, altSet = -1;
1249
1250 p = descStart;
1251 end = p + descLength;
1252 for( ; p < end; ) {
1253 if ( p[0] < 2 )
1254 return NULL;
1255 next = p + p[0];
1256 if ( next > end )
1257 return NULL;
1258 if ( p[1] == USB_DT_INTERFACE ) {
1259 if ( p[0] < USB_DT_INTERFACE_SIZE )
1260 return NULL;
1261 interfaceNumber = p[2];
1262 altSet = p[3];
1263 }
1264 if ( p[1] == dtype &&
1265 ( !after || ( p > (unsigned char *)after) ) &&
1266 ( ( iface == -1) || (iface == interfaceNumber) ) &&
1267 ( (altSetting == -1) || (altSetting == altSet) )) {
1268 return p;
1269 }
1270 p = next;
1271 }
1272 return NULL;
1273}
1274
1275
1276
1277
1278
1279static void *find_csinterface_descriptor(void *descStart, unsigned int descLength, void *after, u8 dsubtype, int iface, int altSetting)
1280{
1281 unsigned char *p;
1282
1283 p = find_descriptor( descStart, descLength, after, USB_DT_CS_INTERFACE, iface, altSetting );
1284 while ( p ) {
1285 if ( p[0] >= 3 && p[2] == dsubtype )
1286 return p;
1287 p = find_descriptor( descStart, descLength, p, USB_DT_CS_INTERFACE,
1288 iface, altSetting );
1289 }
1290 return NULL;
1291}
1292
1293
1294
1295
1296
1297
1298
1299static struct usb_midi_device *parse_descriptor( struct usb_device *d, unsigned char *buffer, int bufSize, unsigned int ifnum , unsigned int altSetting, int quirks)
1300{
1301 struct usb_midi_device *u;
1302 unsigned char *p1;
1303 unsigned char *p2;
1304 unsigned char *next;
1305 int iep, oep;
1306 int length;
1307 unsigned long longBits;
1308 int pins, nbytes, offset, shift, jack;
1309#ifdef HAVE_JACK_STRINGS
1310
1311 unsigned char jack2string[256];
1312#endif
1313
1314 u = 0;
1315
1316 p1 = find_csinterface_descriptor( buffer, bufSize, NULL,
1317 MS_HEADER, ifnum, altSetting);
1318
1319 if ( !p1 ) {
1320 goto error_end;
1321 }
1322
1323 if ( p1[0] < MS_HEADER_LENGTH ) {
1324 goto error_end;
1325 }
1326
1327
1328
1329
1330 u = (struct usb_midi_device *)kmalloc( sizeof(struct usb_midi_device), GFP_KERNEL );
1331 if ( !u ) {
1332 return NULL;
1333 }
1334 u->deviceName = 0;
1335 u->idVendor = d->descriptor.idVendor;
1336 u->idProduct = d->descriptor.idProduct;
1337 u->interface = ifnum;
1338 u->altSetting = altSetting;
1339 u->in[0].endpoint = -1;
1340 u->in[0].cableId = -1;
1341 u->out[0].endpoint = -1;
1342 u->out[0].cableId = -1;
1343
1344
1345 printk(KERN_INFO "usb-midi: Found MIDIStreaming device corresponding to Release %d.%02d of spec.\n",
1346 (p1[4] >> 4) * 10 + (p1[4] & 0x0f ),
1347 (p1[3] >> 4) * 10 + (p1[3] & 0x0f )
1348 );
1349
1350 length = p1[5] | (p1[6] << 8);
1351
1352#ifdef HAVE_JACK_STRINGS
1353 memset(jack2string, 0, sizeof(unsigned char) * 256);
1354#endif
1355
1356 length -= p1[0];
1357 for (p2 = p1 + p1[0]; length > 0; p2 = next) {
1358 next = p2 + p2[0];
1359 length -= p2[0];
1360
1361 if (p2[0] < 2 ) break;
1362 if (p2[1] != USB_DT_CS_INTERFACE) break;
1363 if (p2[2] == MIDI_IN_JACK && p2[0] >= 6 ) {
1364 jack = p2[4];
1365#ifdef HAVE_JACK_STRINGS
1366 jack2string[jack] = p2[5];
1367#endif
1368 printk(KERN_INFO "usb-midi: Found IN Jack 0x%02x %s\n",
1369 jack, (p2[3] == EMBEDDED_JACK)?"EMBEDDED":"EXTERNAL" );
1370 } else if ( p2[2] == MIDI_OUT_JACK && p2[0] >= 6) {
1371 pins = p2[5];
1372 if ( p2[0] < (6 + 2 * pins) ) continue;
1373 jack = p2[4];
1374#ifdef HAVE_JACK_STRINGS
1375 jack2string[jack] = p2[5 + 2 * pins];
1376#endif
1377 printk(KERN_INFO "usb-midi: Found OUT Jack 0x%02x %s, %d pins\n",
1378 jack, (p2[3] == EMBEDDED_JACK)?"EMBEDDED":"EXTERNAL", pins );
1379 } else if ( p2[2] == ELEMENT_DESCRIPTOR && p2[0] >= 10) {
1380 pins = p2[4];
1381 if ( p2[0] < (9 + 2 * pins ) ) continue;
1382 nbytes = p2[8 + 2 * pins ];
1383 if ( p2[0] < (10 + 2 * pins + nbytes) ) continue;
1384 longBits = 0L;
1385 for ( offset = 0, shift = 0; offset < nbytes && offset < 8; offset ++, shift += 8) {
1386 longBits |= ((long)(p2[9 + 2 * pins + offset])) << shift;
1387 }
1388 jack = p2[3];
1389#ifdef HAVE_JACK_STRINGS
1390 jack2string[jack] = p2[9 + 2 * pins + nbytes];
1391#endif
1392 printk(KERN_INFO "usb-midi: Found ELEMENT 0x%02x, %d/%d pins in/out, bits: 0x%016lx\n",
1393 jack, pins, (int)(p2[5 + 2 * pins]), (long)longBits );
1394 } else {
1395 }
1396 }
1397
1398 iep=0;
1399 oep=0;
1400
1401 if (quirks==0) {
1402
1403 p2 = 0;
1404 for (p1 = find_descriptor(buffer, bufSize, NULL, USB_DT_ENDPOINT,
1405 ifnum, altSetting ); p1; p1 = next ) {
1406 next = find_descriptor(buffer, bufSize, p1, USB_DT_ENDPOINT,
1407 ifnum, altSetting );
1408 p2 = find_descriptor(buffer, bufSize, p1, USB_DT_CS_ENDPOINT,
1409 ifnum, altSetting );
1410
1411 if ( p2 && next && ( p2 > next ) )
1412 p2 = 0;
1413
1414 if ( p1[0] < 9 || !p2 || p2[0] < 4 ) continue;
1415
1416 if ( (p1[2] & 0x80) == 0x80 ) {
1417 if ( iep < 15 ) {
1418 pins = p2[3];
1419 if ( pins > 16 )
1420 pins = 16;
1421 u->in[iep].endpoint = p1[2];
1422 u->in[iep].cableId = ( 1 << pins ) - 1;
1423 if ( u->in[iep].cableId ) iep ++;
1424 if ( iep < 15 ) {
1425 u->in[iep].endpoint = -1;
1426 u->in[iep].cableId = -1;
1427 }
1428 }
1429 } else {
1430 if ( oep < 15 ) {
1431 pins = p2[3];
1432 if ( pins > 16 )
1433 pins = 16;
1434 u->out[oep].endpoint = p1[2];
1435 u->out[oep].cableId = ( 1 << pins ) - 1;
1436 if ( u->out[oep].cableId ) oep ++;
1437 if ( oep < 15 ) {
1438 u->out[oep].endpoint = -1;
1439 u->out[oep].cableId = -1;
1440 }
1441 }
1442 }
1443
1444 }
1445 } else if (quirks==1) {
1446
1447 for (p1 = find_descriptor(buffer, bufSize, NULL, USB_DT_ENDPOINT,
1448 ifnum, altSetting ); p1; p1 = next ) {
1449 next = find_descriptor(buffer, bufSize, p1, USB_DT_ENDPOINT,
1450 ifnum, altSetting );
1451
1452 if ( p1[0] < 7 ) continue;
1453
1454 if ( (p1[2] & 0x80) == 0x80 ) {
1455 if ( iep < 15 ) {
1456 pins = iep+1;
1457 if ( pins > 16 )
1458 pins = 16;
1459 u->in[iep].endpoint = p1[2];
1460 u->in[iep].cableId = ( 1 << pins ) - 1;
1461 if ( u->in[iep].cableId ) iep ++;
1462 if ( iep < 15 ) {
1463 u->in[iep].endpoint = -1;
1464 u->in[iep].cableId = -1;
1465 }
1466 }
1467 } else {
1468 if ( oep < 15 ) {
1469 pins = oep+1;
1470 if ( pins > 16 )
1471 pins = 16;
1472 u->out[oep].endpoint = p1[2];
1473 u->out[oep].cableId = ( 1 << pins ) - 1;
1474 if ( u->out[oep].cableId ) oep ++;
1475 if ( oep < 15 ) {
1476 u->out[oep].endpoint = -1;
1477 u->out[oep].cableId = -1;
1478 }
1479 }
1480 }
1481
1482 }
1483 }
1484
1485 if ( !iep && ! oep ) {
1486 goto error_end;
1487 }
1488
1489 return u;
1490
1491error_end:
1492 if ( u ) kfree(u);
1493 return NULL;
1494}
1495
1496
1497
1498
1499
1500
1501static int on_bits( unsigned short v )
1502{
1503 int i;
1504 int ret=0;
1505
1506 for ( i=0 ; i<16 ; i++ ) {
1507 if ( v & (1<<i) ) ret++;
1508 }
1509
1510 return ret;
1511}
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521static int get_alt_setting( struct usb_device *d, int ifnum )
1522{
1523 int alts, alt=0;
1524 struct usb_interface_descriptor *interface;
1525 struct usb_endpoint_descriptor *ep;
1526 int epin, epout;
1527 int i;
1528
1529 alts = d->actconfig->interface[ifnum].num_altsetting;
1530
1531 for ( alt=0 ; alt<alts ; alt++ ) {
1532 interface = &d->actconfig->interface[ifnum].altsetting[alt];
1533 epin = -1;
1534 epout = -1;
1535
1536 for ( i=0 ; i<interface->bNumEndpoints ; i++ ) {
1537 ep = &interface->endpoint[i];
1538 if ( (ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_BULK ) {
1539 continue;
1540 }
1541 if ( (ep->bEndpointAddress & USB_DIR_IN) && epin < 0 ) {
1542 epin = i;
1543 } else if ( epout < 0 ) {
1544 epout = i;
1545 }
1546 if ( epin >= 0 && epout >= 0 ) {
1547 return alt;
1548 }
1549 }
1550 }
1551
1552 return -ENODEV;
1553}
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566static int alloc_usb_midi_device( struct usb_device *d, struct usb_midi_state *s, struct usb_midi_device *u )
1567{
1568 struct usb_mididev **mdevs=NULL;
1569 struct midi_in_endpoint *mins[15], *min;
1570 struct midi_out_endpoint *mouts[15], *mout;
1571 int inDevs=0, outDevs=0;
1572 int inEndpoints=0, outEndpoints=0;
1573 int inEndpoint, outEndpoint;
1574 int inCableId, outCableId;
1575 int i;
1576 int devices = 0;
1577 int alt = 0;
1578
1579
1580 alt = u->altSetting;
1581 if ( alt < 0 ) {
1582 alt = get_alt_setting( d, u->interface );
1583 }
1584 if ( alt < 0 ) { return -ENXIO; }
1585
1586
1587 if ( usb_set_interface( d, u->interface, alt ) < 0 ) {
1588 return -ENXIO;
1589 }
1590
1591 for ( i = 0 ; i < 15 ; i++ ) {
1592 mins[i] = NULL;
1593 mouts[i] = NULL;
1594 }
1595
1596
1597 while( inEndpoints < 15
1598 && inDevs < maxdevices
1599 && u->in[inEndpoints].cableId >= 0 ) {
1600 inDevs += on_bits((unsigned short)u->in[inEndpoints].cableId);
1601 mins[inEndpoints] = alloc_midi_in_endpoint( d, u->in[inEndpoints].endpoint );
1602 if ( mins[inEndpoints] == NULL ) { goto error_end; }
1603 inEndpoints++;
1604 }
1605
1606 while( outEndpoints < 15
1607 && outDevs < maxdevices
1608 && u->out[outEndpoints].cableId >= 0 ) {
1609 outDevs += on_bits((unsigned short)u->out[outEndpoints].cableId);
1610 mouts[outEndpoints] = alloc_midi_out_endpoint( d, u->out[outEndpoints].endpoint );
1611 if ( mouts[outEndpoints] == NULL ) { goto error_end; }
1612 outEndpoints++;
1613 }
1614
1615 devices = inDevs > outDevs ? inDevs : outDevs;
1616 devices = maxdevices > devices ? devices : maxdevices;
1617
1618
1619 if ( ! u->deviceName ) {
1620 mdevs = (struct usb_mididev **)
1621 kmalloc(sizeof(struct usb_mididevs *)*devices
1622 + sizeof(char) * 256, GFP_KERNEL);
1623 } else {
1624 mdevs = (struct usb_mididev **)
1625 kmalloc(sizeof(struct usb_mididevs *)*devices, GFP_KERNEL);
1626 }
1627
1628 if ( !mdevs ) {
1629
1630
1631 goto error_end;
1632 }
1633 for ( i=0 ; i<devices ; i++ ) {
1634 mdevs[i] = NULL;
1635 }
1636
1637
1638 if ( ! u->deviceName ) {
1639 u->deviceName = (char *) (mdevs + devices);
1640 if ( ! d->have_langid && d->descriptor.iProduct) {
1641 alt = usb_get_string(d, 0, 0, u->deviceName, 250);
1642 if (alt < 0) {
1643 printk(KERN_INFO "error getting string descriptor 0 (error=%d)\n", alt);
1644 } else if (u->deviceName[0] < 4) {
1645 printk(KERN_INFO "string descriptor 0 too short (length = %d)\n", alt);
1646 } else {
1647 printk(KERN_INFO "string descriptor 0 found (length = %d)\n", alt);
1648 for(; alt >= 4; alt -= 2) {
1649 i = u->deviceName[alt-2] | (u->deviceName[alt-1]<< 8);
1650 printk(KERN_INFO "usb-midi: langid(%d) 0x%04x\n",
1651 (alt-4) >> 1, i);
1652 if ( ( ( i ^ ulangid ) & 0xff ) == 0 ) {
1653 d->have_langid = 1;
1654 d->string_langid = i;
1655 printk(KERN_INFO "usb-midi: langid(match) 0x%04x\n", i);
1656 if ( i == ulangid )
1657 break;
1658 }
1659 }
1660 }
1661 }
1662 u->deviceName[0] = (char) 0;
1663 if (d->descriptor.iProduct) {
1664 printk(KERN_INFO "usb-midi: fetchString(%d)\n", d->descriptor.iProduct);
1665 alt = usb_string(d, d->descriptor.iProduct, u->deviceName, 255);
1666 if( alt < 0 ) {
1667 u->deviceName[0] = (char) 0;
1668 }
1669 printk(KERN_INFO "usb-midi: fetchString = %d\n", alt);
1670 }
1671
1672 if ( !u->deviceName[0] ) {
1673 if ( d->descriptor.idVendor == USB_VENDOR_ID_ROLAND ) {
1674 strcpy(u->deviceName, "Unknown Roland");
1675 } else if ( d->descriptor.idVendor == USB_VENDOR_ID_STEINBERG ) {
1676 strcpy(u->deviceName, "Unknown Steinberg");
1677 } else if ( d->descriptor.idVendor == USB_VENDOR_ID_YAMAHA ) {
1678 strcpy(u->deviceName, "Unknown Yamaha");
1679 } else {
1680 strcpy(u->deviceName, "Unknown");
1681 }
1682 }
1683 }
1684
1685 inEndpoint = 0; inCableId = -1;
1686 outEndpoint = 0; outCableId = -1;
1687
1688 for ( i=0 ; i<devices ; i++ ) {
1689 for ( inCableId ++ ;
1690 inEndpoint <15
1691 && mins[inEndpoint]
1692 && !(u->in[inEndpoint].cableId & (1<<inCableId)) ;
1693 inCableId++ ) {
1694 if ( inCableId >= 16 ) {
1695 inEndpoint ++;
1696 inCableId = 0;
1697 }
1698 }
1699 min = mins[inEndpoint];
1700 for ( outCableId ++ ;
1701 outEndpoint <15
1702 && mouts[outEndpoint]
1703 && !(u->out[outEndpoint].cableId & (1<<outCableId)) ;
1704 outCableId++ ) {
1705 if ( outCableId >= 16 ) {
1706 outEndpoint ++;
1707 outCableId = 0;
1708 }
1709 }
1710 mout = mouts[outEndpoint];
1711
1712 mdevs[i] = allocMidiDev( s, min, mout, inCableId, outCableId );
1713 if ( mdevs[i] == NULL ) { goto error_end; }
1714
1715 }
1716
1717
1718 for ( i=0 ; i<devices ; i++ ) {
1719 list_add_tail( &mdevs[i]->list, &s->midiDevList );
1720 }
1721 for ( i=0 ; i<inEndpoints ; i++ ) {
1722 list_add_tail( &mins[i]->list, &s->inEndpointList );
1723 }
1724 for ( i=0 ; i<outEndpoints ; i++ ) {
1725 list_add_tail( &mouts[i]->list, &s->outEndpointList );
1726 }
1727
1728 printk(KERN_INFO "usbmidi: found [ %s ] (0x%04x:0x%04x), attached:\n", u->deviceName, u->idVendor, u->idProduct );
1729 for ( i=0 ; i<devices ; i++ ) {
1730 int dm = (mdevs[i]->dev_midi-2)>>4;
1731 if ( mdevs[i]->mout.ep != NULL && mdevs[i]->min.ep != NULL ) {
1732 printk(KERN_INFO "usbmidi: /dev/midi%02d: in (ep:%02x cid:%2d bufsiz:%2d) out (ep:%02x cid:%2d bufsiz:%2d)\n",
1733 dm,
1734 mdevs[i]->min.ep->endpoint|USB_DIR_IN, mdevs[i]->min.cableId, mdevs[i]->min.ep->recvBufSize,
1735 mdevs[i]->mout.ep->endpoint, mdevs[i]->mout.cableId, mdevs[i]->mout.ep->bufSize);
1736 } else if ( mdevs[i]->min.ep != NULL ) {
1737 printk(KERN_INFO "usbmidi: /dev/midi%02d: in (ep:%02x cid:%2d bufsiz:%02d)\n",
1738 dm,
1739 mdevs[i]->min.ep->endpoint|USB_DIR_IN, mdevs[i]->min.cableId, mdevs[i]->min.ep->recvBufSize);
1740 } else if ( mdevs[i]->mout.ep != NULL ) {
1741 printk(KERN_INFO "usbmidi: /dev/midi%02d: out (ep:%02x cid:%2d bufsiz:%02d)\n",
1742 dm,
1743 mdevs[i]->mout.ep->endpoint, mdevs[i]->mout.cableId, mdevs[i]->mout.ep->bufSize);
1744 }
1745 }
1746
1747 kfree(mdevs);
1748 return 0;
1749
1750 error_end:
1751 if ( mdevs != NULL && devices > 0 ) {
1752 for ( i=0 ; i<devices ; i++ ) {
1753 if ( mdevs[i] != NULL ) {
1754 unregister_sound_midi( mdevs[i]->dev_midi );
1755 kfree(mdevs[i]);
1756 }
1757 }
1758 kfree(mdevs);
1759 }
1760
1761 for ( i=0 ; i<15 ; i++ ) {
1762 if ( mins[i] != NULL ) {
1763 remove_midi_in_endpoint( mins[i] );
1764 }
1765 if ( mouts[i] != NULL ) {
1766 remove_midi_out_endpoint( mouts[i] );
1767 }
1768 }
1769
1770 return -ENOMEM;
1771}
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781static int detect_yamaha_device( struct usb_device *d, unsigned int ifnum, struct usb_midi_state *s)
1782{
1783 struct usb_config_descriptor *c = d->actconfig;
1784 struct usb_interface_descriptor *interface;
1785 struct usb_midi_device *u;
1786 unsigned char buf[USB_DT_CONFIG_SIZE], *buffer;
1787 int bufSize;
1788 int i;
1789 int alts=-1;
1790 int ret;
1791
1792 if (d->descriptor.idVendor != USB_VENDOR_ID_YAMAHA) {
1793 return -EINVAL;
1794 }
1795
1796 for ( i=0 ; i < c->interface[ifnum].num_altsetting; i++ ) {
1797 interface = c->interface[ifnum].altsetting + i;
1798
1799 if ( interface->bInterfaceClass != 255 ||
1800 interface->bInterfaceSubClass != 0 )
1801 continue;
1802 alts = i;
1803 }
1804 if ( alts == -1 ) {
1805 return -EINVAL;
1806 }
1807
1808 printk(KERN_INFO "usb-midi: Found YAMAHA USB-MIDI device on dev %04x:%04x, iface %d\n",
1809 d->descriptor.idVendor, d->descriptor.idProduct, ifnum);
1810
1811 for ( i=0 ; i < d->descriptor.bNumConfigurations ; i++ ) {
1812 if ( d->config+i == c ) goto configfound;
1813 }
1814
1815 printk(KERN_INFO "usb-midi: Config not found.\n");
1816
1817 return -EINVAL;
1818
1819 configfound:
1820
1821
1822 if ( usb_set_configuration( d, c->bConfigurationValue ) < 0 ) {
1823 printk(KERN_INFO "usb-midi: Could not set config.\n");
1824 return -EINVAL;
1825 }
1826
1827 ret = usb_get_descriptor( d, USB_DT_CONFIG, i, buf, USB_DT_CONFIG_SIZE );
1828 if ( ret < 0 ) {
1829 printk(KERN_INFO "usb-midi: Could not get config (error=%d).\n", ret);
1830 return -EINVAL;
1831 }
1832 if ( buf[1] != USB_DT_CONFIG || buf[0] < USB_DT_CONFIG_SIZE ) {
1833 printk(KERN_INFO "usb-midi: config not as expected.\n");
1834 return -EINVAL;
1835 }
1836 bufSize = buf[2] | buf[3]<<8;
1837 buffer = (unsigned char *)kmalloc(sizeof(unsigned char)*bufSize, GFP_KERNEL);
1838 if ( !buffer ) {
1839 printk(KERN_INFO "usb-midi: Could not allocate memory.\n");
1840 return -EINVAL;
1841 }
1842 ret = usb_get_descriptor( d, USB_DT_CONFIG, i, buffer, bufSize );
1843 if ( ret < 0 ) {
1844 printk(KERN_INFO "usb-midi: Could not get full config (error=%d).\n", ret);
1845 kfree(buffer);
1846 return -EINVAL;
1847 }
1848
1849 u = parse_descriptor( d, buffer, bufSize, ifnum, alts, 1);
1850 kfree(buffer);
1851 if ( u == NULL ) {
1852 return -EINVAL;
1853 }
1854
1855 ret = alloc_usb_midi_device( d, s, u );
1856
1857 kfree(u);
1858
1859 return ret;
1860}
1861
1862
1863
1864
1865
1866
1867
1868
1869static int detect_vendor_specific_device( struct usb_device *d, unsigned int ifnum, struct usb_midi_state *s )
1870{
1871 struct usb_midi_device *u;
1872 int i;
1873 int ret = -ENXIO;
1874
1875 for ( i=0; i<VENDOR_SPECIFIC_USB_MIDI_DEVICES ; i++ ) {
1876 u=&(usb_midi_devices[i]);
1877
1878 if ( d->descriptor.idVendor != u->idVendor ||
1879 d->descriptor.idProduct != u->idProduct ||
1880 ifnum != u->interface )
1881 continue;
1882
1883 ret = alloc_usb_midi_device( d, s, u );
1884 break;
1885 }
1886
1887 return ret;
1888}
1889
1890
1891
1892
1893
1894
1895static int detect_midi_subclass(struct usb_device *d, unsigned int ifnum, struct usb_midi_state *s)
1896{
1897 struct usb_config_descriptor *c = d->actconfig;
1898 struct usb_interface_descriptor *interface;
1899 struct usb_midi_device *u;
1900 unsigned char buf[USB_DT_CONFIG_SIZE], *buffer;
1901 int bufSize;
1902 int i;
1903 int alts=-1;
1904 int ret;
1905
1906 for ( i=0 ; i < c->interface[ifnum].num_altsetting; i++ ) {
1907 interface = c->interface[ifnum].altsetting + i;
1908
1909 if ( interface->bInterfaceClass != USB_CLASS_AUDIO ||
1910 interface->bInterfaceSubClass != USB_SUBCLASS_MIDISTREAMING )
1911 continue;
1912 alts = i;
1913 }
1914 if ( alts == -1 ) {
1915 return -EINVAL;
1916 }
1917
1918 printk(KERN_INFO "usb-midi: Found MIDISTREAMING on dev %04x:%04x, iface %d\n",
1919 d->descriptor.idVendor, d->descriptor.idProduct, ifnum);
1920
1921 for ( i=0 ; i < d->descriptor.bNumConfigurations ; i++ ) {
1922 if ( d->config+i == c ) goto configfound;
1923 }
1924
1925 printk(KERN_INFO "usb-midi: Config not found.\n");
1926
1927 return -EINVAL;
1928
1929 configfound:
1930
1931
1932 if ( usb_set_configuration( d, c->bConfigurationValue ) < 0 ) {
1933 printk(KERN_INFO "usb-midi: Could not set config.\n");
1934 return -EINVAL;
1935 }
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947 ret = usb_get_descriptor( d, USB_DT_CONFIG, i, buf, USB_DT_CONFIG_SIZE );
1948 if ( ret < 0 ) {
1949 printk(KERN_INFO "usb-midi: Could not get config (error=%d).\n", ret);
1950 return -EINVAL;
1951 }
1952 if ( buf[1] != USB_DT_CONFIG || buf[0] < USB_DT_CONFIG_SIZE ) {
1953 printk(KERN_INFO "usb-midi: config not as expected.\n");
1954 return -EINVAL;
1955 }
1956 bufSize = buf[2] | buf[3]<<8;
1957 buffer = (unsigned char *)kmalloc(sizeof(unsigned char)*bufSize, GFP_KERNEL);
1958 if ( !buffer ) {
1959 printk(KERN_INFO "usb-midi: Could not allocate memory.\n");
1960 return -EINVAL;
1961 }
1962 ret = usb_get_descriptor( d, USB_DT_CONFIG, i, buffer, bufSize );
1963 if ( ret < 0 ) {
1964 printk(KERN_INFO "usb-midi: Could not get full config (error=%d).\n", ret);
1965 kfree(buffer);
1966 return -EINVAL;
1967 }
1968
1969 u = parse_descriptor( d, buffer, bufSize, ifnum, alts, 0);
1970 kfree(buffer);
1971 if ( u == NULL ) {
1972 return -EINVAL;
1973 }
1974
1975 ret = alloc_usb_midi_device( d, s, u );
1976
1977 kfree(u);
1978
1979 return ret;
1980}
1981
1982
1983
1984
1985
1986
1987
1988
1989static int detect_by_hand(struct usb_device *d, unsigned int ifnum, struct usb_midi_state *s)
1990{
1991 struct usb_midi_device u;
1992
1993 if ( d->descriptor.idVendor != uvendor ||
1994 d->descriptor.idProduct != uproduct ||
1995 ifnum != uinterface ) {
1996 return -EINVAL;
1997 }
1998
1999 if ( ualt < 0 ) { ualt = -1; }
2000
2001 if ( umin < 0 || umin > 15 ) { umin = 0x01 | USB_DIR_IN; }
2002 if ( umout < 0 || umout > 15 ) { umout = 0x01; }
2003 if ( ucable < 0 || ucable > 15 ) { ucable = 0; }
2004
2005 u.deviceName = 0;
2006
2007 u.idVendor = uvendor;
2008 u.idProduct = uproduct;
2009 u.interface = uinterface;
2010 u.altSetting = ualt;
2011
2012 u.in[0].endpoint = umin;
2013 u.in[0].cableId = (1<<ucable);
2014
2015 u.out[0].endpoint = umout;
2016 u.out[0].cableId = (1<<ucable);
2017
2018 return alloc_usb_midi_device( d, s, &u );
2019}
2020
2021
2022
2023
2024
2025static void *usb_midi_probe(struct usb_device *dev, unsigned int ifnum,
2026 const struct usb_device_id *id)
2027{
2028 struct usb_midi_state *s;
2029
2030 s = (struct usb_midi_state *)kmalloc(sizeof(struct usb_midi_state), GFP_KERNEL);
2031 if ( !s ) { return NULL; }
2032
2033 memset( s, 0, sizeof(struct usb_midi_state) );
2034 INIT_LIST_HEAD(&s->midiDevList);
2035 INIT_LIST_HEAD(&s->inEndpointList);
2036 INIT_LIST_HEAD(&s->outEndpointList);
2037 s->usbdev = dev;
2038 s->count = 0;
2039 spin_lock_init(&s->lock);
2040
2041 if (
2042 detect_by_hand( dev, ifnum, s ) &&
2043 detect_midi_subclass( dev, ifnum, s ) &&
2044 detect_vendor_specific_device( dev, ifnum, s ) &&
2045 detect_yamaha_device( dev, ifnum, s) ) {
2046 kfree(s);
2047 return NULL;
2048 }
2049
2050 down(&open_sem);
2051 list_add_tail(&s->mididev, &mididevs);
2052 up(&open_sem);
2053
2054#ifdef MOD_INC_EACH_PROBE
2055 MOD_INC_USE_COUNT;
2056#endif
2057
2058 return s;
2059}
2060
2061
2062static void usb_midi_disconnect(struct usb_device *dev, void *ptr)
2063{
2064 struct usb_midi_state *s = (struct usb_midi_state *)ptr;
2065 struct list_head *list;
2066 struct usb_mididev *m;
2067
2068 if ( s == (struct usb_midi_state *)-1 ) {
2069 return;
2070 }
2071 if ( !s->usbdev ) {
2072 return;
2073 }
2074 down(&open_sem);
2075 list_del(&s->mididev);
2076 INIT_LIST_HEAD(&s->mididev);
2077 s->usbdev = NULL;
2078
2079 for ( list = s->midiDevList.next; list != &s->midiDevList; list = list->next ) {
2080 m = list_entry(list, struct usb_mididev, list);
2081 wake_up(&(m->min.ep->wait));
2082 wake_up(&(m->mout.ep->wait));
2083 if ( m->dev_midi >= 0 ) {
2084 unregister_sound_midi(m->dev_midi);
2085 }
2086 m->dev_midi = -1;
2087 }
2088 release_midi_device(s);
2089 wake_up(&open_wait);
2090#ifdef MOD_INC_EACH_PROBE
2091 MOD_DEC_USE_COUNT;
2092#endif
2093
2094 return;
2095}
2096
2097
2098
2099static struct usb_driver usb_midi_driver = {
2100 name: "midi",
2101 probe: usb_midi_probe,
2102 disconnect: usb_midi_disconnect,
2103 id_table: NULL,
2104 driver_list: LIST_HEAD_INIT(usb_midi_driver.driver_list)
2105};
2106
2107
2108
2109int __init usb_midi_init(void)
2110{
2111 if ( usb_register(&usb_midi_driver) < 0 )
2112 return -1;
2113
2114 return 0;
2115
2116}
2117
2118void __exit usb_midi_exit(void)
2119{
2120 usb_deregister(&usb_midi_driver);
2121}
2122
2123module_init(usb_midi_init) ;
2124module_exit(usb_midi_exit) ;
2125
2126#ifdef HAVE_ALSA_SUPPORT
2127#define SNDRV_MAIN_OBJECT_FILE
2128#include "../../include/driver.h"
2129#include "../../include/control.h"
2130#include "../../include/info.h"
2131#include "../../include/cs46xx.h"
2132
2133
2134
2135static int snd_usbmidi_input_close(snd_rawmidi_substream_t * substream)
2136{
2137 return 0;
2138}
2139
2140static int snd_usbmidi_input_open(snd_rawmidi_substream_t * substream )
2141{
2142 return 0;
2143}
2144
2145static void snd_usbmidi_input_trigger(snd_rawmidi_substream_t * substream, int up)
2146{
2147 return 0;
2148}
2149
2150
2151
2152
2153static int snd_usbmidi_output_close(snd_rawmidi_substream_t * substream)
2154{
2155 return 0;
2156}
2157
2158static int snd_usbmidi_output_open(snd_rawmidi_substream_t * substream)
2159{
2160 return 0;
2161}
2162
2163static void snd_usb_midi_output_trigger(snd_rawmidi_substream_t * substream,
2164 int up)
2165{
2166 return 0;
2167}
2168
2169
2170
2171static snd_rawmidi_ops_t snd_usbmidi_output =
2172{
2173 open: snd_usbmidi_output_open,
2174 close: snd_usbmidi_output_close,
2175 trigger: snd_usbmidi_output_trigger,
2176};
2177static snd_rawmidi_ops_t snd_usbmidi_input =
2178{
2179 open: snd_usbmidi_input_open,
2180 close: snd_usbmidi_input_close,
2181 trigger: snd_usbmidi_input_trigger,
2182};
2183
2184int snd_usbmidi_midi(cs46xx_t *chip, int device, snd_rawmidi_t **rrawmidi)
2185{
2186 snd_rawmidi_t *rmidi;
2187 int err;
2188
2189 if (rrawmidi)
2190 *rrawmidi = NULL;
2191 if ((err = snd_rawmidi_new(chip->card, "USB-MIDI", device, 1, 1, &rmidi)) < 0)
2192 return err;
2193 strcpy(rmidi->name, "USB-MIDI");
2194
2195 snd_rawmidi_set_ops( rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT, &snd_usbmidi_output );
2196 snd_rawmidi_set_ops( rmidi, SNDRV_RAWMIDI_STREAM_INPUT, &snd_usbmidi_input );
2197
2198 rmidi->info_flags |= SNDRV_RAWMIDI_INFO_OUTPUT | SNDRV_RAWMIDI_INFO_INPUT | SNDRV_RAWMIDI_INFO_DUPLEX;
2199
2200 rmidi->private_data = chip;
2201 chip->rmidi = rmidi;
2202 if (rrawmidi)
2203 *rrawmidi = NULL;
2204
2205 return 0;
2206}
2207
2208int snd_usbmidi_create( snd_card_t * card,
2209 struct pci_dev * pci,
2210 usbmidi_t ** rchip )
2211{
2212 usbmidi_t *chip;
2213 int err, idx;
2214 snd_region_t *region;
2215 static snd_device_opt_t ops = {
2216 dev_free: snd_usbmidi_dev_free,
2217 };
2218
2219 *rchip = NULL;
2220 chip = snd_magic_kcalloc( usbmidi_t, 0, GFP_KERNEL );
2221 if ( chip == NULL )
2222 return -ENOMEM;
2223}
2224
2225EXPORT_SYMBOL(snd_usbmidi_create);
2226EXPORT_SYMBOL(snd_usbmidi_midi);
2227#endif
2228
2229