On 29/01/17(Sun) 14:45, Christopher Zimmermann wrote:
> On 2017-01-29 Martin Pieuchot <[email protected]> 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