PERFORCE change 144445 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Tue Jul 1 21:44:55 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=144445
Change 144445 by hselasky at hselasky_laptop001 on 2008/07/01 21:44:42
New USB sound module is finished and tested.
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb2/core/usb2_core.h#8 edit
.. //depot/projects/usb/src/sys/dev/usb2/core/usb2_device.h#3 edit
.. //depot/projects/usb/src/sys/dev/usb2/include/usb2_defs.h#3 edit
.. //depot/projects/usb/src/sys/dev/usb2/sound/uaudio2.c#2 edit
.. //depot/projects/usb/src/sys/dev/usb2/sound/uaudio2_reg.h#2 edit
.. //depot/projects/usb/src/sys/dev/usb2/sound/usb2_sound.c#1 add
.. //depot/projects/usb/src/sys/dev/usb2/sound/usb2_sound.h#1 add
.. //depot/projects/usb/src/sys/modules/usb2/sound/Makefile#2 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_core.h#8 (text+ko) ====
@@ -391,7 +391,7 @@
struct usb2_interface_descriptor *usb2_get_interface_descriptor(struct usb2_interface *iface);
uint8_t usb2_clear_stall_callback(struct usb2_xfer *xfer1, struct usb2_xfer *xfer2);
uint8_t usb2_get_interface_altindex(struct usb2_interface *iface);
-uint8_t usb2_get_quirk(struct usb2_attach_arg *uaa, uint16_t quirk);
+usb2_error_t usb2_set_alt_interface_index(struct usb2_device *udev, uint8_t iface_index, uint8_t alt_index);
uint8_t usb2_get_speed(struct usb2_device *udev);
usb2_error_t usb2_transfer_setup(struct usb2_device *udev, const uint8_t *ifaces, struct usb2_xfer **pxfer, const struct usb2_config *setup_start, uint16_t n_setup, void *priv_sc, struct mtx *priv_mtx);
void usb2_set_frame_data(struct usb2_xfer *xfer, void *ptr, uint32_t frindex);
==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_device.h#3 (text+ko) ====
@@ -147,7 +147,6 @@
usb2_error_t usb2_interface_count(struct usb2_device *udev, uint8_t *count);
usb2_error_t usb2_probe_and_attach(struct usb2_device *udev, uint8_t iface_index);
usb2_error_t usb2_reset_iface_endpoints(struct usb2_device *udev, uint8_t iface_index);
-usb2_error_t usb2_set_alt_interface_index(struct usb2_device *udev, uint8_t iface_index, uint8_t alt_index);
usb2_error_t usb2_set_config_index(struct usb2_device *udev, uint8_t index);
usb2_error_t usb2_set_endpoint_stall(struct usb2_device *udev, struct usb2_pipe *pipe, uint8_t do_stall);
usb2_error_t usb2_suspend_resume(struct usb2_device *udev, uint8_t do_suspend);
==== //depot/projects/usb/src/sys/dev/usb2/include/usb2_defs.h#3 (text+ko) ====
@@ -32,7 +32,7 @@
#define USB_DEV_MAX 128 /* units */
#define USB_IFACE_MAX 32 /* units */
#define USB_EP_MAX (2*16) /* hardcoded */
-#define USB_FIFO_MAX (2 * USB_EP_MAX)
+#define USB_FIFO_MAX (4 * USB_EP_MAX)
#define USB_MAX_DEVICES USB_DEV_MAX /* including virtual root HUB and
* address zero */
==== //depot/projects/usb/src/sys/dev/usb2/sound/uaudio2.c#2 (text+ko) ====
@@ -52,18 +52,30 @@
* $NetBSD: uaudio.c,v 1.97 2005/02/24 08:19:38 martin Exp $
*/
-#include <sys/cdefs.h>
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/malloc.h>
+#include <dev/usb2/include/usb2_devid.h>
+#include <dev/usb2/include/usb2_standard.h>
+#include <dev/usb2/include/usb2_mfunc.h>
+#include <dev/usb2/include/usb2_error.h>
+#include <dev/usb2/include/usb2_revision.h>
+
+#define USB_DEBUG_VAR uaudio_debug
+
+#include <dev/usb2/core/usb2_core.h>
+#include <dev/usb2/core/usb2_lookup.h>
+#include <dev/usb2/core/usb2_debug.h>
+#include <dev/usb2/core/usb2_util.h>
+#include <dev/usb2/core/usb2_busdma.h>
+#include <dev/usb2/core/usb2_parse.h>
+#include <dev/usb2/core/usb2_request.h>
+#include <dev/usb2/core/usb2_mbuf.h>
+#include <dev/usb2/core/usb2_dev.h>
+#include <dev/usb2/core/usb2_dynamic.h>
+
+#include <dev/usb2/quirk/usb2_quirk.h>
+#include <dev/usb2/sound/uaudio2_reg.h>
+
#include <sys/reboot.h> /* for bootverbose */
-#include <dev/usb/usb_port.h>
-#include <dev/usb/usb.h>
-#include <dev/usb/usb_subr.h>
-#include <dev/usb/usb_quirks.h>
-
#include <dev/sound/pcm/sound.h>
#include <dev/sound/chip.h>
#include "feeder_if.h"
@@ -72,17 +84,11 @@
#include <dev/sound/usb/uaudio.h>
#ifdef USB_DEBUG
-#define DPRINTF(n,fmt,...) \
- do { if (uaudio_debug > (n)) { \
- printf("%s: " fmt, __FUNCTION__,## __VA_ARGS__); } } while (0)
-
static int uaudio_debug = 0;
-SYSCTL_NODE(_hw_usb, OID_AUTO, uaudio, CTLFLAG_RW, 0, "USB uaudio");
-SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, debug, CTLFLAG_RW,
+SYSCTL_NODE(_hw_usb2, OID_AUTO, uaudio, CTLFLAG_RW, 0, "USB uaudio");
+SYSCTL_INT(_hw_usb2_uaudio, OID_AUTO, debug, CTLFLAG_RW,
&uaudio_debug, 0, "uaudio debug level");
-#else
-#define DPRINTF(...) do { } while (0)
#endif
static uint32_t uaudio_default_rate = 96000;
@@ -94,8 +100,6 @@
#define UAUDIO_RECURSE_LIMIT 24 /* rounds */
#define UAUDIO_DEFAULT_BUFSZ (16*1024) /* bytes */
-
-
#define MAKE_WORD(h,l) (((h) << 8) | (l))
#define BIT_TEST(bm,bno) (((bm)[(bno) / 8] >> (7 - ((bno) % 8))) & 1)
@@ -135,16 +139,16 @@
struct pcmchan_caps pcm_cap; /* capabilities */
struct snd_dbuf *pcm_buf;
- const struct usbd_config *usb_cfg;
+ const struct usb2_config *usb2_cfg;
struct mtx *pcm_mtx; /* lock protecting this structure */
struct uaudio_softc *priv_sc;
struct pcm_channel *pcm_ch;
- struct usbd_xfer *xfer[UAUDIO_NCHANBUFS];
- const struct usb_audio_streaming_interface_descriptor *p_asid;
- const struct usb_audio_streaming_type1_descriptor *p_asf1d;
- const struct usb_audio_streaming_endpoint_descriptor *p_sed;
- const usb_endpoint_descriptor_audio_t *p_ed1;
- const usb_endpoint_descriptor_audio_t *p_ed2;
+ struct usb2_xfer *xfer[UAUDIO_NCHANBUFS];
+ const struct usb2_audio_streaming_interface_descriptor *p_asid;
+ const struct usb2_audio_streaming_type1_descriptor *p_asf1d;
+ const struct usb2_audio_streaming_endpoint_descriptor *p_sed;
+ const usb2_endpoint_descriptor_audio_t *p_ed1;
+ const usb2_endpoint_descriptor_audio_t *p_ed2;
const struct uaudio_format *p_fmt;
uint8_t *buf; /* pointer to buffer */
@@ -170,7 +174,7 @@
#define UMIDI_BULK_SIZE 1024 /* bytes */
struct umidi_sub_chan {
- struct usb_cdev cdev;
+ struct usb2_fifo_sc fifo;
uint8_t *temp_cmd;
uint8_t temp_0[4];
uint8_t temp_1[4];
@@ -193,7 +197,7 @@
struct umidi_sub_chan sub[UMIDI_CABLES_MAX];
struct mtx mtx;
- struct usbd_xfer *xfer[UMIDI_N_TRANSFER];
+ struct usb2_xfer *xfer[UMIDI_N_TRANSFER];
uint8_t iface_index;
uint8_t iface_alt_index;
@@ -217,8 +221,8 @@
struct uaudio_chan sc_play_chan;
struct umidi_chan sc_midi_chan;
- struct usbd_device *sc_udev;
- struct usbd_xfer *sc_mixer_xfer[1];
+ struct usb2_device *sc_udev;
+ struct usb2_xfer *sc_mixer_xfer[1];
struct mtx *sc_mixer_lock;
struct uaudio_mixer_node *sc_mixer_root;
struct uaudio_mixer_node *sc_mixer_curr;
@@ -226,7 +230,6 @@
uint32_t sc_buffer_size;
uint32_t sc_mix_info;
uint32_t sc_recsrc_info;
- uint32_t sc_quirks;
uint16_t sc_audio_rev;
uint16_t sc_mixer_count;
@@ -237,7 +240,10 @@
uint8_t sc_mixer_chan;
uint8_t sc_pcm_registered:1;
uint8_t sc_mixer_init:1;
- uint8_t sc_unused:6;
+ uint8_t sc_uq_audio_swap_lr:1;
+ uint8_t sc_uq_au_inp_async:1;
+ uint8_t sc_uq_au_no_xu:1;
+ uint8_t sc_uq_bad_adc:1;
};
struct uaudio_search_result {
@@ -250,14 +256,14 @@
struct uaudio_terminal_node {
union {
- const usb_descriptor_t *desc;
- const struct usb_audio_input_terminal *it;
- const struct usb_audio_output_terminal *ot;
- const struct usb_audio_mixer_unit_0 *mu;
- const struct usb_audio_selector_unit *su;
- const struct usb_audio_feature_unit *fu;
- const struct usb_audio_processing_unit_0 *pu;
- const struct usb_audio_extension_unit_0 *eu;
+ const struct usb2_descriptor *desc;
+ const struct usb2_audio_input_terminal *it;
+ const struct usb2_audio_output_terminal *ot;
+ const struct usb2_audio_mixer_unit_0 *mu;
+ const struct usb2_audio_selector_unit *su;
+ const struct usb2_audio_feature_unit *fu;
+ const struct usb2_audio_processing_unit_0 *pu;
+ const struct usb2_audio_extension_unit_0 *eu;
} u;
struct uaudio_search_result usr;
struct uaudio_terminal_node *root;
@@ -307,157 +313,74 @@
static device_attach_t uaudio_attach;
static device_detach_t uaudio_detach;
-static usbd_callback_t uaudio_chan_play_callback;
-static usbd_callback_t uaudio_chan_record_callback;
-static usbd_callback_t uaudio_mixer_write_cfg_callback;
-static usbd_callback_t umidi_read_clear_stall_callback;
-static usbd_callback_t umidi_bulk_read_callback;
-static usbd_callback_t umidi_write_clear_stall_callback;
-static usbd_callback_t umidi_bulk_write_callback;
+static usb2_callback_t uaudio_chan_play_callback;
+static usb2_callback_t uaudio_chan_record_callback;
+static usb2_callback_t uaudio_mixer_write_cfg_callback;
+static usb2_callback_t umidi_read_clear_stall_callback;
+static usb2_callback_t umidi_bulk_read_callback;
+static usb2_callback_t umidi_write_clear_stall_callback;
+static usb2_callback_t umidi_bulk_write_callback;
#ifdef USB_DEBUG
-static void
- uaudio_chan_dump_ep_desc(const usb_endpoint_descriptor_audio_t *ed);
+static void uaudio_chan_dump_ep_desc(const usb2_endpoint_descriptor_audio_t *ed);
#endif
-static void
-uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usbd_device *udev,
- uint32_t rate, uint16_t fps, uint8_t channels,
- uint8_t bit_resolution);
-
-static void
- uaudio_chan_fill_info(struct uaudio_softc *sc, struct usbd_device *udev);
-
-static void
-uaudio_mixer_add_ctl_sub(struct uaudio_softc *sc,
- struct uaudio_mixer_node *mc);
-static void
- uaudio_mixer_add_ctl(struct uaudio_softc *sc, struct uaudio_mixer_node *mc);
+static void uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usb2_device *udev, uint32_t rate, uint16_t fps, uint8_t channels, uint8_t bit_resolution);
+static void uaudio_chan_fill_info(struct uaudio_softc *sc, struct usb2_device *udev);
+static void uaudio_mixer_add_ctl_sub(struct uaudio_softc *sc, struct uaudio_mixer_node *mc);
+static void uaudio_mixer_add_ctl(struct uaudio_softc *sc, struct uaudio_mixer_node *mc);
+static void uaudio_mixer_add_input(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id);
+static void uaudio_mixer_add_output(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id);
+static void uaudio_mixer_add_mixer(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id);
+static void uaudio_mixer_add_selector(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id);
+static uint32_t uaudio_mixer_feature_get_bmaControls(const struct usb2_audio_feature_unit *d, uint8_t index);
+static void uaudio_mixer_add_feature(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id);
+static void uaudio_mixer_add_processing_updown(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id);
+static void uaudio_mixer_add_processing(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id);
+static void uaudio_mixer_add_extension(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id);
+static const void *uaudio_mixer_verify_desc(const void *arg, uint32_t len);
-static void
-uaudio_mixer_add_input(struct uaudio_softc *sc,
- const struct uaudio_terminal_node *iot, int id);
-static void
-uaudio_mixer_add_output(struct uaudio_softc *sc,
- const struct uaudio_terminal_node *iot, int id);
-static void
-uaudio_mixer_add_mixer(struct uaudio_softc *sc,
- const struct uaudio_terminal_node *iot, int id);
-static void
-uaudio_mixer_add_selector(struct uaudio_softc *sc,
- const struct uaudio_terminal_node *iot, int id);
-static uint32_t
-uaudio_mixer_feature_get_bmaControls(const struct usb_audio_feature_unit *d,
- uint8_t index);
-static void
-uaudio_mixer_add_feature(struct uaudio_softc *sc,
- const struct uaudio_terminal_node *iot, int id);
-static void
-uaudio_mixer_add_processing_updown(struct uaudio_softc *sc,
- const struct uaudio_terminal_node *iot,
- int id);
-static void
-uaudio_mixer_add_processing(struct uaudio_softc *sc,
- const struct uaudio_terminal_node *iot, int id);
-static void
-uaudio_mixer_add_extension(struct uaudio_softc *sc,
- const struct uaudio_terminal_node *iot, int id);
-static const void *
- uaudio_mixer_verify_desc(const void *arg, uint32_t len);
-
#ifdef USB_DEBUG
-static void
- uaudio_mixer_dump_cluster(uint8_t id, const struct uaudio_terminal_node *iot);
+static void uaudio_mixer_dump_cluster(uint8_t id, const struct uaudio_terminal_node *iot);
#endif
-static struct usb_audio_cluster
- uaudio_mixer_get_cluster(uint8_t id, const struct uaudio_terminal_node *iot);
+static struct usb2_audio_cluster uaudio_mixer_get_cluster(uint8_t id, const struct uaudio_terminal_node *iot);
#ifdef USB_DEBUG
-static const char *
- uaudio_mixer_get_terminal_name(uint16_t terminal_type);
+static const char *uaudio_mixer_get_terminal_name(uint16_t terminal_type);
#endif
-static uint16_t
-uaudio_mixer_determine_class(const struct uaudio_terminal_node *iot,
- struct uaudio_mixer_node *mix);
-static uint16_t
-uaudio_mixer_feature_name(const struct uaudio_terminal_node *iot,
- struct uaudio_mixer_node *mix);
+static uint16_t uaudio_mixer_determine_class(const struct uaudio_terminal_node *iot, struct uaudio_mixer_node *mix);
+static uint16_t uaudio_mixer_feature_name(const struct uaudio_terminal_node *iot, struct uaudio_mixer_node *mix);
+static const struct uaudio_terminal_node *uaudio_mixer_get_input(const struct uaudio_terminal_node *iot, uint8_t index);
+static const struct uaudio_terminal_node *uaudio_mixer_get_output(const struct uaudio_terminal_node *iot, uint8_t index);
+static void uaudio_mixer_find_inputs_sub(struct uaudio_terminal_node *root, const uint8_t *p_id, uint8_t n_id, struct uaudio_search_result *info);
+static void uaudio_mixer_find_outputs_sub(struct uaudio_terminal_node *root, uint8_t id, uint8_t n_id, struct uaudio_search_result *info);
+static void uaudio_mixer_fill_info(struct uaudio_softc *sc, struct usb2_device *udev, void *desc);
+static uint16_t uaudio_mixer_get(struct usb2_device *udev, uint8_t what, struct uaudio_mixer_node *mc);
+static usb2_error_t uaudio_set_speed(struct usb2_device *udev, uint8_t endpt, uint32_t speed);
+static int uaudio_mixer_signext(uint8_t type, int val);
+static int uaudio_mixer_bsd2value(struct uaudio_mixer_node *mc, int32_t val);
-static const struct uaudio_terminal_node *
- uaudio_mixer_get_input(const struct uaudio_terminal_node *iot, uint8_t index);
+static void uaudio_mixer_ctl_set(struct uaudio_softc *sc, struct uaudio_mixer_node *mc, uint8_t chan, int32_t val);
+static void uaudio_mixer_init(struct uaudio_softc *sc);
+static uint8_t umidi_convert_to_usb(struct umidi_sub_chan *sub, uint8_t cn, uint8_t b);
+static struct umidi_sub_chan *umidi_sub_by_fifo(struct usb2_fifo *fifo);
+static void umidi_start_read(struct usb2_fifo *fifo);
+static void umidi_stop_read(struct usb2_fifo *fifo);
+static void umidi_start_write(struct usb2_fifo *fifo);
+static void umidi_stop_write(struct usb2_fifo *fifo);
+static int umidi_open(struct usb2_fifo *fifo, int fflags, struct thread *td);
+static int umidi_ioctl(struct usb2_fifo *fifo, u_long cmd, void *data, int fflags, struct thread *td);
+static void umidi_close(struct usb2_fifo *fifo, int fflags, struct thread *td);
+static void umidi_init(device_t dev);
+static int32_t umidi_probe(device_t dev);
+static int32_t umidi_detach(device_t dev);
-static const struct uaudio_terminal_node *
-uaudio_mixer_get_output(const struct uaudio_terminal_node *iot,
- uint8_t index);
-static void
-uaudio_mixer_find_inputs_sub(struct uaudio_terminal_node *root,
- const uint8_t *p_id, uint8_t n_id,
- struct uaudio_search_result *info);
-static void
-uaudio_mixer_find_outputs_sub(struct uaudio_terminal_node *root, uint8_t id,
- uint8_t n_id,
- struct uaudio_search_result *info);
-static void
-uaudio_mixer_fill_info(struct uaudio_softc *sc, struct usbd_device *udev,
- void *desc);
-static uint16_t
-uaudio_mixer_get(struct usbd_device *udev, uint8_t what,
- struct uaudio_mixer_node *mc);
-static usbd_status_t
- uaudio_set_speed(struct usbd_device *udev, uint8_t endpt, uint32_t speed);
-
-static int
- uaudio_mixer_signext(uint8_t type, int val);
-
-static int
- uaudio_mixer_bsd2value(struct uaudio_mixer_node *mc, int32_t val);
-
-static void
-uaudio_mixer_ctl_set(struct uaudio_softc *sc, struct uaudio_mixer_node *mc,
- uint8_t chan, int32_t val);
-static void
- uaudio_mixer_init(struct uaudio_softc *sc);
-
-static uint8_t
- umidi_convert_to_usb(struct umidi_sub_chan *sub, uint8_t cn, uint8_t b);
-
-static struct umidi_sub_chan *
- umidi_sub_by_cdev(struct usb_cdev *cdev);
-
-static void
- umidi_start_read(struct usb_cdev *cdev);
-
-static void
- umidi_stop_read(struct usb_cdev *cdev);
-
-static void
- umidi_start_write(struct usb_cdev *cdev);
-
-static void
- umidi_stop_write(struct usb_cdev *cdev);
-
-static int32_t
-umidi_open(struct usb_cdev *cdev, int32_t fflags,
- int32_t devtype, struct thread *td);
-
-static int32_t
-umidi_ioctl(struct usb_cdev *cdev, u_long cmd, caddr_t data,
- int32_t fflags, struct thread *td);
-static void
- umidi_init(device_t dev);
-
-static int32_t
- umidi_probe(device_t dev);
-
-static int32_t
- umidi_detach(device_t dev);
-
-static const struct usbd_config
+static const struct usb2_config
uaudio_cfg_record_full_speed[UAUDIO_NCHANBUFS] = {
[0] = {
.type = UE_ISOCHRONOUS,
@@ -480,7 +403,7 @@
},
};
-static const struct usbd_config
+static const struct usb2_config
uaudio_cfg_record_high_speed[UAUDIO_NCHANBUFS] = {
[0] = {
.type = UE_ISOCHRONOUS,
@@ -503,7 +426,7 @@
},
};
-static const struct usbd_config
+static const struct usb2_config
uaudio_cfg_play_full_speed[UAUDIO_NCHANBUFS] = {
[0] = {
.type = UE_ISOCHRONOUS,
@@ -526,7 +449,7 @@
},
};
-static const struct usbd_config
+static const struct usb2_config
uaudio_cfg_play_high_speed[UAUDIO_NCHANBUFS] = {
[0] = {
.type = UE_ISOCHRONOUS,
@@ -549,13 +472,13 @@
},
};
-static const struct usbd_config
+static const struct usb2_config
uaudio_mixer_config[1] = {
[0] = {
.type = UE_CONTROL,
.endpoint = 0x00, /* Control pipe */
.direction = UE_DIR_ANY,
- .mh.bufsize = (sizeof(usb_device_request_t) + 4),
+ .mh.bufsize = (sizeof(struct usb2_device_request) + 4),
.mh.callback = &uaudio_mixer_write_cfg_callback,
.mh.timeout = 1000, /* 1 second */
},
@@ -581,7 +504,7 @@
[0xF] = 1, /* bytes */
};
-static const struct usbd_config
+static const struct usb2_config
umidi_config[UMIDI_N_TRANSFER] = {
[0] = {
.type = UE_BULK,
@@ -605,7 +528,7 @@
.type = UE_CONTROL,
.endpoint = 0x00, /* Control pipe */
.direction = UE_DIR_ANY,
- .mh.bufsize = sizeof(usb_device_request_t),
+ .mh.bufsize = sizeof(struct usb2_device_request),
.mh.flags = {},
.mh.callback = &umidi_write_clear_stall_callback,
.mh.timeout = 1000, /* 1 second */
@@ -616,7 +539,7 @@
.type = UE_CONTROL,
.endpoint = 0x00, /* Control pipe */
.direction = UE_DIR_ANY,
- .mh.bufsize = sizeof(usb_device_request_t),
+ .mh.bufsize = sizeof(struct usb2_device_request),
.mh.flags = {},
.mh.callback = &umidi_read_clear_stall_callback,
.mh.timeout = 1000, /* 1 second */
@@ -646,34 +569,29 @@
static int
uaudio_probe(device_t dev)
{
- struct usb_attach_arg *uaa = device_get_ivars(dev);
- usb_interface_descriptor_t *id;
+ struct usb2_attach_arg *uaa = device_get_ivars(dev);
- if (uaa->usb_mode != USB_MODE_HOST) {
- return (UMATCH_NONE);
- }
- if (uaa->iface == NULL) {
- return (UMATCH_NONE);
+ if (uaa->usb2_mode != USB_MODE_HOST) {
+ return (ENXIO);
}
- id = usbd_get_interface_descriptor(uaa->iface);
-
/* trigger on the control interface */
- if ((id == NULL) ||
- (id->bInterfaceClass != UICLASS_AUDIO) ||
- (id->bInterfaceSubClass != UISUBCLASS_AUDIOCONTROL) ||
- (usbd_get_quirks(uaa->device)->uq_flags & UQ_BAD_AUDIO)) {
- return (UMATCH_NONE);
+ if ((uaa->info.bInterfaceClass == UICLASS_AUDIO) &&
+ (uaa->info.bInterfaceSubClass == UISUBCLASS_AUDIOCONTROL)) {
+ if (usb2_test_quirk(uaa, UQ_BAD_AUDIO))
+ return (ENXIO);
+ else
+ return (0);
}
- return (UMATCH_IFACECLASS_IFACESUBCLASS);
+ return (ENXIO);
}
static int
uaudio_attach(device_t dev)
{
- struct usb_attach_arg *uaa = device_get_ivars(dev);
+ struct usb2_attach_arg *uaa = device_get_ivars(dev);
struct uaudio_softc *sc = device_get_softc(dev);
- usb_interface_descriptor_t *id;
+ struct usb2_interface_descriptor *id;
device_t child;
if (sc == NULL) {
@@ -682,20 +600,31 @@
sc->sc_play_chan.priv_sc = sc;
sc->sc_rec_chan.priv_sc = sc;
sc->sc_udev = uaa->device;
- sc->sc_quirks = usbd_get_quirks(uaa->device)->uq_flags;
+
+ if (usb2_test_quirk(uaa, UQ_AUDIO_SWAP_LR))
+ sc->sc_uq_audio_swap_lr = 1;
+
+ if (usb2_test_quirk(uaa, UQ_AU_INP_ASYNC))
+ sc->sc_uq_au_inp_async = 1;
+
+ if (usb2_test_quirk(uaa, UQ_AU_NO_XU))
+ sc->sc_uq_au_no_xu = 1;
+
+ if (usb2_test_quirk(uaa, UQ_BAD_ADC))
+ sc->sc_uq_bad_adc = 1;
umidi_init(dev);
- usbd_set_device_desc(dev);
+ device_set_usb2_desc(dev);
- id = usbd_get_interface_descriptor(uaa->iface);
+ id = usb2_get_interface_descriptor(uaa->iface);
uaudio_chan_fill_info(sc, uaa->device);
uaudio_mixer_fill_info(sc, uaa->device, id);
- sc->sc_mixer_iface_index = uaa->iface_index;
- sc->sc_mixer_iface_no = id->bInterfaceNumber;
+ sc->sc_mixer_iface_index = uaa->info.bIfaceIndex;
+ sc->sc_mixer_iface_no = uaa->info.bIfaceNum;
DPRINTF(0, "audio rev %d.%02x\n",
sc->sc_audio_rev >> 8,
@@ -782,7 +711,7 @@
}
uaudio_mixer_init(sc);
- if (sc->sc_quirks & UQ_AUDIO_SWAP_LR) {
+ if (sc->sc_uq_audio_swap_lr) {
DPRINTF(0, "hardware has swapped left and right\n");
uaudio_pcm_setflags(dev, SD_F_PSWAPLR);
}
@@ -868,7 +797,7 @@
#ifdef USB_DEBUG
static void
-uaudio_chan_dump_ep_desc(const usb_endpoint_descriptor_audio_t *ed)
+uaudio_chan_dump_ep_desc(const usb2_endpoint_descriptor_audio_t *ed)
{
if (ed) {
DPRINTF(0, "endpoint=%p bLength=%d bDescriptorType=%d \n"
@@ -886,18 +815,18 @@
#endif
static void
-uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usbd_device *udev,
+uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usb2_device *udev,
uint32_t rate, uint16_t fps, uint8_t channels,
uint8_t bit_resolution)
{
- usb_descriptor_t *desc = NULL;
- const struct usb_audio_streaming_interface_descriptor *asid = NULL;
- const struct usb_audio_streaming_type1_descriptor *asf1d = NULL;
- const struct usb_audio_streaming_endpoint_descriptor *sed = NULL;
- const usb_endpoint_descriptor_audio_t *ed1 = NULL;
- const usb_endpoint_descriptor_audio_t *ed2 = NULL;
- usb_config_descriptor_t *cd = usbd_get_config_descriptor(udev);
- usb_interface_descriptor_t *id;
+ struct usb2_descriptor *desc = NULL;
+ const struct usb2_audio_streaming_interface_descriptor *asid = NULL;
+ const struct usb2_audio_streaming_type1_descriptor *asf1d = NULL;
+ const struct usb2_audio_streaming_endpoint_descriptor *sed = NULL;
+ const usb2_endpoint_descriptor_audio_t *ed1 = NULL;
+ const usb2_endpoint_descriptor_audio_t *ed2 = NULL;
+ struct usb2_config_descriptor *cd = usb2_get_config_descriptor(udev);
+ struct usb2_interface_descriptor *id;
const struct uaudio_format *p_fmt;
struct uaudio_chan *chan;
uint16_t curidx = 0xFFFF;
@@ -913,7 +842,7 @@
uint8_t audio_if = 0;
uint8_t sample_size;
- while ((desc = usbd_desc_foreach(cd, desc))) {
+ while ((desc = usb2_desc_foreach(cd, desc))) {
if ((desc->bDescriptorType == UDESC_INTERFACE) &&
(desc->bLength >= sizeof(*id))) {
@@ -945,7 +874,7 @@
*/
if ((sc->sc_midi_chan.valid == 0) &&
- usbd_get_iface(udev, curidx)) {
+ usb2_get_iface(udev, curidx)) {
sc->sc_midi_chan.iface_index = curidx;
sc->sc_midi_chan.iface_alt_index = alt_index;
sc->sc_midi_chan.valid = 1;
@@ -1028,7 +957,7 @@
ep_type = UE_GET_ISO_TYPE(ed1->bmAttributes);
ep_sync = 0;
- if ((sc->sc_quirks & UQ_AU_INP_ASYNC) &&
+ if ((sc->sc_uq_au_inp_async) &&
(ep_dir == UE_DIR_IN) && (ep_type == UE_ISO_ADAPT)) {
ep_type = UE_ISO_ASYNC;
}
@@ -1105,7 +1034,7 @@
&(sc->sc_rec_chan) :
&(sc->sc_play_chan);
- if ((chan->valid == 0) && usbd_get_iface(udev, curidx)) {
+ if ((chan->valid == 0) && usb2_get_iface(udev, curidx)) {
chan->valid = 1;
#ifdef USB_DEBUG
@@ -1133,7 +1062,7 @@
chan->iface_index = curidx;
chan->iface_alt_index = alt_index;
- chan->usb_cfg =
+ chan->usb2_cfg =
(ep_dir == UE_DIR_IN) ?
((fps == 1000) ?
uaudio_cfg_record_full_speed :
@@ -1167,11 +1096,11 @@
}
static void
-uaudio_chan_fill_info(struct uaudio_softc *sc, struct usbd_device *udev)
+uaudio_chan_fill_info(struct uaudio_softc *sc, struct usb2_device *udev)
{
uint32_t rate = uaudio_default_rate;
uint32_t z;
- uint16_t fps = (usbd_get_speed(udev) == USB_SPEED_HIGH) ? 8000 : 1000;
+ uint16_t fps = (usb2_get_speed(udev) == USB_SPEED_HIGH) ? 8000 : 1000;
uint8_t bits = uaudio_default_bits;
uint8_t y;
uint8_t channels = uaudio_default_channels;
@@ -1206,7 +1135,7 @@
}
static void
-uaudio_chan_play_callback(struct usbd_xfer *xfer)
+uaudio_chan_play_callback(struct usb2_xfer *xfer)
{
struct uaudio_chan *ch = xfer->priv_sc;
uint32_t *p_len = xfer->frlengths;
@@ -1214,8 +1143,8 @@
uint32_t total = (ch->bytes_per_frame * xfer->nframes);
uint32_t offset;
- switch (USBD_GET_STATE(xfer)) {
- case USBD_ST_TRANSFERRED:
+ switch (USB_GET_STATE(xfer)) {
+ case USB_ST_TRANSFERRED:
tr_transferred:
if (xfer->actlen < xfer->sumlen) {
DPRINTF(0, "short transfer, "
@@ -1223,7 +1152,7 @@
}
chn_intr(ch->pcm_ch);
- case USBD_ST_SETUP:
+ case USB_ST_SETUP:
if (ch->bytes_per_frame > xfer->max_frame_size) {
DPRINTF(0, "bytes per transfer, %d, "
"exceeds maximum, %d!\n",
@@ -1249,7 +1178,7 @@
if (n > total) {
n = total;
}
- usbd_copy_in(xfer->frbuffers, offset, ch->cur, n);
+ usb2_copy_in(xfer->frbuffers, offset, ch->cur, n);
total -= n;
ch->cur += n;
@@ -1260,11 +1189,11 @@
}
}
- usbd_start_hardware(xfer);
+ usb2_start_hardware(xfer);
return;
default: /* Error */
- if (xfer->error == USBD_ERR_CANCELLED) {
+ if (xfer->error == USB_ERR_CANCELLED) {
return;
}
goto tr_transferred;
@@ -1272,7 +1201,7 @@
}
static void
-uaudio_chan_record_callback(struct usbd_xfer *xfer)
+uaudio_chan_record_callback(struct usb2_xfer *xfer)
{
struct uaudio_chan *ch = xfer->priv_sc;
uint32_t *p_len = xfer->frlengths;
@@ -1282,8 +1211,8 @@
uint32_t offset0;
uint32_t offset1;
- switch (USBD_GET_STATE(xfer)) {
- case USBD_ST_TRANSFERRED:
+ switch (USB_GET_STATE(xfer)) {
+ case USB_ST_TRANSFERRED:
tr_transferred:
if (xfer->actlen < total) {
DPRINTF(0, "short transfer, "
@@ -1305,7 +1234,7 @@
if (m > p_len[n]) {
m = p_len[n];
}
- usbd_copy_out(xfer->frbuffers, offset1, ch->cur, m);
+ usb2_copy_out(xfer->frbuffers, offset1, ch->cur, m);
p_len[n] -= m;
offset1 += m;
@@ -1321,7 +1250,7 @@
chn_intr(ch->pcm_ch);
- case USBD_ST_SETUP:
+ case USB_ST_SETUP:
if (ch->bytes_per_frame > xfer->max_frame_size) {
DPRINTF(0, "bytes per transfer, %d, "
"exceeds maximum, %d!\n",
@@ -1337,11 +1266,11 @@
DPRINTF(0, "no buffer!\n");
return;
}
- usbd_start_hardware(xfer);
+ usb2_start_hardware(xfer);
return;
default: /* Error */
- if (xfer->error == USBD_ERR_CANCELLED) {
+ if (xfer->error == USB_ERR_CANCELLED) {
return;
}
goto tr_transferred;
@@ -1357,7 +1286,7 @@
uint8_t endpoint;
uint8_t iface_index;
uint8_t alt_index;
- usbd_status_t err;
+ usb2_error_t err;
ch->buf = malloc(sc->sc_buffer_size, M_DEVBUF, M_WAITOK | M_ZERO);
@@ -1405,13 +1334,13 @@
DPRINTF(0, "endpoint=0x%02x, speed=%d, iface=%d alt=%d\n",
endpoint, ch->sample_rate, iface_index, alt_index);
- err = usbd_set_alt_interface_index(sc->sc_udev, iface_index, alt_index);
+ err = usb2_set_alt_interface_index(sc->sc_udev, iface_index, alt_index);
if (err) {
DPRINTF(0, "setting of alternate index failed: %s!\n",
- usbd_errstr(err));
+ usb2_errstr(err));
goto error;
}
- USBD_SET_IFACE_NO_PROBE(sc->sc_udev, iface_index);
+ usb2_set_parent_iface(sc->sc_udev, iface_index, sc->sc_mixer_iface_index);
/*
* If just one sampling rate is supported,
@@ -1427,8 +1356,8 @@
DPRINTF(0, "setting of sample rate failed! (continuing anyway)\n");
}
}
- if (usbd_transfer_setup(sc->sc_udev, &iface_index, ch->xfer,
- ch->usb_cfg, UAUDIO_NCHANBUFS, ch, ch->pcm_mtx)) {
+ if (usb2_transfer_setup(sc->sc_udev, &iface_index, ch->xfer,
+ ch->usb2_cfg, UAUDIO_NCHANBUFS, ch, ch->pcm_mtx)) {
DPRINTF(0, "could not allocate USB transfers!\n");
goto error;
}
@@ -1446,7 +1375,7 @@
free(ch->buf, M_DEVBUF);
ch->buf = NULL;
}
- usbd_transfer_unsetup(ch->xfer, UAUDIO_NCHANBUFS);
+ usb2_transfer_unsetup(ch->xfer, UAUDIO_NCHANBUFS);
ch->valid = 0;
@@ -1533,10 +1462,10 @@
#error "please update code"
#endif
if (ch->xfer[0]) {
- usbd_transfer_start(ch->xfer[0]);
+ usb2_transfer_start(ch->xfer[0]);
}
if (ch->xfer[1]) {
- usbd_transfer_start(ch->xfer[1]);
+ usb2_transfer_start(ch->xfer[1]);
}
return (0);
}
@@ -1547,8 +1476,8 @@
#if (UAUDIO_NCHANBUFS != 2)
#error "please update code"
#endif
- usbd_transfer_stop(ch->xfer[0]);
- usbd_transfer_stop(ch->xfer[1]);
+ usb2_transfer_stop(ch->xfer[0]);
+ usb2_transfer_stop(ch->xfer[1]);
return (0);
}
@@ -1639,7 +1568,7 @@
const struct uaudio_terminal_node *iot, int id)
{
#ifdef USB_DEBUG
- const struct usb_audio_input_terminal *d = iot[id].u.it;
+ const struct usb2_audio_input_terminal *d = iot[id].u.it;
DPRINTF(2, "bTerminalId=%d wTerminalType=0x%04x "
"bAssocTerminal=%d bNrChannels=%d wChannelConfig=%d "
@@ -1656,7 +1585,7 @@
const struct uaudio_terminal_node *iot, int id)
{
#ifdef USB_DEBUG
- const struct usb_audio_output_terminal *d = iot[id].u.ot;
+ const struct usb2_audio_output_terminal *d = iot[id].u.ot;
DPRINTF(2, "bTerminalId=%d wTerminalType=0x%04x "
"bAssocTerminal=%d bSourceId=%d iTerminal=%d\n",
@@ -1672,8 +1601,8 @@
{
struct uaudio_mixer_node mix;
- const struct usb_audio_mixer_unit_0 *d0 = iot[id].u.mu;
- const struct usb_audio_mixer_unit_1 *d1;
+ const struct usb2_audio_mixer_unit_0 *d0 = iot[id].u.mu;
+ const struct usb2_audio_mixer_unit_1 *d1;
uint32_t bno; /* bit number */
uint32_t p; /* bit number accumulator */
@@ -1756,7 +1685,7 @@
uaudio_mixer_add_selector(struct uaudio_softc *sc,
const struct uaudio_terminal_node *iot, int id)
{
- const struct usb_audio_selector_unit *d = iot[id].u.su;
+ const struct usb2_audio_selector_unit *d = iot[id].u.su;
struct uaudio_mixer_node mix;
struct uaudio_mixer_node dummy;
uint16_t i;
@@ -1797,7 +1726,7 @@
}
static uint32_t
-uaudio_mixer_feature_get_bmaControls(const struct usb_audio_feature_unit *d,
+uaudio_mixer_feature_get_bmaControls(const struct usb2_audio_feature_unit *d,
uint8_t index)
{
uint32_t temp = 0;
@@ -1822,7 +1751,7 @@
uaudio_mixer_add_feature(struct uaudio_softc *sc,
const struct uaudio_terminal_node *iot, int id)
{
- const struct usb_audio_feature_unit *d = iot[id].u.fu;
+ const struct usb2_audio_feature_unit *d = iot[id].u.fu;
struct uaudio_mixer_node mix;
uint32_t fumask;
uint32_t mmask;
@@ -1949,10 +1878,10 @@
uaudio_mixer_add_processing_updown(struct uaudio_softc *sc,
const struct uaudio_terminal_node *iot, int id)
{
- const struct usb_audio_processing_unit_0 *d0 = iot[id].u.pu;
- const struct usb_audio_processing_unit_1 *d1 =
+ const struct usb2_audio_processing_unit_0 *d0 = iot[id].u.pu;
+ const struct usb2_audio_processing_unit_1 *d1 =
(const void *)(d0->baSourceId + d0->bNrInPins);
- const struct usb_audio_processing_unit_updown *ud =
+ const struct usb2_audio_processing_unit_updown *ud =
(const void *)(d1->bmControls + d1->bControlSize);
struct uaudio_mixer_node mix;
uint8_t i;
@@ -1992,8 +1921,8 @@
uaudio_mixer_add_processing(struct uaudio_softc *sc,
const struct uaudio_terminal_node *iot, int id)
{
- const struct usb_audio_processing_unit_0 *d0 = iot[id].u.pu;
- const struct usb_audio_processing_unit_1 *d1 =
+ const struct usb2_audio_processing_unit_0 *d0 = iot[id].u.pu;
+ const struct usb2_audio_processing_unit_1 *d1 =
(const void *)(d0->baSourceId + d0->bNrInPins);
struct uaudio_mixer_node mix;
uint16_t ptype;
@@ -2038,15 +1967,15 @@
uaudio_mixer_add_extension(struct uaudio_softc *sc,
const struct uaudio_terminal_node *iot, int id)
{
- const struct usb_audio_extension_unit_0 *d0 = iot[id].u.eu;
- const struct usb_audio_extension_unit_1 *d1 =
+ const struct usb2_audio_extension_unit_0 *d0 = iot[id].u.eu;
+ const struct usb2_audio_extension_unit_1 *d1 =
(const void *)(d0->baSourceId + d0->bNrInPins);
struct uaudio_mixer_node mix;
DPRINTF(2, "bUnitId=%d bNrInPins=%d\n",
d0->bUnitId, d0->bNrInPins);
- if (sc->sc_quirks & UQ_AU_NO_XU) {
+ if (sc->sc_uq_au_no_xu) {
return;
}
if (d1->bControlSize == 0) {
@@ -2070,19 +1999,19 @@
static const void *
uaudio_mixer_verify_desc(const void *arg, uint32_t len)
{
- const struct usb_audio_mixer_unit_1 *d1;
- const struct usb_audio_extension_unit_1 *e1;
- const struct usb_audio_processing_unit_1 *u1;
+ const struct usb2_audio_mixer_unit_1 *d1;
+ const struct usb2_audio_extension_unit_1 *e1;
+ const struct usb2_audio_processing_unit_1 *u1;
union {
- const usb_descriptor_t *desc;
- const struct usb_audio_input_terminal *it;
- const struct usb_audio_output_terminal *ot;
- const struct usb_audio_mixer_unit_0 *mu;
- const struct usb_audio_selector_unit *su;
- const struct usb_audio_feature_unit *fu;
- const struct usb_audio_processing_unit_0 *pu;
- const struct usb_audio_extension_unit_0 *eu;
+ const struct usb2_descriptor *desc;
+ const struct usb2_audio_input_terminal *it;
+ const struct usb2_audio_output_terminal *ot;
+ const struct usb2_audio_mixer_unit_0 *mu;
+ const struct usb2_audio_selector_unit *su;
+ const struct usb2_audio_feature_unit *fu;
+ const struct usb2_audio_processing_unit_0 *pu;
+ const struct usb2_audio_extension_unit_0 *eu;
} u;
u.desc = arg;
@@ -2206,7 +2135,7 @@
};
uint16_t cc;
uint8_t i;
- const struct usb_audio_cluster cl = uaudio_mixer_get_cluster(id, iot);
+ const struct usb2_audio_cluster cl = uaudio_mixer_get_cluster(id, iot);
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list