2
* Purpose: Dedicated driver for M-Audio/Midiman MIDISPORT USB MIDI family
7
* This file is part of Open Sound System.
9
* Copyright (C) 4Front Technologies 1996-2008.
11
* This this source file is released under GPL v2 license (no other versions).
12
* See the COPYING file included in the main directory of this source
13
* distribution for the license terms and conditions.
17
#include "oss_config.h"
18
#include "midi_core.h"
20
#include "midisport2x2_fw.h"
21
#include "midisport1x1_fw.h"
22
#include "oxygen8_fw.h"
25
* Audiosport Quattro also use the same packet protocol (no FW load).
26
* Out EP 2 is the output and in EP 1 is the input (check this).
28
#define RECBUF_SIZE (10*4)
31
#define PLAYBUF_SIZE (MAX_PACK*4)
32
#define QUEUE_ENTRIES 17
33
#define QUEUE_SIZE (QUEUE_ENTRIES*PLAYBUF_SIZE)
36
static int instance_num = 0;
38
typedef struct midisport_devc midisport_devc;
40
typedef unsigned char playbuf_t[PLAYBUF_SIZE];
48
int max_out_blocks; /* Num of 4(3) byte blocks allowed in single message */
50
playbuf_t *playbuf; /* QUEUE_SIZE */
51
oss_dma_handle_t playbuf_dma_handle;
52
int playbuf_h, playbuf_t;
54
unsigned char *out_ep_desc;
55
udi_usb_request_t *output_pipe;
56
udi_endpoint_handle_t *output_endpoint_handle;
57
} midisport_outqueue_t;
68
oss_midi_inputbyte_t midi_input_intr;
72
int outqueue_ix; /* Output queue 0 or 1 */
73
oss_midi_outputintr_t outputintr;
76
static int alphabethic_numbering = 1;
80
special_unload_t unload_func;
84
ossusb_devc *usb_devc;
89
unsigned char *in_ep_desc;
91
int num_inputs, num_outputs;
93
midisport_midic in_midic[MAX_PORTS];
94
midisport_midic out_midic[MAX_PORTS];
96
unsigned char *recbuf;
97
oss_dma_handle_t recbuf_dma_handle;
98
udi_usb_request_t *input_pipe;
99
udi_endpoint_handle_t *input_endpoint_handle;
102
midisport_outqueue_t out_queues[2];
106
load_firmware (midisport_devc * devc, const struct setup_request *setup,
113
cmn_err (CE_WARN, "midisport: No firmware available\n");
117
while (setup->pData != NULL)
120
cmn_err (CE_CONT, "Load(%x, Rq=%x, Rqt=%x, Val=%x, Ix=%x, data=%x, len=%d\n", devc->usbdev, setup->bRequest, /* Request */
121
setup->bmRequestType, /* Rqtype */
122
setup->wValue, /* Value */
123
setup->wIndex, /* Index */
124
setup->pData, /* Data */
125
setup->wLength); /* Len */
128
err = udi_usb_snd_control_msg (devc->usbdev, 0, /* Endpoint */
129
setup->bRequest, /* Request */
130
setup->bmRequestType, /* Rqtype */
131
setup->wValue, /* Value */
132
setup->wIndex, /* Index */
133
(void *) setup->pData, /* Data */
134
setup->wLength, /* Len */
138
cmn_err (CE_WARN, "%s: Firmware download failed (%d)\n", name, err);
147
midisport_unload (void *d)
149
midisport_devc *devc = d;
156
MUTEX_CLEANUP (devc->mutex);
160
midisport_init (ossusb_devc * usb_devc)
162
midisport_devc *devc;
164
char *name = "Unknown device";
165
const struct setup_request *setup = NULL;
167
devid = (usb_devc->vendor << 16) | usb_devc->product;
172
name = "MIDISPORT 2x2";
173
setup = midisport2x2_setupRequest;
177
setup = oxygen8_setupRequest;
180
name = "MIDISPORT 1x1";
181
setup = midisport1x1_setupRequest;
185
cmn_err (CE_CONT, "%s firmware load started\n", name);
187
if ((devc = PMALLOC (usb_devc->osdev, sizeof (*devc))) == NULL)
189
cmn_err (CE_WARN, "midisport: Out of memory\n");
193
memset (devc, 0, sizeof (*devc));
195
devc->unload_func = midisport_unload;
197
devc->osdev = usb_devc->osdev;
198
devc->usb_devc = usb_devc;
199
devc->usbdev = usb_devc->last_usbdev;
201
load_firmware (devc, setup, name);
203
cmn_err (CE_CONT, "%s firmware load completed\n", name);
207
static int midisport_start_input (midisport_devc * devc);
210
record_callback (udi_usb_request_t * request, void *arg)
212
midisport_devc *devc = arg;
215
data = udi_usb_request_actdata (request);
217
l = udi_usb_request_actlen (request);
221
for (p = 0; p < l - 3; p += 4)
223
unsigned char *buf, cmd;
225
midisport_midic *midic;
230
src = (cmd >> 4) & 0x0f;
232
if (nbytes == 0) /* End of data */
235
if (nbytes > 3 || src >= devc->num_inputs)
236
continue; /* No data or error */
238
midic = &devc->in_midic[src];
240
if (!(midic->open_mode & OPEN_READ) || midic->midi_input_intr == NULL)
241
continue; /* This device is not recording */
243
for (i = 0; i < nbytes; i++)
245
midic->midi_input_intr (midic->midi_dev, buf[i]);
250
midisport_start_input (devc);
254
midisport_start_input (midisport_devc * devc)
256
oss_native_word flags;
259
MUTEX_ENTER_IRQDISABLE (devc->mutex, flags);
262
udi_usb_submit_request (devc->input_pipe, record_callback, devc,
263
devc->input_endpoint_handle,
264
UDI_USBXFER_INTR_READ, devc->recbuf,
267
cmn_err (CE_WARN, "udi_usb_submit_request failed, err=%d\n", err);
269
MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
274
static void submit_output (midisport_devc * devc, midisport_outqueue_t * q);
276
/*ARGSUSED*/ static void
277
play_callback (udi_usb_request_t * request, void *arg)
279
midisport_outqueue_t *q = arg;
280
midisport_devc *devc = q->devc;
281
oss_native_word flags;
283
MUTEX_ENTER_IRQDISABLE (q->mutex, flags);
285
submit_output (devc, q);
286
MUTEX_EXIT_IRQRESTORE (q->mutex, flags);
289
/*ARGSUSED*/ static void
290
submit_output (midisport_devc * devc, midisport_outqueue_t * q)
299
if (q->playbuf_h == q->playbuf_t) /* Queue empty */
302
qbuf = q->playbuf[q->playbuf_h];
303
max_bytes = q->max_out_blocks * 4;
305
q->playbuf_h = (q->playbuf_h + 1) % QUEUE_ENTRIES;
309
udi_usb_submit_request (q->output_pipe, play_callback, q,
310
q->output_endpoint_handle,
311
UDI_USBXFER_BULK_WRITE, qbuf, max_bytes)) < 0)
313
cmn_err (CE_WARN, "udi_usb_submit_request (play) failed, err=%d\n",
318
/*ARGSUSED*/ static void
319
midisport_close_input (int dev, int mode)
321
oss_native_word flags;
322
midisport_midic *midic;
323
midisport_devc *devc;
326
midic = midi_devs[dev]->devc;
329
MUTEX_ENTER_IRQDISABLE (devc->mutex, flags);
331
if (devc->open_inputs == 0)
333
MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
337
udi_usb_free_request (devc->input_pipe);
338
udi_close_endpoint (devc->input_endpoint_handle);
339
if (devc->recbuf != NULL)
340
CONTIG_FREE (midic->osdev, devc->recbuf, RECBUF_SIZE, devc->recbuf_dma_handle);
343
MUTEX_ENTER_IRQDISABLE (midic->mutex, flags);
344
midic->open_mode = 0;
345
midic->midi_input_intr = NULL;
346
MUTEX_EXIT_IRQRESTORE (midic->mutex, flags);
349
/*ARGSUSED*/ static int
350
midisport_open_input (int dev, int mode, oss_midi_inputbyte_t inputbyte,
351
oss_midi_inputbuf_t inputbuf,
352
oss_midi_outputintr_t outputintr)
354
oss_native_word flags;
355
midisport_midic *midic;
356
midisport_devc *devc;
357
oss_native_word phaddr;
360
midic = midi_devs[dev]->devc;
363
MUTEX_ENTER_IRQDISABLE (midic->mutex, flags);
364
if (midic->open_mode)
366
MUTEX_EXIT_IRQRESTORE (midic->mutex, flags);
370
midic->open_mode = mode;
371
midic->midi_input_intr = inputbyte;
372
MUTEX_EXIT_IRQRESTORE (midic->mutex, flags);
375
MUTEX_ENTER_IRQDISABLE (devc->mutex, flags);
377
if (devc->open_inputs == 1)
379
MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
386
CONTIG_MALLOC (devc->osdev, RECBUF_SIZE, MEMLIMIT_32BITS, &phaddr, devc->recbuf_dma_handle);
387
if (devc->recbuf == NULL)
389
cmn_err (CE_CONT, "Failed to allocate the recording buffer\n");
393
if ((devc->input_endpoint_handle =
394
udi_open_endpoint (devc->usbdev, devc->in_ep_desc)) == NULL)
396
midic->open_mode = 0;
397
midic->midi_input_intr = NULL;
398
cmn_err (CE_WARN, "Cannot open audio pipe\n");
401
if ((devc->input_pipe =
402
udi_usb_alloc_request (devc->usbdev, devc->input_endpoint_handle,
403
1, UDI_USBXFER_INTR_READ)) == NULL)
408
if ((err = midisport_start_input (devc)) < 0)
410
cmn_err (CE_WARN, "midisport: Input error %d\n", err);
411
midisport_close_input (dev, mode);
420
open_output_queue (midisport_devc * devc, int queue_ix)
422
oss_native_word flags;
423
midisport_outqueue_t *q;
425
oss_native_word phaddr;
427
if (queue_ix < 0 || queue_ix >= devc->num_queues)
429
cmn_err (CE_WARN, "Bad output queue index %d\n", queue_ix);
433
q = &devc->out_queues[queue_ix];
435
MUTEX_ENTER_IRQDISABLE (q->mutex, flags);
436
open_count = q->open_count++;
438
if (open_count == 0) /* First open */
440
q->playbuf_h = q->playbuf_t = 0;
443
MUTEX_EXIT_IRQRESTORE (q->mutex, flags);
445
if (open_count == 0) /* First open */
448
CONTIG_MALLOC (devc->osdev, QUEUE_SIZE, MEMLIMIT_32BITS,
449
&phaddr, q->playbuf_dma_handle)) == NULL)
451
cmn_err (CE_WARN, "Failed to allocate output buffer (%d bytes)\n",
457
if ((q->output_endpoint_handle =
458
udi_open_endpoint (devc->usbdev, q->out_ep_desc)) == NULL)
460
cmn_err (CE_WARN, "Failed to open output endpoint\n");
465
if ((q->output_pipe =
466
udi_usb_alloc_request (devc->usbdev, q->output_endpoint_handle, 1,
467
UDI_USBXFER_BULK_WRITE)) == NULL)
469
cmn_err (CE_WARN, "Failed to allocate output request\n");
479
close_output_queue (midisport_devc * devc, int queue_ix)
481
oss_native_word flags;
482
midisport_outqueue_t *q;
485
if (queue_ix < 0 || queue_ix >= devc->num_queues)
487
cmn_err (CE_WARN, "Bad output queue index %d\n", queue_ix);
491
q = &devc->out_queues[queue_ix];
493
if (q->open_count <= 0) /* Was not opened at all */
496
MUTEX_ENTER_IRQDISABLE (q->mutex, flags);
497
open_count = q->open_count--;
498
MUTEX_EXIT_IRQRESTORE (q->mutex, flags);
500
if (open_count <= 1) /* Queue not needed any more */
502
udi_usb_free_request (q->output_pipe);
503
udi_close_endpoint (q->output_endpoint_handle);
504
if (q->playbuf != NULL)
505
CONTIG_FREE (devc->osdev, q->playbuf, QUEUE_SIZE, q->playbuf_dma_handle);
509
/*ARGSUSED*/ static void
510
midisport_close_output (int dev, int mode)
512
oss_native_word flags;
513
midisport_midic *midic;
514
midisport_devc *devc;
516
midic = midi_devs[dev]->devc;
519
close_output_queue (devc, midic->outqueue_ix);
521
MUTEX_ENTER_IRQDISABLE (midic->mutex, flags);
522
midic->open_mode = 0;
523
midic->outputintr = NULL;
524
MUTEX_EXIT_IRQRESTORE (midic->mutex, flags);
527
/*ARGSUSED*/ static int
528
midisport_open_output (int dev, int mode, oss_midi_inputbyte_t inputbyte,
529
oss_midi_inputbuf_t inputbuf,
530
oss_midi_outputintr_t outputintr)
532
oss_native_word flags;
533
midisport_midic *midic;
534
midisport_devc *devc;
537
midic = midi_devs[dev]->devc;
540
MUTEX_ENTER_IRQDISABLE (midic->mutex, flags);
541
if (midic->open_mode)
543
MUTEX_EXIT_IRQRESTORE (midic->mutex, flags);
547
midic->open_mode = mode;
548
midic->midi_input_intr = NULL, midic->outputintr = outputintr;
550
memset (midic->output_buf, 0, sizeof (midic->output_buf));
551
MUTEX_EXIT_IRQRESTORE (midic->mutex, flags);
553
if ((err = open_output_queue (devc, midic->outqueue_ix)) < 0)
555
cmn_err (CE_WARN, "Failed to open the output queue (%d)\n", err);
556
midisport_close_output (dev, mode);
564
do_flush (midisport_devc * devc, midisport_midic * midic,
565
midisport_outqueue_t * q)
572
* Move stuff from the intermediate buffer to the EP queue
574
max_bytes = q->max_out_blocks * 4;
575
next = (q->playbuf_t + 1) % QUEUE_ENTRIES;
576
if (next == q->playbuf_h) /* No more space in any of the buffers */
581
qbuf = q->playbuf[q->playbuf_t];
582
memcpy (qbuf, midic->output_buf, max_bytes);
583
memset (midic->output_buf, 0, max_bytes);
587
submit_output (devc, q);
594
midisport_flush_output (int dev)
596
midisport_midic *midic = midi_devs[dev]->devc;
597
midisport_devc *devc = midic->devc;
598
midisport_outqueue_t *q;
599
oss_native_word flags;
600
oss_native_word qflags;
602
q = &devc->out_queues[midic->outqueue_ix];
604
MUTEX_ENTER_IRQDISABLE (midic->mutex, flags);
605
MUTEX_ENTER_IRQDISABLE (q->mutex, qflags);
606
do_flush (devc, midic, q);
607
MUTEX_EXIT_IRQRESTORE (q->mutex, qflags);
608
MUTEX_EXIT_IRQRESTORE (midic->mutex, flags);
613
midisport_bulk_write (int dev, unsigned char *buf, int len)
615
midisport_midic *midic = midi_devs[dev]->devc;
616
midisport_devc *devc = midic->devc;
617
oss_native_word flags;
618
oss_native_word qflags;
619
int i, l = 0, n = 0, p;
621
midisport_outqueue_t *q;
622
unsigned char *outbuf;
624
if (midic->outqueue_ix < 0 || midic->outqueue_ix >= devc->num_queues)
626
cmn_err (CE_WARN, "Bad output queue index %d\n", midic->outqueue_ix);
630
q = &devc->out_queues[midic->outqueue_ix];
632
MUTEX_ENTER_IRQDISABLE (midic->mutex, flags);
634
//max_bytes = q->max_out_blocks * 4;
636
for (i = 0; i < len; i += 3)
643
if ((p + 4) >= q->max_out_blocks)
646
MUTEX_ENTER_IRQDISABLE (q->mutex, qflags);
648
next = (q->playbuf_t + 1) % QUEUE_ENTRIES;
649
if (next == q->playbuf_h) /* No more space in any of the buffers */
651
MUTEX_EXIT_IRQRESTORE (q->mutex, qflags);
652
MUTEX_EXIT_IRQRESTORE (midic->mutex, flags);
656
if (!do_flush (devc, midic, q)) /* Output FIFO full */
658
MUTEX_EXIT_IRQRESTORE (q->mutex, qflags);
662
MUTEX_EXIT_IRQRESTORE (q->mutex, qflags);
665
outbuf = midic->output_buf + p;
666
memcpy (outbuf, buf, l);
667
outbuf[3] = (midic->portnum << 4) | l;
668
midic->outbuf_p += 4;
669
if (midic->outbuf_p >= q->max_out_blocks)
670
do_flush (devc, midic, q);
674
MUTEX_EXIT_IRQRESTORE (midic->mutex, flags);
679
/*ARGSUSED*/ static int
680
midisport_ioctl (int dev, unsigned cmd, ioctl_arg arg)
685
static midi_driver_t midisport_midi_input_driver = {
686
midisport_open_input,
687
midisport_close_input,
691
static midi_driver_t midisport_midi_output_driver = {
692
midisport_open_output,
693
midisport_close_output,
696
midisport_bulk_write,
697
8 * 3 /* 8 packets of 3 bytes */
701
create_inputs (midisport_devc * devc, char *name, int ep, int ninputs)
707
int flags = MFLAG_INPUT;
709
for (i = 0; i < 32; i++)
711
udi_usbdev_get_endpoint (devc->usbdev, 0, i, &desc_len)) != NULL)
713
if (desc[2] == (ep | 0x80))
717
if (!alphabethic_numbering)
720
if (ninputs > MAX_PORTS)
722
cmn_err (CE_WARN, "Too many input ports %d\n", ninputs);
726
if ((devc->in_ep_desc =
727
udi_usbdev_get_endpoint (devc->usbdev, 0, ix, &desc_len)) == NULL)
729
cmn_err (CE_WARN, "Bad endpoint %d\n", ep);
733
if (!(devc->in_ep_desc[2] & 0x80))
735
cmn_err (CE_WARN, "Bad endpoint %d - not input\n", ep);
738
for (i = 0; i < ninputs; i++)
740
midisport_midic *midic = midic = &devc->in_midic[i];
744
midic->osdev = devc->osdev;
745
MUTEX_INIT (devc->osdev, midic->mutex, MH_DRV + 1);
751
sprintf (tmp, "%s SMPTE status", name);
755
sprintf (tmp, "%s input %c", name, portid + i);
758
oss_install_mididev (OSS_MIDI_DRIVER_VERSION, "MIDISPORT", tmp,
759
&midisport_midi_input_driver,
760
sizeof (midi_driver_t),
761
flags, midic, midic->osdev);
766
create_output (midisport_devc * devc, char *name, int queue_ix)
769
midisport_midic *midic = NULL;
772
int flags = MFLAG_OUTPUT;
774
if (!alphabethic_numbering)
777
n = devc->num_outputs++;
778
midic = &devc->out_midic[n];
780
MUTEX_INIT (devc->osdev, midic->mutex, MH_DRV + 1);
781
midic->osdev = devc->osdev;
783
midic->outqueue_ix = queue_ix;
787
sprintf (tmp, "%s SMPTE control", name);
791
sprintf (tmp, "%s output %c", name, portid + n);
794
oss_install_mididev (OSS_MIDI_DRIVER_VERSION, "MIDISPORT", tmp,
795
&midisport_midi_output_driver,
796
sizeof (midi_driver_t),
797
flags, midic, midic->osdev);
801
init_outqueue (midisport_devc * devc, int ix, int ep, int max_blocks)
804
midisport_outqueue_t *q;
809
for (i = 0; i < 32; i++)
811
udi_usbdev_get_endpoint (devc->usbdev, 0, i, &desc_len)) != NULL)
817
if (ix < 0 || ix > devc->num_queues)
819
cmn_err (CE_WARN, "Endpoint index outside bounds\n");
823
q = &devc->out_queues[ix];
824
MUTEX_INIT (devc->osdev, q->mutex, MH_DRV + 2);
825
q->max_out_blocks = max_blocks;
828
if ((q->out_ep_desc =
829
udi_usbdev_get_endpoint (devc->usbdev, 0, epix, &desc_len)) == NULL)
831
cmn_err (CE_WARN, "Bad endpoint %d\n", ep);
835
if (q->out_ep_desc[2] & 0x80)
837
cmn_err (CE_WARN, "Bad endpoint %d - not output\n", ep);
839
cmn_err (CE_CONT, "Attaching output endpoint %d=%02x\n", ep,
844
midisport_driver (ossusb_devc * usb_devc)
846
midisport_devc *devc;
853
devid = (usb_devc->vendor << 16) | usb_devc->product;
855
if ((devc = PMALLOC (usb_devc->osdev, sizeof (*devc))) == NULL)
857
cmn_err (CE_WARN, "midisport: Out of memory\n");
861
memset (devc, 0, sizeof (*devc));
863
devc->unload_func = midisport_unload;
864
devc->osdev = usb_devc->osdev;
865
MUTEX_INIT (devc->osdev, devc->mutex, MH_DRV);
867
devc->usb_devc = usb_devc;
868
devc->usbdev = usb_devc->last_usbdev;
869
devc->instance_num = instance_num++;
871
for (i = 0; i < 32; i++)
873
udi_usbdev_get_endpoint (devc->usbdev, 0, i, &desc_len)) != NULL)
877
cmn_err (CE_CONT, "Input endpoint %02x\n", desc[2]);
881
cmn_err (CE_CONT, "Output endpoint %02x\n", desc[2]);
885
alphabethic_numbering = 1;
887
devc->num_queues = 2;
892
name = "Midisport 2x2";
893
create_inputs (devc, name, 1, 2);
894
init_outqueue (devc, 0, 2, 8);
895
init_outqueue (devc, 1, 4, 8);
896
create_output (devc, name, 0);
897
create_output (devc, name, 1);
901
name = "Midisport 1x1";
902
devc->num_queues = 1;
903
init_outqueue (devc, 0, 2, 8);
904
create_inputs (devc, name, 1, 1);
905
create_output (devc, name, 0);
910
devc->num_queues = 1;
911
create_inputs (devc, name, 1, 1);
912
init_outqueue (devc, 0, 2, 8);
913
create_output (devc, name, 0);
918
devc->num_queues = 1;
919
create_inputs (devc, name, 1, 1);
920
init_outqueue (devc, 0, 2, 8);
921
create_output (devc, name, 0);
925
name = "Midisport 8x8";
926
alphabethic_numbering = 0;
927
create_inputs (devc, name, 2, 9);
928
init_outqueue (devc, 0, 2, 10);
929
init_outqueue (devc, 1, 4, 8);
930
create_output (devc, name, 0);
931
create_output (devc, name, 1);
932
create_output (devc, name, 0);
933
create_output (devc, name, 1);
934
create_output (devc, name, 0);
935
create_output (devc, name, 1);
936
create_output (devc, name, 0);
937
create_output (devc, name, 1);
938
create_output (devc, name, 0); /* SMPTE control */
942
name = "Midisport 4x4";
943
create_inputs (devc, name, 2, 4);
944
init_outqueue (devc, 0, 2, 16);
945
init_outqueue (devc, 1, 4, 16);
946
create_output (devc, name, 0);
947
create_output (devc, name, 1);
948
create_output (devc, name, 0);
949
create_output (devc, name, 1);
953
cmn_err (CE_WARN, "Unrecognized MIDI device %08x\n", devid);