diff options
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; |