diff --git a/sound/usb/midi.c b/sound/usb/midi.c index f928910..2c40873 100644 --- a/sound/usb/midi.c +++ b/sound/usb/midi.c @@ -2073,6 +2073,13 @@ void snd_usbmidi_input_start(struct list_head* p) snd_usbmidi_input_start_ep(umidi->endpoints[i].in); } +static int snd_usbmidi_ftdi_command(struct snd_usb_midi *umidi, + u8 command, u16 value) +{ + return usb_control_msg(umidi->dev, usb_sndctrlpipe(umidi->dev, 0), + command, 0x40, value, 0, NULL, 0, 1000); +} + /* * Creates and registers everything needed for a MIDI streaming interface. */ @@ -2163,6 +2170,24 @@ int snd_usbmidi_create(struct snd_card *card, /* endpoint 1 is input-only */ endpoints[1].out_cables = 0; break; + case QUIRK_MIDI_FTDI: + /* reset the port */ + err = snd_usbmidi_ftdi_command(umidi, 0, 0); + if (err < 0) + break; + + /* set mctrl */ + err = snd_usbmidi_ftdi_command(umidi, 1, 0x303); + if (err < 0) + break; + + /* set baud rate */ + err = snd_usbmidi_ftdi_command(umidi, 3, 0xc04e); + if (err < 0) + break; + + err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints); + break; default: snd_printd(KERN_ERR "invalid quirk type %d\n", quirk->type); err = -ENXIO; diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h index a42e3ef..6c223e8 100644 --- a/sound/usb/quirks-table.h +++ b/sound/usb/quirks-table.h @@ -39,6 +39,16 @@ .idProduct = prod, \ .bInterfaceClass = USB_CLASS_VENDOR_SPEC +/* Starr Labs MIDI USB device */ +{ + USB_DEVICE(0x0403, 0xb8d8), + .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { + /* .vendor_name = "STARR LABS", */ + /* .product_name = "Starr Labs MIDI USB device", */ + .ifnum = 0, + .type = QUIRK_MIDI_FTDI + } +}, /* Creative/Toshiba Multimedia Center SB-0500 */ { USB_DEVICE(0x041e, 0x3048), diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index 1e79986..3e2b035 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -80,6 +80,7 @@ enum quirk_type { QUIRK_MIDI_CME, QUIRK_MIDI_AKAI, QUIRK_MIDI_US122L, + QUIRK_MIDI_FTDI, QUIRK_AUDIO_STANDARD_INTERFACE, QUIRK_AUDIO_FIXED_ENDPOINT, QUIRK_AUDIO_EDIROL_UAXX,