On 29/01/17(Sun) 14:45, Christopher Zimmermann wrote: > On 2017-01-29 Martin Pieuchot <m...@openbsd.org> wrote: > > On 28/01/17(Sat) 13:02, Christopher Zimmermann wrote: > > > Hi, > > > > > > I needed to add some quirks to support the M-Audio FastTrack Pro USB > > > audio interface. > > > > Since this is just for one device there's no need for a quirk. Simply > > check for the device ID. > > You are talking about usb_subr.c? Done.
No I'm not :) > > > * The device needs to be switched to the configuration 2 to show all > > > its capabilities. This is done by a new quirk in usb_subr.c > > > > Then do not match the first configuration in uaudio(4). > > I already tried that. It can be done, but then the umidi driver needs > changes, too, because it would otherwise claim the device in > configuration 0. > Should I do it this way without touching usb_subr.c? Yes please, do not touch usb_subr.c. > Here's an updated diff which changes configuration explicitely in > usb_subr.c and doesn't touch umidi.c. Also make sure your comment below respect style(9). > > > Christopher > > > Index: uaudio.c > =================================================================== > RCS file: /cvs/src/sys/dev/usb/uaudio.c,v > retrieving revision 1.122 > diff -u -p -r1.122 uaudio.c > --- uaudio.c 3 Jan 2017 06:45:58 -0000 1.122 > +++ uaudio.c 29 Jan 2017 13:40:36 -0000 > @@ -172,6 +172,7 @@ struct chan { > #define UAUDIO_FLAG_VENDOR_CLASS 0x0010 /* claims vendor class but > works */ > #define UAUDIO_FLAG_DEPENDENT 0x0020 /* play and record params must > equal */ > #define UAUDIO_FLAG_EMU0202 0x0040 > +#define UAUDIO_FLAG_BE 0x0080 > > struct uaudio_devs { > struct usb_devno uv_dev; > @@ -223,7 +224,9 @@ struct uaudio_devs { > { { USB_VENDOR_LOGITECH, USB_PRODUCT_LOGITECH_QUICKCAMZOOM }, > UAUDIO_FLAG_BAD_AUDIO }, > { { USB_VENDOR_TELEX, USB_PRODUCT_TELEX_MIC1 }, > - UAUDIO_FLAG_NO_FRAC } > + UAUDIO_FLAG_NO_FRAC }, > + { { USB_VENDOR_MAUDIO, USB_PRODUCT_MAUDIO_FASTTRACKPRO }, > + UAUDIO_FLAG_BE | UAUDIO_FLAG_DEPENDENT } > }; > #define uaudio_lookup(v, p) \ > ((struct uaudio_devs *)usb_lookup(uaudio_devs, v, p)) > @@ -531,8 +534,19 @@ uaudio_attach(struct device *parent, str > found = 1; > } > } > - if (found) > + if (found) { > usbd_claim_iface(sc->sc_udev, i); > + if (uaa->vendor == USB_VENDOR_MAUDIO && > + uaa->product == USB_PRODUCT_MAUDIO_FASTTRACKPRO) { > + /* temporarily switch every iface to 24bit. > + * Causes the device to be big endian even > + * for 16bit samples. > + * using 16bits first will cause the device > + * to break when we later switch to 24bit. */ > + usbd_set_interface(sc->sc_alts[i].ifaceh, 2); > + usbd_set_interface(sc->sc_alts[i].ifaceh, 0); > + } > + } > } > > for (j = 0; j < sc->sc_nalts; j++) { > @@ -1662,7 +1676,10 @@ uaudio_process_as(struct uaudio_softc *s > } else if (prec == 24) { > sc->sc_altflags |= HAS_24; > } > - enc = AUDIO_ENCODING_SLINEAR_LE; > + if (sc->sc_quirks & UAUDIO_FLAG_BE) > + enc = AUDIO_ENCODING_SLINEAR_BE; > + else > + enc = AUDIO_ENCODING_SLINEAR_LE; > format_str = "pcm"; > break; > case UA_FMT_PCM8: > @@ -1687,9 +1704,13 @@ uaudio_process_as(struct uaudio_softc *s > return (USBD_NORMAL_COMPLETION); > } > #ifdef UAUDIO_DEBUG > - printf("%s: %s: %d-ch %d-bit %d-byte %s,", sc->sc_dev.dv_xname, > + printf("%s: %s: alt %d(%d) for interface %d %d-ch %d-bit %d-byte %s enc > %d,", > + sc->sc_dev.dv_xname, > dir == UE_DIR_IN ? "recording" : "playback", > - chan, prec, bps, format_str); > + id->bAlternateSetting, > + sc->sc_nalts, > + id->bInterfaceNumber, > + chan, prec, bps, format_str, enc); > if (asf1d->bSamFreqType == UA_SAMP_CONTNUOUS) { > printf(" %d-%dHz\n", UA_SAMP_LO(asf1d), UA_SAMP_HI(asf1d)); > } else { > @@ -3312,6 +3333,9 @@ uaudio_set_params(void *addr, int setmod > } > break; > } > + > + if (sc->sc_quirks & UAUDIO_FLAG_BE) > + p->encoding = AUDIO_ENCODING_SLINEAR_BE; > > i = uaudio_match_alt(sc, p, mode); > if (i < 0) { > Index: usb_subr.c > =================================================================== > RCS file: /cvs/src/sys/dev/usb/usb_subr.c,v > retrieving revision 1.131 > diff -u -p -r1.131 usb_subr.c > --- usb_subr.c 19 Sep 2016 16:46:10 -0000 1.131 > +++ usb_subr.c 29 Jan 2017 13:40:37 -0000 > @@ -906,7 +906,13 @@ usbd_probe_and_attach(struct device *par > DPRINTF(("usbd_probe_and_attach: looping over %d configurations\n", > dd->bNumConfigurations)); > /* Next try with interface drivers. */ > - for (confi = 0; confi < dd->bNumConfigurations; confi++) { > + if (uaa.vendor == USB_VENDOR_MAUDIO && > + uaa.product == USB_PRODUCT_MAUDIO_FASTTRACKPRO) > + confi = 1; > + else > + confi = 0; > + for (; confi < dd->bNumConfigurations; confi++) > + { > DPRINTFN(1,("usbd_probe_and_attach: trying config idx=%d\n", > confi)); > err = usbd_set_config_index(dev, confi, 1); > Index: usbdevs > =================================================================== > RCS file: /cvs/src/sys/dev/usb/usbdevs,v > retrieving revision 1.673 > diff -u -p -r1.673 usbdevs > --- usbdevs 15 Dec 2016 15:42:05 -0000 1.673 > +++ usbdevs 29 Jan 2017 13:40:38 -0000 > @@ -283,6 +283,7 @@ vendor DIGITALSTREAM 0x074e Digital Stre > vendor AUREAL 0x0755 Aureal Semiconductor > vendor IDOWELL 0x075d iDowell > vendor MIDIMAN 0x0763 Midiman > +vendor MAUDIO 0x0763 M-Audio > vendor CYBERPOWER 0x0764 CyberPower > vendor SURECOM 0x0769 Surecom Technology > vendor LINKSYS2 0x077b Linksys > @@ -3027,6 +3028,9 @@ product MICROTEK V6UL 0x80ac ScanMaker > > /* Midiman products */ > product MIDIMAN MIDISPORT2X2 0x1001 Midisport 2x2 > + > +/* M-Audio products */ > +product MAUDIO FASTTRACKPRO 0x2012 FastTrack Pro > > /* Minds At Work LLC products */ > product MINDSATWORK DW 0x0001 Digital Wallet > Index: usbdevs.h > =================================================================== > RCS file: /cvs/src/sys/dev/usb/usbdevs.h,v > retrieving revision 1.685 > diff -u -p -r1.685 usbdevs.h > --- usbdevs.h 15 Dec 2016 15:44:46 -0000 1.685 > +++ usbdevs.h 29 Jan 2017 13:40:40 -0000 > @@ -1,4 +1,4 @@ > -/* $OpenBSD: usbdevs.h,v 1.685 2016/12/15 15:44:46 pirofti Exp $ */ > +/* $OpenBSD$ */ > > /* > * THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. > @@ -290,6 +290,7 @@ > #define USB_VENDOR_AUREAL 0x0755 /* Aureal Semiconductor > */ > #define USB_VENDOR_IDOWELL 0x075d /* iDowell */ > #define USB_VENDOR_MIDIMAN 0x0763 /* Midiman */ > +#define USB_VENDOR_MAUDIO 0x0763 /* M-Audio */ > #define USB_VENDOR_CYBERPOWER 0x0764 /* CyberPower */ > #define USB_VENDOR_SURECOM 0x0769 /* Surecom Technology */ > #define USB_VENDOR_LINKSYS2 0x077b /* Linksys */ > @@ -3034,6 +3035,9 @@ > > /* Midiman products */ > #define USB_PRODUCT_MIDIMAN_MIDISPORT2X2 0x1001 /* > Midisport 2x2 */ > + > +/* M-Audio products */ > +#define USB_PRODUCT_MAUDIO_FASTTRACKPRO 0x2012 /* FastTrack > Pro */ > > /* Minds At Work LLC products */ > #define USB_PRODUCT_MINDSATWORK_DW 0x0001 /* Digital > Wallet */ > Index: usbdevs_data.h > =================================================================== > RCS file: /cvs/src/sys/dev/usb/usbdevs_data.h,v > retrieving revision 1.679 > diff -u -p -r1.679 usbdevs_data.h > --- usbdevs_data.h 15 Dec 2016 15:44:46 -0000 1.679 > +++ usbdevs_data.h 29 Jan 2017 13:40:44 -0000 > @@ -1,4 +1,4 @@ > -/* $OpenBSD: usbdevs_data.h,v 1.679 2016/12/15 15:44:46 pirofti Exp $ > */ > +/* $OpenBSD$ */ > > /* > * THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. > @@ -7334,6 +7334,10 @@ const struct usb_known_product usb_known > "Midisport 2x2", > }, > { > + USB_VENDOR_MAUDIO, USB_PRODUCT_MAUDIO_FASTTRACKPRO, > + "FastTrack Pro", > + }, > + { > USB_VENDOR_MINDSATWORK, USB_PRODUCT_MINDSATWORK_DW, > "Digital Wallet", > }, > @@ -12484,6 +12488,10 @@ const struct usb_known_vendor usb_known_ > { > USB_VENDOR_MIDIMAN, > "Midiman", > + }, > + { > + USB_VENDOR_MAUDIO, > + "M-Audio", > }, > { > USB_VENDOR_CYBERPOWER, > > > > > -- > http://gmerlin.de > OpenPGP: http://gmerlin.de/christopher.pub > 2779 7F73 44FD 0736 B67A C410 69EC 7922 34B4 2566