Add two more quirks:

UQ_AU_NO_FRAC for audio devices that cannot handle adjustment for fractional
    sample size.
  UQ_AU_INP_ASYNC for input devices that claim to be adaptive, but are in fact
    asynchronous (an easy mistake to make unless you read the specs carefully :)
This commit is contained in:
augustss 2000-12-28 11:56:22 +00:00
parent 1e0da50daa
commit 20d1ae1adb
3 changed files with 34 additions and 10 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: uaudio.c,v 1.30 2000/12/28 01:01:42 augustss Exp $ */
/* $NetBSD: uaudio.c,v 1.31 2000/12/28 11:56:22 augustss Exp $ */
/*
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@ -128,6 +128,8 @@ struct chan {
int blksize; /* chunk size to report up */
int transferred; /* transferred bytes not reported up */
char nofrac; /* don't do sample rate adjustment */
int curchanbuf;
struct chanbuf {
struct chan *chan;
@ -381,6 +383,9 @@ USB_ATTACH(uaudio)
sc->sc_chan.sc = sc;
if (usbd_get_quirks(sc->sc_udev)->uq_flags & UQ_AU_NO_FRAC)
sc->sc_chan.nofrac = 1;
DPRINTF(("uaudio_attach: doing audio_attach_mi\n"));
#if defined(__OpenBSD__)
audio_attach_mi(&uaudio_hw_if, sc, &sc->sc_dev);
@ -961,7 +966,7 @@ uaudio_add_extension(struct uaudio_softc *sc, usb_descriptor_t *v,
DPRINTFN(2,("uaudio_add_extension: bUnitId=%d bNrInPins=%d\n",
d->bUnitId, d->bNrInPins));
if (usbd_get_quirks(sc->sc_udev)->uq_flags & UQ_NO_XU)
if (usbd_get_quirks(sc->sc_udev)->uq_flags & UQ_AU_NO_XU)
return;
if (d1->bmControls[0] & UA_EXT_ENABLE_MASK) {
@ -1056,6 +1061,10 @@ uaudio_process_as(struct uaudio_softc *sc, char *buf, int *offsp,
dir = UE_GET_DIR(ed->bEndpointAddress);
type = UE_GET_ISO_TYPE(ed->bmAttributes);
if ((usbd_get_quirks(sc->sc_udev)->uq_flags & UQ_AU_INP_ASYNC) &&
dir == UE_DIR_IN && type == UE_ISO_ADAPT)
type = UE_ISO_ASYNC;
/* We can't handle endpoints that need a sync pipe. */
if (dir == UE_DIR_IN ? type == UE_ISO_ADAPT : type == UE_ISO_ASYNC) {
printf("%s: ignored %sput endpoint of type %s\n",
@ -1869,7 +1878,8 @@ uaudio_chan_ptransfer(struct chan *ch)
size = ch->bytes_per_frame;
residue += ch->fraction;
if (residue >= USB_FRAMES_PER_SECOND) {
size += ch->sample_size;
if (!ch->nofrac)
size += ch->sample_size;
residue -= USB_FRAMES_PER_SECOND;
}
cb->sizes[i] = size;
@ -1972,7 +1982,8 @@ uaudio_chan_rtransfer(struct chan *ch)
size = ch->bytes_per_frame;
residue += ch->fraction;
if (residue >= USB_FRAMES_PER_SECOND) {
size += ch->sample_size;
if (!ch->nofrac)
size += ch->sample_size;
residue -= USB_FRAMES_PER_SECOND;
}
cb->sizes[i] = size;
@ -2016,9 +2027,17 @@ uaudio_chan_rintr(usbd_xfer_handle xfer, usbd_private_handle priv,
usbd_get_xfer_status(xfer, NULL, NULL, &count, NULL);
DPRINTFN(5,("uaudio_chan_rintr: count=%d, transferred=%d\n",
count, ch->transferred));
if (count < cb->size) {
/* if the device fails to keep up, copy last byte */
u_char b = count ? cb->buffer[count-1] : 0;
while (count < cb->size)
cb->buffer[count++] = b;
}
#ifdef DIAGNOSTIC
if (count != cb->size) {
printf("uaudio_chan_pintr: count(%d) != size(%d)\n",
printf("uaudio_chan_rintr: count(%d) != size(%d)\n",
count, cb->size);
}
#endif
@ -2042,7 +2061,7 @@ uaudio_chan_rintr(usbd_xfer_handle xfer, usbd_private_handle priv,
s = splaudio();
while (ch->transferred >= ch->blksize) {
ch->transferred -= ch->blksize;
DPRINTFN(5,("uaudio_chan_pintr: call %p(%p)\n",
DPRINTFN(5,("uaudio_chan_rintr: call %p(%p)\n",
ch->intr, ch->arg));
ch->intr(ch->arg);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: usb_quirks.c,v 1.33 2000/12/11 05:41:00 augustss Exp $ */
/* $NetBSD: usb_quirks.c,v 1.34 2000/12/28 11:56:23 augustss Exp $ */
/* $FreeBSD: src/sys/dev/usb/usb_quirks.c,v 1.13 1999/11/17 22:33:47 n_hibma Exp $ */
/*
@ -64,7 +64,7 @@ Static struct usbd_quirk_entry {
{ USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_SERIAL1, 0x101, { UQ_NO_STRINGS }},
{ USB_VENDOR_WACOM, USB_PRODUCT_WACOM_CT0405U, 0x101, { UQ_NO_STRINGS }},
{ USB_VENDOR_DALLAS, USB_PRODUCT_DALLAS_J6502, 0x0a2, { UQ_BAD_ADC }},
{ USB_VENDOR_DALLAS, USB_PRODUCT_DALLAS_J6502, 0x0a2, { UQ_NO_XU }},
{ USB_VENDOR_DALLAS, USB_PRODUCT_DALLAS_J6502, 0x0a2, { UQ_AU_NO_XU }},
{ USB_VENDOR_ALTEC, USB_PRODUCT_ALTEC_ADA70, 0x103, { UQ_BAD_ADC }},
{ USB_VENDOR_ALTEC, USB_PRODUCT_ALTEC_ASC495, 0x000, { UQ_BAD_AUDIO }},
{ USB_VENDOR_QTRONIX, USB_PRODUCT_QTRONIX_980N, 0x110, { UQ_SPUR_BUT_UP }},
@ -76,6 +76,9 @@ Static struct usbd_quirk_entry {
{ USB_VENDOR_TI, USB_PRODUCT_TI_UTUSB41, 0x110, { UQ_POWER_CLAIM }},
{ USB_VENDOR_ACERP, USB_PRODUCT_ACERP_ACERSCAN_320U,
0x000, { UQ_NO_STRINGS }},
{ USB_VENDOR_TELEX, USB_PRODUCT_TELEX_MIC1, 0x009, { UQ_AU_NO_FRAC }},
{ USB_VENDOR_SILICONPORTALS, USB_PRODUCT_SILICONPORTALS_YAPPHONE,
0x100, { UQ_AU_INP_ASYNC }},
{ 0, 0, 0, { 0 } }
};

View File

@ -1,4 +1,4 @@
/* $NetBSD: usb_quirks.h,v 1.16 2000/12/11 05:41:00 augustss Exp $ */
/* $NetBSD: usb_quirks.h,v 1.17 2000/12/28 11:56:23 augustss Exp $ */
/* $FreeBSD: src/sys/dev/usb/usb_quirks.h,v 1.9 1999/11/12 23:31:03 n_hibma Exp $ */
/*
@ -48,8 +48,10 @@ struct usbd_quirks {
#define UQ_BUS_POWERED 0x0020 /* device is bus powered, despite claim */
#define UQ_BAD_AUDIO 0x0040 /* device claims audio class, but isn't */
#define UQ_SPUR_BUT_UP 0x0080 /* spurious mouse button up events */
#define UQ_NO_XU 0x0100 /* audio device has broken extension unit */
#define UQ_AU_NO_XU 0x0100 /* audio device has broken extension unit */
#define UQ_POWER_CLAIM 0x0200 /* hub lies about power status */
#define UQ_AU_NO_FRAC 0x0400 /* don't adjust for fractional samples */
#define UQ_AU_INP_ASYNC 0x0800 /* input is async despite claim of adaptive */
};
extern struct usbd_quirks usbd_no_quirk;