37#include <sys/stdint.h>
38#include <sys/stddef.h>
41#include <sys/kernel.h>
43#include <sys/linker_set.h>
44#include <sys/module.h>
47#include <sys/condvar.h>
48#include <sys/sysctl.h>
50#include <sys/unistd.h>
51#include <sys/callout.h>
52#include <sys/malloc.h>
62#define USB_DEBUG_VAR g_audio_debug
99static SYSCTL_NODE(_hw_usb, OID_AUTO, g_audio, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
103static int g_audio_debug = 0;
106 &g_audio_debug, 0,
"Debug level");
116SYSCTL_INT(_hw_usb_g_audio, OID_AUTO, pattern_interval, CTLFLAG_RWTUN,
168 .flags = {.ext_buffer = 1,.pipe_bof = 1,.short_xfer_ok = 1,},
180 .flags = {.ext_buffer = 1,.pipe_bof = 1,.short_xfer_ok = 1,},
192 .flags = {.ext_buffer = 1,.pipe_bof = 1,},
204 .flags = {.ext_buffer = 1,.pipe_bof = 1,},
295 uint8_t iface_index[3];
301 mtx_init(&sc->
sc_mtx,
"g_audio", NULL, MTX_DEF);
388 const uint32_t prime = 0xFFFF1D;
400 if (temp & 0x800000) {
412 for (i = 0; i != samples; i++) {
439 DPRINTF(
"st=%d aframes=%d actlen=%d bytes\n",
498 DPRINTF(
"st=%d aframes=%d actlen=%d bytes\n",
543 const void *preq,
void **
pptr, uint16_t *
plen,
548 uint8_t is_complete = *
pstate;
552 (
req->bRequest == 0x82 )) {
562 (
req->bRequest == 0x83 )) {
572 (
req->bRequest == 0x84 )) {
582 (
req->bRequest == 0x81 )) {
592 (
req->bRequest == 0x01 )) {
601 (
req->bRequest == 0x01 )) {
static const struct usb_config g_audio_config[G_AUDIO_N_TRANSFER]
static device_detach_t g_audio_detach
static void g_audio_timeout(void *arg)
static void g_audio_make_samples(struct g_audio_softc *sc, int16_t *ptr, int samples)
static SYSCTL_NODE(_hw_usb, OID_AUTO, g_audio, CTLFLAG_RW|CTLFLAG_MPSAFE, 0, "USB audio gadget")
static driver_t g_audio_driver
static devclass_t g_audio_devclass
static usb_handle_request_t g_audio_handle_request
static usb_callback_t g_audio_isoc_read_callback
SYSCTL_STRING(_hw_usb_g_audio, OID_AUTO, pattern, CTLFLAG_RW, &g_audio_pattern_data, sizeof(g_audio_pattern_data), "Data pattern")
static void g_audio_timeout_reset(struct g_audio_softc *sc)
static int32_t g_noise(struct g_audio_softc *sc)
static device_method_t g_audio_methods[]
static int g_audio_throughput
static char g_audio_pattern_data[G_AUDIO_MAX_STRLEN]
static int g_audio_pattern_interval
static usb_callback_t g_audio_isoc_write_callback
DRIVER_MODULE(g_audio, uhub, g_audio_driver, g_audio_devclass, 0, 0)
static device_probe_t g_audio_probe
static device_attach_t g_audio_attach
MODULE_DEPEND(g_audio, usb, 1, 1, 1)
static void g_audio_watchdog(void *arg)
static void g_audio_watchdog_reset(struct g_audio_softc *sc)
SYSCTL_INT(_hw_usb_g_audio, OID_AUTO, mode, CTLFLAG_RWTUN, &g_audio_mode, 0, "Mode selection")
#define G_AUDIO_MODE_PATTERN
#define G_AUDIO_MAX_STRLEN
#define G_AUDIO_MODE_SILENT
#define G_AUDIO_MODE_LOOP
int8_t sc_pattern[G_AUDIO_MAX_STRLEN]
uint8_t sc_sample_rate[32]
uint8_t sc_volume_setting[32]
uint8_t sc_volume_limit[32]
struct usb_callout sc_callout
struct usb_callout sc_watchdog
int16_t sc_data_buf[2][G_AUDIO_BUFSIZE/2]
uint16_t sc_data_len[2][G_AUDIO_FRAMES]
struct usb_xfer * sc_xfer[G_AUDIO_N_TRANSFER]
enum usb_hc_mode usb_mode
struct usbd_lookup_info info
struct usb_device * device
uint8_t bInterfaceSubClass
#define UT_READ_CLASS_INTERFACE
#define UISUBCLASS_AUDIOCONTROL
#define UT_WRITE_CLASS_INTERFACE
#define UT_WRITE_CLASS_ENDPOINT
usb_error_t usbd_set_alt_interface_index(struct usb_device *udev, uint8_t iface_index, uint8_t alt_index)
void usbd_set_parent_iface(struct usb_device *udev, uint8_t iface_index, uint8_t parent_index)
const char * usbd_errstr(usb_error_t err)
static usb_error_t usb_handle_request(struct usb_xfer *)
void usbd_transfer_submit(struct usb_xfer *xfer)
void usbd_transfer_unsetup(struct usb_xfer **pxfer, uint16_t n_setup)
void usbd_xfer_set_frame_data(struct usb_xfer *xfer, usb_frcount_t frindex, void *ptr, usb_frlength_t len)
usb_frlength_t usbd_xfer_frame_len(struct usb_xfer *xfer, usb_frcount_t frindex)
usb_error_t usbd_transfer_setup(struct usb_device *udev, const uint8_t *ifaces, struct usb_xfer **ppxfer, const struct usb_config *setup_start, uint16_t n_setup, void *priv_sc, struct mtx *xfer_mtx)
void usbd_transfer_start(struct usb_xfer *xfer)
void * usbd_xfer_softc(struct usb_xfer *xfer)
void usbd_xfer_set_stall(struct usb_xfer *xfer)
void usbd_xfer_status(struct usb_xfer *xfer, int *actlen, int *sumlen, int *aframes, int *nframes)
void device_set_usb_desc(device_t dev)
#define usb_callout_init_mtx(c, m, f)
#define usb_callout_reset(c,...)
#define usb_callout_drain(c)
#define USB_ST_TRANSFERRED
#define USB_MS_TO_TICKS(ms)
void() usb_callback_t(struct usb_xfer *, usb_error_t)
#define usb_callout_stop(c)
#define USB_GET_STATE(xfer)