aboutsummaryrefslogtreecommitdiffstats
path: root/sound/usb/midi.c
diff options
context:
space:
mode:
authorKristian Amlie <kristian@amlie.name>2011-08-26 07:19:49 -0400
committerTakashi Iwai <tiwai@suse.de>2011-08-26 08:12:34 -0400
commit1ef0e0a05345b7411bdabbfca27f58bd33dcc7c8 (patch)
tree84e8816d89a6918411226c3f58501db59cd0b924 /sound/usb/midi.c
parent391e69143d0a05f960e3ab39a8c26b7b230bb8a9 (diff)
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>
Diffstat (limited to 'sound/usb/midi.c')
-rw-r--r--sound/usb/midi.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/sound/usb/midi.c b/sound/usb/midi.c
index f9289102886a..e21f026d9577 100644
--- a/sound/usb/midi.c
+++ b/sound/usb/midi.c
@@ -816,6 +816,22 @@ static struct usb_protocol_ops snd_usbmidi_raw_ops = {
816 .output = snd_usbmidi_raw_output, 816 .output = snd_usbmidi_raw_output,
817}; 817};
818 818
819/*
820 * FTDI protocol: raw MIDI bytes, but input packets have two modem status bytes.
821 */
822
823static void snd_usbmidi_ftdi_input(struct snd_usb_midi_in_endpoint* ep,
824 uint8_t* buffer, int buffer_length)
825{
826 if (buffer_length > 2)
827 snd_usbmidi_input_data(ep, 0, buffer + 2, buffer_length - 2);
828}
829
830static struct usb_protocol_ops snd_usbmidi_ftdi_ops = {
831 .input = snd_usbmidi_ftdi_input,
832 .output = snd_usbmidi_raw_output,
833};
834
819static void snd_usbmidi_us122l_input(struct snd_usb_midi_in_endpoint *ep, 835static void snd_usbmidi_us122l_input(struct snd_usb_midi_in_endpoint *ep,
820 uint8_t *buffer, int buffer_length) 836 uint8_t *buffer, int buffer_length)
821{ 837{
@@ -2163,6 +2179,17 @@ int snd_usbmidi_create(struct snd_card *card,
2163 /* endpoint 1 is input-only */ 2179 /* endpoint 1 is input-only */
2164 endpoints[1].out_cables = 0; 2180 endpoints[1].out_cables = 0;
2165 break; 2181 break;
2182 case QUIRK_MIDI_FTDI:
2183 umidi->usb_protocol_ops = &snd_usbmidi_ftdi_ops;
2184
2185 /* set baud rate to 31250 (48 MHz / 16 / 96) */
2186 err = usb_control_msg(umidi->dev, usb_sndctrlpipe(umidi->dev, 0),
2187 3, 0x40, 0x60, 0, NULL, 0, 1000);
2188 if (err < 0)
2189 break;
2190
2191 err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
2192 break;
2166 default: 2193 default:
2167 snd_printd(KERN_ERR "invalid quirk type %d\n", quirk->type); 2194 snd_printd(KERN_ERR "invalid quirk type %d\n", quirk->type);
2168 err = -ENXIO; 2195 err = -ENXIO;