svn commit: r218988 - in head/sys/dev: sound/usb usb usb/quirk

Hans Petter Selasky hselasky at FreeBSD.org
Thu Feb 24 09:13:47 UTC 2011


Author: hselasky
Date: Thu Feb 24 09:13:47 2011
New Revision: 218988
URL: http://svn.freebsd.org/changeset/base/218988

Log:
  - Add support for some non-standard USB MIDI devices from Roland, by
  means of allowing vendor specific interface class for audio and MIDI devices.
  - Add new quirks for this. The vendor and product list in OpenBSD's
  dev/usb/umidi_quirks.c was used as reference.
  
  MFC after:	14 days
  Approved by:	thompsa (mentor)

Modified:
  head/sys/dev/sound/usb/uaudio.c
  head/sys/dev/usb/quirk/usb_quirk.c
  head/sys/dev/usb/quirk/usb_quirk.h
  head/sys/dev/usb/usbdevs

Modified: head/sys/dev/sound/usb/uaudio.c
==============================================================================
--- head/sys/dev/sound/usb/uaudio.c	Thu Feb 24 09:12:45 2011	(r218987)
+++ head/sys/dev/sound/usb/uaudio.c	Thu Feb 24 09:13:47 2011	(r218988)
@@ -265,6 +265,7 @@ struct uaudio_softc {
 	uint8_t	sc_uq_au_inp_async:1;
 	uint8_t	sc_uq_au_no_xu:1;
 	uint8_t	sc_uq_bad_adc:1;
+	uint8_t	sc_uq_au_vendor_class:1;
 };
 
 struct uaudio_search_result {
@@ -401,8 +402,8 @@ static int	umidi_open(struct usb_fifo *,
 static int	umidi_ioctl(struct usb_fifo *, u_long cmd, void *, int);
 static void	umidi_close(struct usb_fifo *, int);
 static void	umidi_init(device_t dev);
-static int32_t	umidi_probe(device_t dev);
-static int32_t	umidi_detach(device_t dev);
+static int	umidi_probe(device_t dev);
+static int	umidi_detach(device_t dev);
 
 #ifdef USB_DEBUG
 static void	uaudio_chan_dump_ep_desc(
@@ -541,10 +542,16 @@ uaudio_probe(device_t dev)
 	if (uaa->use_generic == 0)
 		return (ENXIO);
 
-	/* trigger on the control interface */
+	/* lookup non-standard device */
 
-	if ((uaa->info.bInterfaceClass == UICLASS_AUDIO) &&
-	    (uaa->info.bInterfaceSubClass == UISUBCLASS_AUDIOCONTROL)) {
+	if (uaa->info.bInterfaceClass != UICLASS_AUDIO) {
+		if (usb_test_quirk(uaa, UQ_AU_VENDOR_CLASS) == 0)
+			return (ENXIO);
+	}
+
+	/* check for AUDIO control interface */
+
+	if (uaa->info.bInterfaceSubClass == UISUBCLASS_AUDIOCONTROL) {
 		if (usb_test_quirk(uaa, UQ_BAD_AUDIO))
 			return (ENXIO);
 		else
@@ -553,9 +560,11 @@ uaudio_probe(device_t dev)
 
 	/* check for MIDI stream */
 
-	if ((uaa->info.bInterfaceClass == UICLASS_AUDIO) &&
-	    (uaa->info.bInterfaceSubClass == UISUBCLASS_MIDISTREAM)) {
-		return (0);
+	if (uaa->info.bInterfaceSubClass == UISUBCLASS_MIDISTREAM) {
+		if (usb_test_quirk(uaa, UQ_BAD_MIDI))
+			return (ENXIO);
+		else
+			return (0);
 	}
 	return (ENXIO);
 }
@@ -586,6 +595,9 @@ uaudio_attach(device_t dev)
 	if (usb_test_quirk(uaa, UQ_BAD_ADC))
 		sc->sc_uq_bad_adc = 1;
 
+	if (usb_test_quirk(uaa, UQ_AU_VENDOR_CLASS))
+		sc->sc_uq_au_vendor_class = 1;
+
 	umidi_init(dev);
 
 	device_set_usb_desc(dev);
@@ -800,6 +812,7 @@ uaudio_chan_fill_info_sub(struct uaudio_
 	uint8_t bBitResolution;
 	uint8_t x;
 	uint8_t audio_if = 0;
+	uint8_t uma_if_class;
 
 	while ((desc = usb_desc_foreach(cd, desc))) {
 
@@ -817,19 +830,22 @@ uaudio_chan_fill_info_sub(struct uaudio_
 				alt_index++;
 			}
 
-			if ((id->bInterfaceClass == UICLASS_AUDIO) &&
-			    (id->bInterfaceSubClass == UISUBCLASS_AUDIOSTREAM)) {
+			uma_if_class =
+			    ((id->bInterfaceClass == UICLASS_AUDIO) ||
+			    ((id->bInterfaceClass == UICLASS_VENDOR) &&
+			    (sc->sc_uq_au_vendor_class != 0)));
+
+			if ((uma_if_class != 0) && (id->bInterfaceSubClass == UISUBCLASS_AUDIOSTREAM)) {
 				audio_if = 1;
 			} else {
 				audio_if = 0;
 			}
 
-			if ((id->bInterfaceClass == UICLASS_AUDIO) &&
+			if ((uma_if_class != 0) &&
 			    (id->bInterfaceSubClass == UISUBCLASS_MIDISTREAM)) {
 
 				/*
 				 * XXX could allow multiple MIDI interfaces
-				 * XXX
 				 */
 
 				if ((sc->sc_midi_chan.valid == 0) &&
@@ -1340,7 +1356,8 @@ uaudio_chan_init(struct uaudio_softc *sc
 		    usbd_errstr(err));
 		goto error;
 	}
-	usbd_set_parent_iface(sc->sc_udev, iface_index, sc->sc_mixer_iface_index);
+	usbd_set_parent_iface(sc->sc_udev, iface_index,
+	    sc->sc_mixer_iface_index);
 
 	/*
 	 * If just one sampling rate is supported,
@@ -3705,7 +3722,7 @@ static struct usb_fifo_methods umidi_fif
 	.basename[0] = "umidi",
 };
 
-static int32_t
+static int
 umidi_probe(device_t dev)
 {
 	struct uaudio_softc *sc = device_get_softc(dev);
@@ -3770,7 +3787,7 @@ detach:
 	return (ENXIO);			/* failure */
 }
 
-static int32_t
+static int
 umidi_detach(device_t dev)
 {
 	struct uaudio_softc *sc = device_get_softc(dev);

Modified: head/sys/dev/usb/quirk/usb_quirk.c
==============================================================================
--- head/sys/dev/usb/quirk/usb_quirk.c	Thu Feb 24 09:12:45 2011	(r218987)
+++ head/sys/dev/usb/quirk/usb_quirk.c	Thu Feb 24 09:13:47 2011	(r218988)
@@ -94,11 +94,7 @@ static struct usb_quirk_entry usb_quirks
 	USB_QUIRK(SILICONPORTALS, YAPPHONE, 0x100, 0x100, UQ_AU_INP_ASYNC),
 	USB_QUIRK(LOGITECH, UN53B, 0x0000, 0xffff, UQ_NO_STRINGS),
 	USB_QUIRK(ELSA, MODEM1, 0x0000, 0xffff, UQ_CFG_INDEX_1),
-
-	/*
-	 * XXX The following quirks should have a more specific revision
-	 * number:
-	 */
+	/* Quirks for printer devices */
 	USB_QUIRK(HP, 895C, 0x0000, 0xffff, UQ_BROKEN_BIDIR),
 	USB_QUIRK(HP, 880C, 0x0000, 0xffff, UQ_BROKEN_BIDIR),
 	USB_QUIRK(HP, 815C, 0x0000, 0xffff, UQ_BROKEN_BIDIR),
@@ -458,6 +454,24 @@ static struct usb_quirk_entry usb_quirks
 	USB_QUIRK(CHIPSBANK, USBMEMSTICK, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
 	USB_QUIRK(CHIPSBANK, USBMEMSTICK1, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
 	USB_QUIRK(NEWLINK, USB2IDEBRIDGE, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE),
+
+	/* Non-standard USB MIDI devices */
+	USB_QUIRK(ROLAND, UM1, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+	USB_QUIRK(ROLAND, SC8850, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+	USB_QUIRK(ROLAND, SD90, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+	USB_QUIRK(ROLAND, UM880N, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+	USB_QUIRK(ROLAND, UA100, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+	USB_QUIRK(ROLAND, UM4, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+	USB_QUIRK(ROLAND, U8, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+	USB_QUIRK(ROLAND, UM2, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+	USB_QUIRK(ROLAND, SC8820, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+	USB_QUIRK(ROLAND, PC300, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+	USB_QUIRK(ROLAND, SK500, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+	USB_QUIRK(ROLAND, SCD70, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+	USB_QUIRK(ROLAND, UM550, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+	USB_QUIRK(ROLAND, SD20, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+	USB_QUIRK(ROLAND, SD80, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
+	USB_QUIRK(ROLAND, UA700, 0x0000, 0xffff, UQ_AU_VENDOR_CLASS),
 };
 #undef USB_QUIRK_VP
 #undef USB_QUIRK
@@ -522,6 +536,8 @@ static const char *usb_quirk_str[USB_QUI
 	[UQ_MSC_EJECT_SAEL_M460]	= "UQ_MSC_EJECT_SAEL_M460",
 	[UQ_MSC_EJECT_HUAWEISCSI]	= "UQ_MSC_EJECT_HUAWEISCSI",
 	[UQ_MSC_EJECT_TCT]		= "UQ_MSC_EJECT_TCT",
+	[UQ_BAD_MIDI]			= "UQ_BAD_MIDI",
+	[UQ_AU_VENDOR_CLASS]		= "UQ_AU_VENDOR_CLASS",
 };
 
 /*------------------------------------------------------------------------*

Modified: head/sys/dev/usb/quirk/usb_quirk.h
==============================================================================
--- head/sys/dev/usb/quirk/usb_quirk.h	Thu Feb 24 09:12:45 2011	(r218987)
+++ head/sys/dev/usb/quirk/usb_quirk.h	Thu Feb 24 09:13:47 2011	(r218988)
@@ -100,6 +100,9 @@ enum {
 	UQ_MSC_EJECT_HUAWEISCSI,	/* ejects after Huawei SCSI command */
 	UQ_MSC_EJECT_TCT,		/* ejects after TCT SCSI command */
 
+	UQ_BAD_MIDI,		/* device claims MIDI class, but isn't */
+	UQ_AU_VENDOR_CLASS,	/* audio device uses vendor and not audio class */
+
 	USB_QUIRK_MAX
 };
 

Modified: head/sys/dev/usb/usbdevs
==============================================================================
--- head/sys/dev/usb/usbdevs	Thu Feb 24 09:12:45 2011	(r218987)
+++ head/sys/dev/usb/usbdevs	Thu Feb 24 09:13:47 2011	(r218988)
@@ -2782,9 +2782,23 @@ product RICOH VGPVCC8		0x183b	VGP-VCC8 C
 product REINERSCT CYBERJACK_ECOM	0x0100	e-com cyberJack
 
 /* Roland products */
+product ROLAND UA100		0x0000	UA-100 Audio I/F
+product ROLAND UM4		0x0002	UM-4 MIDI I/F
+product ROLAND SC8850		0x0003	SC-8850 MIDI Synth
+product ROLAND U8		0x0004	U-8 Audio I/F
+product ROLAND UM2		0x0005	UM-2 MIDI I/F
+product ROLAND SC8820		0x0007	SC-8820 MIDI Synth
+product ROLAND PC300		0x0008	PC-300 MIDI Keyboard
 product ROLAND UM1		0x0009	UM-1 MIDI I/F
+product ROLAND SK500		0x000b	SK-500 MIDI Keyboard
+product ROLAND SCD70		0x000c	SC-D70 MIDI Synth
 product ROLAND UM880N		0x0014	EDIROL UM-880 MIDI I/F (native)
 product ROLAND UM880G		0x0015	EDIROL UM-880 MIDI I/F (generic)
+product ROLAND SD90		0x0016	SD-90 MIDI Synth
+product ROLAND UM550		0x0023	UM-550 MIDI I/F
+product ROLAND SD20		0x0027	SD-20 MIDI Synth
+product ROLAND SD80		0x0029	SD-80 MIDI Synth
+product ROLAND UA700		0x002b	UA-700 Audio I/F
 
 /* Rockfire products */
 product ROCKFIRE GAMEPAD	0x2033	gamepad 203USB
@@ -3394,10 +3408,11 @@ product XYRATEX PRISM_GT_2	0x2002	PrismG
 /* Yamaha products */
 product YAMAHA UX256		0x1000	UX256 MIDI I/F
 product YAMAHA UX96		0x1008	UX96 MIDI I/F
+product YAMAHA RPU200		0x3104	RP-U200
 product YAMAHA RTA54I		0x4000	NetVolante RTA54i Broadband&ISDN Router
-product YAMAHA RTA55I		0x4004	NetVolante RTA55i Broadband VoIP Router
 product YAMAHA RTW65B		0x4001	NetVolante RTW65b Broadband Wireless Router
 product YAMAHA RTW65I		0x4002	NetVolante RTW65i Broadband&ISDN Wireless Router
+product YAMAHA RTA55I		0x4004	NetVolante RTA55i Broadband VoIP Router
 
 /* Yano products */
 product YANO U640MO		0x0101	U640MO-03


More information about the svn-src-all mailing list