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:
parent
1e0da50daa
commit
20d1ae1adb
@ -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.
|
* Copyright (c) 1999 The NetBSD Foundation, Inc.
|
||||||
@ -128,6 +128,8 @@ struct chan {
|
|||||||
int blksize; /* chunk size to report up */
|
int blksize; /* chunk size to report up */
|
||||||
int transferred; /* transferred bytes not reported up */
|
int transferred; /* transferred bytes not reported up */
|
||||||
|
|
||||||
|
char nofrac; /* don't do sample rate adjustment */
|
||||||
|
|
||||||
int curchanbuf;
|
int curchanbuf;
|
||||||
struct chanbuf {
|
struct chanbuf {
|
||||||
struct chan *chan;
|
struct chan *chan;
|
||||||
@ -381,6 +383,9 @@ USB_ATTACH(uaudio)
|
|||||||
|
|
||||||
sc->sc_chan.sc = sc;
|
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"));
|
DPRINTF(("uaudio_attach: doing audio_attach_mi\n"));
|
||||||
#if defined(__OpenBSD__)
|
#if defined(__OpenBSD__)
|
||||||
audio_attach_mi(&uaudio_hw_if, sc, &sc->sc_dev);
|
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",
|
DPRINTFN(2,("uaudio_add_extension: bUnitId=%d bNrInPins=%d\n",
|
||||||
d->bUnitId, d->bNrInPins));
|
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;
|
return;
|
||||||
|
|
||||||
if (d1->bmControls[0] & UA_EXT_ENABLE_MASK) {
|
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);
|
dir = UE_GET_DIR(ed->bEndpointAddress);
|
||||||
type = UE_GET_ISO_TYPE(ed->bmAttributes);
|
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. */
|
/* We can't handle endpoints that need a sync pipe. */
|
||||||
if (dir == UE_DIR_IN ? type == UE_ISO_ADAPT : type == UE_ISO_ASYNC) {
|
if (dir == UE_DIR_IN ? type == UE_ISO_ADAPT : type == UE_ISO_ASYNC) {
|
||||||
printf("%s: ignored %sput endpoint of type %s\n",
|
printf("%s: ignored %sput endpoint of type %s\n",
|
||||||
@ -1869,7 +1878,8 @@ uaudio_chan_ptransfer(struct chan *ch)
|
|||||||
size = ch->bytes_per_frame;
|
size = ch->bytes_per_frame;
|
||||||
residue += ch->fraction;
|
residue += ch->fraction;
|
||||||
if (residue >= USB_FRAMES_PER_SECOND) {
|
if (residue >= USB_FRAMES_PER_SECOND) {
|
||||||
size += ch->sample_size;
|
if (!ch->nofrac)
|
||||||
|
size += ch->sample_size;
|
||||||
residue -= USB_FRAMES_PER_SECOND;
|
residue -= USB_FRAMES_PER_SECOND;
|
||||||
}
|
}
|
||||||
cb->sizes[i] = size;
|
cb->sizes[i] = size;
|
||||||
@ -1972,7 +1982,8 @@ uaudio_chan_rtransfer(struct chan *ch)
|
|||||||
size = ch->bytes_per_frame;
|
size = ch->bytes_per_frame;
|
||||||
residue += ch->fraction;
|
residue += ch->fraction;
|
||||||
if (residue >= USB_FRAMES_PER_SECOND) {
|
if (residue >= USB_FRAMES_PER_SECOND) {
|
||||||
size += ch->sample_size;
|
if (!ch->nofrac)
|
||||||
|
size += ch->sample_size;
|
||||||
residue -= USB_FRAMES_PER_SECOND;
|
residue -= USB_FRAMES_PER_SECOND;
|
||||||
}
|
}
|
||||||
cb->sizes[i] = size;
|
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);
|
usbd_get_xfer_status(xfer, NULL, NULL, &count, NULL);
|
||||||
DPRINTFN(5,("uaudio_chan_rintr: count=%d, transferred=%d\n",
|
DPRINTFN(5,("uaudio_chan_rintr: count=%d, transferred=%d\n",
|
||||||
count, ch->transferred));
|
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
|
#ifdef DIAGNOSTIC
|
||||||
if (count != cb->size) {
|
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);
|
count, cb->size);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -2042,7 +2061,7 @@ uaudio_chan_rintr(usbd_xfer_handle xfer, usbd_private_handle priv,
|
|||||||
s = splaudio();
|
s = splaudio();
|
||||||
while (ch->transferred >= ch->blksize) {
|
while (ch->transferred >= ch->blksize) {
|
||||||
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));
|
||||||
ch->intr(ch->arg);
|
ch->intr(ch->arg);
|
||||||
}
|
}
|
||||||
|
@ -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 $ */
|
/* $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_PERACOM, USB_PRODUCT_PERACOM_SERIAL1, 0x101, { UQ_NO_STRINGS }},
|
||||||
{ USB_VENDOR_WACOM, USB_PRODUCT_WACOM_CT0405U, 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_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_ADA70, 0x103, { UQ_BAD_ADC }},
|
||||||
{ USB_VENDOR_ALTEC, USB_PRODUCT_ALTEC_ASC495, 0x000, { UQ_BAD_AUDIO }},
|
{ USB_VENDOR_ALTEC, USB_PRODUCT_ALTEC_ASC495, 0x000, { UQ_BAD_AUDIO }},
|
||||||
{ USB_VENDOR_QTRONIX, USB_PRODUCT_QTRONIX_980N, 0x110, { UQ_SPUR_BUT_UP }},
|
{ 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_TI, USB_PRODUCT_TI_UTUSB41, 0x110, { UQ_POWER_CLAIM }},
|
||||||
{ USB_VENDOR_ACERP, USB_PRODUCT_ACERP_ACERSCAN_320U,
|
{ USB_VENDOR_ACERP, USB_PRODUCT_ACERP_ACERSCAN_320U,
|
||||||
0x000, { UQ_NO_STRINGS }},
|
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 } }
|
{ 0, 0, 0, { 0 } }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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 $ */
|
/* $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_BUS_POWERED 0x0020 /* device is bus powered, despite claim */
|
||||||
#define UQ_BAD_AUDIO 0x0040 /* device claims audio class, but isn't */
|
#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_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_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;
|
extern struct usbd_quirks usbd_no_quirk;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user