diff options
author | Kristian Amlie <kristian@amlie.name> | 2011-08-26 07:19:49 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2011-08-26 08:12:34 -0400 |
commit | 1ef0e0a05345b7411bdabbfca27f58bd33dcc7c8 (patch) | |
tree | 84e8816d89a6918411226c3f58501db59cd0b924 /sound/usb/midi.c | |
parent | 391e69143d0a05f960e3ab39a8c26b7b230bb8a9 (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.c | 27 |
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 | |||
823 | static 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 | |||
830 | static struct usb_protocol_ops snd_usbmidi_ftdi_ops = { | ||
831 | .input = snd_usbmidi_ftdi_input, | ||
832 | .output = snd_usbmidi_raw_output, | ||
833 | }; | ||
834 | |||
819 | static void snd_usbmidi_us122l_input(struct snd_usb_midi_in_endpoint *ep, | 835 | static 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; |