ALSA: usb-audio: add Starr Labs USB MIDI support
Add support for Starr Labs USB MIDI devices such as the Z7S, which are based on an FTDI serial UART chip. Based on a patch by Daniel Mack. Signed-off-by: Kristian Amlie <kristian@amlie.name> Acked-by: Daniel Mack <zonque@gmail.com> Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:

committed by
Takashi Iwai

parent
391e69143d
commit
1ef0e0a053
@@ -816,6 +816,22 @@ static struct usb_protocol_ops snd_usbmidi_raw_ops = {
|
||||
.output = snd_usbmidi_raw_output,
|
||||
};
|
||||
|
||||
/*
|
||||
* FTDI protocol: raw MIDI bytes, but input packets have two modem status bytes.
|
||||
*/
|
||||
|
||||
static void snd_usbmidi_ftdi_input(struct snd_usb_midi_in_endpoint* ep,
|
||||
uint8_t* buffer, int buffer_length)
|
||||
{
|
||||
if (buffer_length > 2)
|
||||
snd_usbmidi_input_data(ep, 0, buffer + 2, buffer_length - 2);
|
||||
}
|
||||
|
||||
static struct usb_protocol_ops snd_usbmidi_ftdi_ops = {
|
||||
.input = snd_usbmidi_ftdi_input,
|
||||
.output = snd_usbmidi_raw_output,
|
||||
};
|
||||
|
||||
static void snd_usbmidi_us122l_input(struct snd_usb_midi_in_endpoint *ep,
|
||||
uint8_t *buffer, int buffer_length)
|
||||
{
|
||||
@@ -2163,6 +2179,17 @@ int snd_usbmidi_create(struct snd_card *card,
|
||||
/* endpoint 1 is input-only */
|
||||
endpoints[1].out_cables = 0;
|
||||
break;
|
||||
case QUIRK_MIDI_FTDI:
|
||||
umidi->usb_protocol_ops = &snd_usbmidi_ftdi_ops;
|
||||
|
||||
/* set baud rate to 31250 (48 MHz / 16 / 96) */
|
||||
err = usb_control_msg(umidi->dev, usb_sndctrlpipe(umidi->dev, 0),
|
||||
3, 0x40, 0x60, 0, NULL, 0, 1000);
|
||||
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;
|
||||
|
Reference in New Issue
Block a user