Date: Wed, 23 Feb 2011 10:30:32 +0100 From: Hans Petter Selasky <hselasky@c2i.net> To: Clemens Ladisch <clemens@ladisch.de> Cc: freebsd-multimedia@freebsd.org Subject: Re: idea: "shim" driver for Roland / Edirol SD-20 MIDI sound module? Message-ID: <201102231030.32160.hselasky@c2i.net> In-Reply-To: <4D63852C.5050603@ladisch.de> References: <20110221234912.fc03786d.torfinn.ingolfsen@broadpark.no> <201102220900.05248.hselasky@c2i.net> <4D63852C.5050603@ladisch.de>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Hi Torfinn,
I got enough information now to make your device work.
Can you try the attached patch on FreeBSD 9-current or simply copy the
attached files?
cd /sys/dev
cat usb_midi_001.patch | patch -C
cat usb_midi_001.patch | patch
--HPS
[-- Attachment #2 --]
=== sound/usb/uaudio.c
==================================================================
--- sound/usb/uaudio.c (revision 218868)
+++ sound/usb/uaudio.c (local)
@@ -401,8 +401,8 @@
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(
@@ -530,10 +530,30 @@
.size = sizeof(struct uaudio_softc),
};
+static const struct usb_device_id uaudio_devs[] = {
+ {USB_VPI(USB_VENDOR_ROLAND, USB_PRODUCT_ROLAND_UM1, 0)},
+ {USB_VPI(USB_VENDOR_ROLAND, USB_PRODUCT_ROLAND_SC8850, 0)},
+ {USB_VPI(USB_VENDOR_ROLAND, USB_PRODUCT_ROLAND_SD90, 0)},
+ {USB_VPI(USB_VENDOR_ROLAND, USB_PRODUCT_ROLAND_UM880N, 0)},
+ {USB_VPI(USB_VENDOR_ROLAND, USB_PRODUCT_ROLAND_UA100, 0)},
+ {USB_VPI(USB_VENDOR_ROLAND, USB_PRODUCT_ROLAND_UM4, 0)},
+ {USB_VPI(USB_VENDOR_ROLAND, USB_PRODUCT_ROLAND_U8, 0)},
+ {USB_VPI(USB_VENDOR_ROLAND, USB_PRODUCT_ROLAND_UM2, 0)},
+ {USB_VPI(USB_VENDOR_ROLAND, USB_PRODUCT_ROLAND_SC8820, 0)},
+ {USB_VPI(USB_VENDOR_ROLAND, USB_PRODUCT_ROLAND_PC300, 0)},
+ {USB_VPI(USB_VENDOR_ROLAND, USB_PRODUCT_ROLAND_SK500, 0)},
+ {USB_VPI(USB_VENDOR_ROLAND, USB_PRODUCT_ROLAND_SCD70, 0)},
+ {USB_VPI(USB_VENDOR_ROLAND, USB_PRODUCT_ROLAND_UM550, 0)},
+ {USB_VPI(USB_VENDOR_ROLAND, USB_PRODUCT_ROLAND_SD20, 0)},
+ {USB_VPI(USB_VENDOR_ROLAND, USB_PRODUCT_ROLAND_SD80, 0)},
+ {USB_VPI(USB_VENDOR_ROLAND, USB_PRODUCT_ROLAND_UA700, 0)},
+};
+
static int
uaudio_probe(device_t dev)
{
struct usb_attach_arg *uaa = device_get_ivars(dev);
+ int error;
if (uaa->usb_mode != USB_MODE_HOST)
return (ENXIO);
@@ -541,22 +561,27 @@
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)
+ error = usbd_lookup_id_by_uaa(uaudio_devs, sizeof(uaudio_devs), uaa);
+ else
+ error = 0;
+
+ /* check for AUDIO control interface */
+
+ if (uaa->info.bInterfaceSubClass == UISUBCLASS_AUDIOCONTROL) {
if (usb_test_quirk(uaa, UQ_BAD_AUDIO))
return (ENXIO);
else
- return (0);
+ return (error);
}
/* check for MIDI stream */
- if ((uaa->info.bInterfaceClass == UICLASS_AUDIO) &&
- (uaa->info.bInterfaceSubClass == UISUBCLASS_MIDISTREAM)) {
- return (0);
- }
+ if (uaa->info.bInterfaceSubClass == UISUBCLASS_MIDISTREAM)
+ return (error);
+
return (ENXIO);
}
@@ -800,6 +825,7 @@
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 +843,20 @@
alt_index++;
}
- if ((id->bInterfaceClass == UICLASS_AUDIO) &&
- (id->bInterfaceSubClass == UISUBCLASS_AUDIOSTREAM)) {
+ uma_if_class = ((id->bInterfaceClass == UICLASS_AUDIO) ||
+ (id->bInterfaceClass == UICLASS_VENDOR));
+
+ 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 +1367,8 @@
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 +3733,7 @@
.basename[0] = "umidi",
};
-static int32_t
+static int
umidi_probe(device_t dev)
{
struct uaudio_softc *sc = device_get_softc(dev);
@@ -3770,7 +3798,7 @@
return (ENXIO); /* failure */
}
-static int32_t
+static int
umidi_detach(device_t dev)
{
struct uaudio_softc *sc = device_get_softc(dev);
=== usb/usbdevs
==================================================================
--- usb/usbdevs (revision 218868)
+++ usb/usbdevs (local)
@@ -2782,9 +2782,23 @@
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 @@
/* 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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201102231030.32160.hselasky>
