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:
		
							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; | ||||
|  | ||||
| @ -39,6 +39,17 @@ | ||||
| 	.idProduct = prod, \ | ||||
| 	.bInterfaceClass = USB_CLASS_VENDOR_SPEC | ||||
| 
 | ||||
| /* FTDI devices */ | ||||
| { | ||||
| 	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), | ||||
|  | ||||
| @ -306,6 +306,7 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip, | ||||
| 		[QUIRK_MIDI_EMAGIC] = create_any_midi_quirk, | ||||
| 		[QUIRK_MIDI_CME] = create_any_midi_quirk, | ||||
| 		[QUIRK_MIDI_AKAI] = create_any_midi_quirk, | ||||
| 		[QUIRK_MIDI_FTDI] = create_any_midi_quirk, | ||||
| 		[QUIRK_AUDIO_STANDARD_INTERFACE] = create_standard_audio_quirk, | ||||
| 		[QUIRK_AUDIO_FIXED_ENDPOINT] = create_fixed_stream_quirk, | ||||
| 		[QUIRK_AUDIO_EDIROL_UAXX] = create_uaxx_quirk, | ||||
|  | ||||
| @ -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, | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user