40#ifdef USB_GLOBAL_INCLUDE_FILE
41#include USB_GLOBAL_INCLUDE_FILE
43#include <sys/stdint.h>
44#include <sys/stddef.h>
49#include <sys/kernel.h>
51#include <sys/module.h>
54#include <sys/condvar.h>
55#include <sys/sysctl.h>
57#include <sys/unistd.h>
58#include <sys/callout.h>
59#include <sys/malloc.h>
65#define USB_DEBUG_VAR musbotgdebug
82#define MUSBOTG_INTR_ENDPT 1
84#define MUSBOTG_BUS2SC(bus) \
85 __containerof(bus, struct musbotg_softc, sc_bus)
87#define MUSBOTG_PC2SC(pc) \
88 MUSBOTG_BUS2SC(USB_DMATAG_TO_XROOT((pc)->tag_parent)->bus)
91static int musbotgdebug = 0;
93static SYSCTL_NODE(_hw_usb, OID_AUTO, musbotg, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
96 &musbotgdebug, 0,
"Debug level");
145 .max_out_frame_size = 64,
147 .support_control = 1,
154 .ep_fifosz_shift = 12,
159 .ep_fifosz_shift = 10,
164 .ep_fifosz_shift = 7,
197 for (ch = sc->
sc_ep_max; ch != 0; ch--) {
216 DPRINTFN(-1,
"No available channels. Mask: %04x\n", sc->
sc_channel_mask);
225 DPRINTFN(1,
"ep_no=%d\n", td->
channel);
300 temp &= ~MUSB2_MASK_SOFTC;
353 temp &= ~MUSB2_MASK_SUSPMODE;
362 temp &= ~MUSB2_MASK_RESUME;
386 temp &= ~MUSB2_MASK_RESUME;
393 DPRINTFN(4,
"addr=%d\n",
addr);
416 DPRINTFN(1,
"ep_no=%d\n", td->
channel);
424 DPRINTFN(4,
"csr=0x%02x\n", csr);
434 DPRINTFN(1,
"CSR0 DATAEND\n");
456 DPRINTFN(1,
"EP0 BUSY\n");
467 DPRINTFN(1,
"Invalid SETUP packet "
468 "length, %d bytes\n",
count);
476 DPRINTFN(1,
"Unsupported SETUP packet "
477 "length, %d bytes\n",
count);
517 DPRINTFN(4,
"stalling\n");
542 DPRINTFN(1,
"ep_no=%d\n", td->
channel);
549 DPRINTFN(4,
"csr=0x%02x\n", csr);
561 DPRINTFN(1,
"error bit set, csr=0x%02x\n", csr);
566 DPRINTFN(1,
"NAK timeout\n");
581 csr &= ~MUSB2_MASK_CSR0L_NAKTIMO;
656 DPRINTFN(4,
"csr=0x%02x\n", csr);
667 DPRINTFN(4,
"faking complete\n");
684 if (count < td->max_frame_size) {
735 if (buf_res.
length >= 4) {
741 temp = buf_res.
length & ~3;
796 DPRINTFN(4,
"csr=0x%02x\n", csr);
851 if (buf_res.
length >= 4) {
857 temp = buf_res.
length & ~3;
909 DPRINTFN(1,
"ep_no=%d\n", td->
channel);
917 DPRINTFN(4,
"csr=0x%02x\n", csr);
938 csr &= ~MUSB2_MASK_CSR0L_REQPKT;
941 csr &= ~MUSB2_MASK_CSR0L_NAKTIMO;
953 DPRINTFN(1,
"error bit set, csr=0x%02x\n", csr);
970 if (count < td->max_frame_size) {
1023 if (buf_res.
length >= 4) {
1029 temp = buf_res.
length & ~3;
1047 csr &= ~MUSB2_MASK_CSR0L_RXPKTRDY;
1051 if ((td->
remainder == 0) || got_short) {
1086 DPRINTFN(1,
"ep_no=%d\n", td->
channel);
1093 DPRINTFN(4,
"csr=0x%02x\n", csr);
1116 csr &= ~MUSB2_MASK_CSR0L_NAKTIMO;
1197 if (buf_res.
length >= 4) {
1203 temp = buf_res.
length & ~3;
1261 DPRINTFN(4,
"csr=0x%02x\n", csr);
1292 DPRINTFN(1,
"ep_no=%d\n", td->
channel);
1325 DPRINTFN(4,
"IN STATUS csr=0x%02x\n", csr);
1339 csr &= ~MUSB2_MASK_CSR0L_NAKTIMO;
1350 DPRINTFN(1,
"error bit set, csr=0x%02x\n", csr);
1385 DPRINTFN(4,
"csr=0x%02x\n", csr);
1397 DPRINTFN(1,
"error bit set, csr=0x%02x\n", csr);
1458 DPRINTFN(4,
"csr=0x%02x\n", csr);
1474 DPRINTFN(4,
"count=0x%04x\n",
count);
1480 if (count < td->max_frame_size) {
1533 if (buf_res.
length >= 4) {
1539 temp = buf_res.
length & ~3;
1562 if ((td->
remainder == 0) || got_short) {
1605 DPRINTFN(4,
"csr=0x%02x\n", csr);
1657 if (buf_res.
length >= 4) {
1663 temp = buf_res.
length & ~3;
1723 DPRINTFN(1,
"ep_no=%d\n", td->
channel);
1734 DPRINTFN(4,
"csr=0x%02x\n", csr);
1761 DPRINTFN(4,
"csrh=0x%02x\n", csrh);
1767 csrh &= ~MUSB2_MASK_CSRH_RXDT_VAL;
1782 DPRINTFN(4,
"NAK Timeout\n");
1784 csr &= ~MUSB2_MASK_CSRL_RXREQPKT;
1787 csr &= ~MUSB2_MASK_CSRL_RXNAKTO;
1795 DPRINTFN(4,
"RXERROR\n");
1800 DPRINTFN(4,
"RXSTALL\n");
1817 DPRINTFN(4,
"count=0x%04x\n",
count);
1823 if (count < td->max_frame_size) {
1878 if (buf_res.
length >= 4) {
1884 temp = buf_res.
length & ~3;
1907 if ((td->
remainder == 0) || got_short) {
1943 DPRINTFN(1,
"ep_no=%d\n", td->
channel);
1950 DPRINTFN(4,
"csr=0x%02x\n", csr);
1976 csr &= ~MUSB2_MASK_CSRL_TXNAKTO;
2054 if (buf_res.
length >= 4) {
2060 temp = buf_res.
length & ~3;
2103 DPRINTFN(4,
"csrh=0x%02x\n", csrh);
2109 csrh &= ~MUSB2_MASK_CSRH_TXDT_VAL;
2137 if ((td->
func) (td)) {
2147 }
else if (td->remainder > 0) {
2152 if (!td->alt_next) {
2178 TAILQ_FOREACH(xfer, &sc->
sc_bus.
intr_q.head, wait_entry) {
2189 DPRINTFN(4,
"vbus = %u\n", is_on);
2228 uint16_t rxstat, uint16_t txstat, uint8_t stat)
2246 rx_status |= rxstat;
2247 tx_status |= txstat;
2261 DPRINTFN(4,
"real bus interrupt 0x%08x\n",
usb_status);
2283 temp &= ~MUSB2_MASK_IRESUME;
2303 temp &= ~MUSB2_MASK_IRESUME;
2315 temp &= ~MUSB2_MASK_ISUSP;
2347 if (rx_status || tx_status) {
2348 DPRINTFN(4,
"real endpoint interrupt "
2349 "rx=0x%04x, tx=0x%04x\n", rx_status, tx_status);
2403 DPRINTFN(8,
"addr=%d endpt=%d sumlen=%d speed=%d\n",
2448 DPRINTFN(-1,
"Invalid USB speed: %d\n", speed);
2452 switch (xfer_type) {
2466 DPRINTFN(-1,
"Invalid USB transfer type: %d\n",
2549 if (temp.
len == 0) {
2610 DPRINTFN(1,
"xfer=%p\n", xfer);
2628 DPRINTFN(1,
"ep_no=%d, on=%d\n", channel, on);
2638 temp &= ~MUSB2_MASK_EPINT(0);
2646 temp &= ~MUSB2_MASK_EPINT(channel);
2653 temp &= ~MUSB2_MASK_EPINT(channel);
2668 DPRINTFN(14,
"enabled interrupts on endpoint\n");
2767 DPRINTFN(12,
"xfer=%p endpoint=%p transfer done\n",
2815 DPRINTFN(1,
"xfer=%p, endpoint=%p, error=%d\n",
2818 DPRINTFN(14,
"disabled interrupts on endpoint\n");
2823 if (td && (td->
channel != -1))
2845 DPRINTFN(4,
"endpoint=%p\n", ep);
2866 uint8_t ep_no, uint8_t ep_type, uint8_t ep_dir)
2880 mps = wMaxPacket & 0x7FF;
2881 switch ((wMaxPacket >> 11) & 3) {
2938 max_in_frame_size / 2)) {
2940 temp &= ~(1 << ep_no);
2943 temp |= (1 << ep_no);
2997 max_out_frame_size / 2)) {
2999 temp &= ~(1 << ep_no);
3002 temp |= (1 << ep_no);
3019 DPRINTFN(4,
"endpoint=%p\n", ep);
3057 DPRINTFN(1,
"start\n");
3081 DPRINTF(
"pre-DEVCTL=0x%02x\n", temp);
3106 temp &= ~MUSB2_MASK_SESS;
3118 DPRINTF(
"DEVCTL=0x%02x\n", temp);
3141 sc->
sc_ep_max = (nrx > ntx) ? nrx : ntx;
3148 DPRINTFN(2,
"RX/TX endpoints: %u/%u\n", nrx, ntx);
3151 DPRINTFN(2,
"ERROR: Looks like the clocks are off!\n");
3157 DPRINTFN(2,
"Config Data: 0x%02x\n",
3163 device_printf(sc->
sc_bus.
bdev,
"Dynamic FIFO sizing detected, "
3164 "assuming 16Kbytes of FIFO RAM\n");
3167 DPRINTFN(2,
"HW version: 0x%04x\n",
3174 for (temp = 1; temp <= sc->
sc_ep_max; temp++) {
3184 DPRINTF(
"Endpoint %u FIFO size: IN=%u, OUT=%u, DYN=%d\n",
3185 temp, ftx, frx, dynfifo);
3188 if (frx && (temp <= nrx)) {
3191 if (temp <= cfg->ep_end) {
3205 if (ftx && (temp <= ntx)) {
3208 if (temp <= cfg->ep_end) {
3224 if (frx && ftx && (temp <= nrx) && (temp <= ntx)) {
3225 pf->max_in_frame_size = 1 << ftx;
3226 pf->max_out_frame_size = 1 << frx;
3228 pf->support_multi_buffer = 1;
3229 pf->support_bulk = 1;
3230 pf->support_interrupt = 1;
3231 pf->support_isochronous = 1;
3233 pf->support_out = 1;
3234 }
else if (frx && (temp <= nrx)) {
3235 pf->max_out_frame_size = 1 << frx;
3236 pf->max_in_frame_size = 0;
3238 pf->support_multi_buffer = 1;
3239 pf->support_bulk = 1;
3240 pf->support_interrupt = 1;
3241 pf->support_isochronous = 1;
3242 pf->support_out = 1;
3243 }
else if (ftx && (temp <= ntx)) {
3244 pf->max_in_frame_size = 1 << ftx;
3245 pf->max_out_frame_size = 0;
3247 pf->support_multi_buffer = 1;
3248 pf->support_bulk = 1;
3249 pf->support_interrupt = 1;
3250 pf->support_isochronous = 1;
3255 DPRINTFN(2,
"Dynamic FIFO size = %d bytes\n",
offset);
3440 DPRINTFN(5,
"xfer=%p next=%d nframes=%d\n",
3479 .bcdUSB = {0x00, 0x02},
3483 .bMaxPacketSize = 64,
3484 .bcdDevice = {0x00, 0x01},
3487 .bNumConfigurations = 1,
3493 .bcdUSB = {0x00, 0x02},
3497 .bMaxPacketSize0 = 0,
3498 .bNumConfigurations = 0,
3518 .bInterfaceProtocol = 0,
3529#define HSETW(ptr, val) ptr = { (uint8_t)(val), (uint8_t)((val) >> 8) }
3541#define STRING_VENDOR \
3542 "M\0e\0n\0t\0o\0r\0 \0G\0r\0a\0p\0h\0i\0c\0s"
3544#define STRING_PRODUCT \
3545 "O\0T\0G\0 \0R\0o\0o\0t\0 \0H\0U\0B"
3574 switch (
req->bmRequestType) {
3576 switch (
req->bRequest) {
3578 goto tr_handle_get_descriptor;
3580 goto tr_handle_get_config;
3582 goto tr_handle_get_status;
3589 switch (
req->bRequest) {
3591 goto tr_handle_set_address;
3593 goto tr_handle_set_config;
3605 switch (
req->bRequest) {
3609 goto tr_handle_clear_halt;
3611 goto tr_handle_clear_wakeup;
3619 goto tr_handle_set_halt;
3621 goto tr_handle_set_wakeup;
3634 switch (
req->bRequest) {
3636 goto tr_handle_get_ep_status;
3643 switch (
req->bRequest) {
3645 goto tr_handle_set_interface;
3655 switch (
req->bRequest) {
3657 goto tr_handle_get_interface;
3659 goto tr_handle_get_iface_status;
3676 switch (
req->bRequest) {
3688 switch (
req->bRequest) {
3690 goto tr_handle_clear_port_feature;
3692 goto tr_handle_set_port_feature;
3704 switch (
req->bRequest) {
3706 goto tr_handle_get_tt_state;
3708 goto tr_handle_get_port_status;
3715 switch (
req->bRequest) {
3717 goto tr_handle_get_class_descriptor;
3719 goto tr_handle_get_class_status;
3730tr_handle_get_descriptor:
3731 switch (
value >> 8) {
3754 switch (
value & 0xff) {
3761 len =
sizeof(musbotg_vendor);
3762 ptr = (
const void *)&musbotg_vendor;
3766 len =
sizeof(musbotg_product);
3767 ptr = (
const void *)&musbotg_product;
3778tr_handle_get_config:
3783tr_handle_get_status:
3788tr_handle_set_address:
3789 if (
value & 0xFF00) {
3795tr_handle_set_config:
3802tr_handle_get_interface:
3807tr_handle_get_tt_state:
3808tr_handle_get_class_status:
3809tr_handle_get_iface_status:
3810tr_handle_get_ep_status:
3816tr_handle_set_interface:
3817tr_handle_set_wakeup:
3818tr_handle_clear_wakeup:
3819tr_handle_clear_halt:
3822tr_handle_clear_port_feature:
3826 DPRINTFN(8,
"UR_CLEAR_PORT_FEATURE on port %d\n",
index);
3874tr_handle_set_port_feature:
3878 DPRINTFN(8,
"UR_SET_PORT_FEATURE\n");
3899 reg &= ~MUSB2_MASK_RESET;
3927tr_handle_get_port_status:
3929 DPRINTFN(8,
"UR_GET_PORT_STATUS\n");
3995tr_handle_get_class_descriptor:
4091 for (
n = 0;
n != ntd;
n++) {
4106 parm->
size[0] +=
sizeof(*td);
4135 DPRINTFN(2,
"endpoint=%p, addr=%d, endpt=%d, mode=%d (%d)\n",
static SYSCTL_NODE(_hw_usb, OID_AUTO, dwc_otg, CTLFLAG_RW|CTLFLAG_MPSAFE, 0, "USB DWC OTG")
SYSCTL_INT(_hw_usb_dwc_otg, OID_AUTO, phy_type, CTLFLAG_RDTUN, &dwc_otg_phy_type, 0, "DWC OTG PHY TYPE - 0/1/2/3 - ULPI/HSIC/INTERNAL/UTMI+")
static void musbotg_device_bulk_close(struct usb_xfer *xfer)
static const struct musbotg_config_desc musbotg_confd
static void musbotg_device_ctrl_start(struct usb_xfer *xfer)
static void musbotg_clocks_off(struct musbotg_softc *sc)
static int musbotg_channel_alloc(struct musbotg_softc *, struct musbotg_td *td, uint8_t)
static musbotg_cmd_t musbotg_dev_data_tx
static void musbotg_clear_stall_sub(struct musbotg_softc *sc, uint16_t wMaxPacket, uint8_t ep_no, uint8_t ep_type, uint8_t ep_dir)
static usb_error_t musbotg_roothub_exec(struct usb_device *udev, struct usb_device_request *req, const void **pptr, uint16_t *plength)
static musbotg_cmd_t musbotg_dev_ctrl_setup_rx
static void musbotg_timeout(void *arg)
static void musbotg_ep_init(struct usb_device *udev, struct usb_endpoint_descriptor *edesc, struct usb_endpoint *ep)
static void musbotg_get_dma_delay(struct usb_device *udev, uint32_t *pus)
static musbotg_cmd_t musbotg_host_ctrl_setup_tx
static void musbotg_device_intr_enter(struct usb_xfer *xfer)
static void musbotg_device_intr_close(struct usb_xfer *xfer)
static musbotg_cmd_t musbotg_host_data_rx
static void musbotg_interrupt_poll(struct musbotg_softc *)
static void musbotg_device_intr_start(struct usb_xfer *xfer)
static void musbotg_pull_down(struct musbotg_softc *sc)
#define MUSBOTG_PC2SC(pc)
static void musbotg_ep_int_set(struct musbotg_softc *sc, int channel, int on)
static void musbotg_clear_stall(struct usb_device *udev, struct usb_endpoint *ep)
static musbotg_cmd_t musbotg_dev_ctrl_status
static usb_error_t musbotg_standard_done_sub(struct usb_xfer *xfer)
static const struct musb_otg_ep_cfg musbotg_ep_default[]
static void musbotg_set_hw_power_sleep(struct usb_bus *bus, uint32_t state)
static const struct usb_pipe_methods musbotg_device_bulk_methods
static musbotg_cmd_t musbotg_host_data_tx
static musbotg_cmd_t musbotg_host_ctrl_data_rx
static void musbotg_device_intr_open(struct usb_xfer *xfer)
static uint8_t musbotg_xfer_do_fifo(struct usb_xfer *xfer)
static musbotg_cmd_t musbotg_host_ctrl_status_rx
void musbotg_uninit(struct musbotg_softc *sc)
static void musbotg_setup_standard_chain_sub(struct musbotg_std_temp *temp)
static void musbotg_device_isoc_close(struct usb_xfer *xfer)
static const struct usb_pipe_methods musbotg_device_ctrl_methods
static void musbotg_device_done(struct usb_xfer *, usb_error_t)
static musbotg_cmd_t musbotg_host_ctrl_data_tx
static void musbotg_wakeup_peer(struct musbotg_softc *sc)
static void musbotg_channel_free(struct musbotg_softc *, struct musbotg_td *td)
static musbotg_cmd_t musbotg_dev_data_rx
static void musbotg_set_address(struct musbotg_softc *sc, uint8_t addr)
static musbotg_cmd_t musbotg_host_ctrl_status_tx
static const struct usb_hub_descriptor_min musbotg_hubd
static void musbotg_pull_up(struct musbotg_softc *sc)
static void musbotg_root_intr(struct musbotg_softc *)
void musbotg_connect_interrupt(struct musbotg_softc *sc)
static void musbotg_xfer_unsetup(struct usb_xfer *xfer)
static const struct usb_hw_ep_profile musbotg_ep_profile[1]
static const struct usb_device_qualifier musbotg_odevd
static void musbotg_device_isoc_open(struct usb_xfer *xfer)
static void musbotg_device_isoc_enter(struct usb_xfer *xfer)
static void musbotg_start_standard_chain(struct usb_xfer *xfer)
#define MUSBOTG_INTR_ENDPT
static const struct usb_bus_methods musbotg_bus_methods
static void musbotg_pull_common(struct musbotg_softc *sc, uint8_t on)
static void musbotg_do_poll(struct usb_bus *)
static const struct usb_pipe_methods musbotg_device_intr_methods
static void musbotg_device_bulk_start(struct usb_xfer *xfer)
static void musbotg_get_hw_ep_profile(struct usb_device *udev, const struct usb_hw_ep_profile **ppf, uint8_t ep_addr)
static void musbotg_device_bulk_enter(struct usb_xfer *xfer)
static const struct usb_pipe_methods musbotg_device_isoc_methods
static void musbotg_set_stall(struct usb_device *udev, struct usb_endpoint *ep, uint8_t *did_stall)
static void musbotg_device_ctrl_close(struct usb_xfer *xfer)
void musbotg_vbus_interrupt(struct musbotg_softc *sc, uint8_t is_on)
static void musbotg_device_ctrl_enter(struct usb_xfer *xfer)
static musbotg_cmd_t musbotg_dev_ctrl_data_rx
static void musbotg_device_isoc_start(struct usb_xfer *xfer)
void musbotg_interrupt(struct musbotg_softc *sc, uint16_t rxstat, uint16_t txstat, uint8_t stat)
static void musbotg_clocks_on(struct musbotg_softc *sc)
static void musbotg_xfer_setup(struct usb_setup_params *parm)
#define MUSBOTG_BUS2SC(bus)
static void musbotg_standard_done(struct usb_xfer *)
static const struct usb_device_descriptor musbotg_devd
static void musbotg_setup_standard_chain(struct usb_xfer *xfer)
static void musbotg_suspend_host(struct musbotg_softc *sc)
static void musbotg_device_bulk_open(struct usb_xfer *xfer)
static musbotg_cmd_t musbotg_dev_ctrl_data_tx
USB_MAKE_STRING_DESC(STRING_VENDOR, musbotg_vendor)
usb_error_t musbotg_init(struct musbotg_softc *sc)
static void musbotg_wakeup_host(struct musbotg_softc *sc)
static void musbotg_device_ctrl_open(struct usb_xfer *xfer)
static void musbotg_xfer_stall(struct usb_xfer *xfer)
#define MUSB2_MASK_CSR0L_ERROR
#define MUSB2_REG_RXDBDIS
#define MUSB2_MASK_CSRH_RXISO
#define MUSB2_MASK_CSR0L_STATUSPKT
#define MUSB2_MASK_TI_SPEED_HS
#define MUSB2_READ_1(sc, reg)
#define MUSB2_MASK_CSRL_RXFFLUSH
#define MUSB2_MASK_CSR0L_SETUPEND
#define MUSB2_MASK_FIFODB
#define MUSB2_MASK_CSRL_TXPKTRDY
#define MUSB2_REG_RXNAKLIMIT
#define MUSB2_MASK_CSRL_RXOVERRUN
#define MUSB2_MASK_IRESET
#define MUSB2_VAL_FIFOSZ_4096
#define MUSB2_MASK_CSRL_TXUNDERRUN
#define MUSB2_MASK_CSRL_RXSENTSTALL
#define MUSB2_MASK_CSR0L_SETUPEND_CLR
#define MUSB2_MASK_CSRH_RXNYET
#define MUSB2_MASK_TI_SPEED_LO
#define MUSB2_DEVICE_MODE
#define MUSB2_REG_RXHUBPORT(n)
#define MUSB2_MASK_CSRL_TXSENTSTALL
#define MUSB2_REG_RXFIFOADD
#define MUSB2_MASK_CSRL_RXSTALL
#define MUSB2_MASK_HSMODE
#define MUSB2_MASK_CSRL_RXERROR
#define MUSB2_MASK_CSRH_TXDT_VAL
#define MUSB2_MASK_CSRL_TXINCOMP
#define MUSB2_REG_RXFIFOSZ
#define MUSB2_MASK_CSR0L_DATAEND
#define MUSB2_MASK_CSR0L_REQPKT
#define MUSB2_REG_TXNAKLIMIT
#define MUSB2_MASK_CSR0L_SENTSTALL
#define MUSB2_REG_TXFIFOADD
#define MUSB2_MASK_CSR0L_TXPKTRDY
#define MUSB2_MASK_CSR0H_FFLUSH
#define MUSB2_MASK_CSR0L_RXPKTRDY
#define MUSB2_MASK_TI_SPEED_FS
#define MUSB2_REG_TESTMODE
#define MUSB2_MASK_CSRL_TXSTALLED
#define MUSB2_MASK_TI_PROTO_BULK
#define MUSB2_MASK_CSRL_TXERROR
#define MUSB2_REG_RXCOUNT
#define MUSB2_WRITE_1(sc, reg, data)
#define MUSB2_WRITE_2(sc, reg, data)
#define MUSB2_REG_RXFADDR(n)
#define MUSB2_MASK_CD_DYNFIFOSZ
#define MUSB2_REG_TXDBDIS
#define MUSB2_MASK_RESUME
#define MUSB2_REG_TXFIFOSZ
#define MUSB2_MASK_HSENAB
#define MUSB2_MASK_EPINT(epn)
#define MUSB2_MASK_CSR0L_NAKTIMO
#define MUSB2_MASK_TI_PROTO_ISOC
#define MUSB2_MASK_SUSPMODE
#define MUSB2_MASK_CSR0L_TXFIFONEMPTY
#define MUSB2_MASK_IRESUME
#define MUSB2_MASK_CSR0H_PING_DIS
#define MUSB2_MASK_CSRL_RXDT_CLR
#define MUSB2_MASK_CSRL_RXSENDSTALL
#define MUSB2_REG_EPFIFO(n)
#define MUSB2_REG_INTUSBE
#define MUSB2_MASK_CSRH_TXISO
#define MUSB2_MASK_CSRH_RXDT_VAL
#define MUSB2_MASK_CSR0L_RXPKTRDY_CLR
#define MUSB2_MASK_CSRL_RXNAKTO
#define MUSB2_MASK_CSRL_TXNAKTO
#define MUSB2_VAL_FIFOSZ_512
#define MUSB2_MASK_CSRL_RXREQPKT
#define MUSB2_VAL_FIFOSZ_128
#define MUSB2_REG_CONFDATA
#define MUSB2_REG_TXFADDR(n)
#define MUSB2_MASK_CSR0L_RXSTALL
#define MUSB2_MASK_CSRL_TXFFLUSH
#define MUSB2_REG_RXHADDR(n)
#define MUSB2_MASK_TX_FSIZE
#define MUSB2_MASK_CSRH_TXMODE
#define MUSB2_MASK_CSRL_TXSENDSTALL
#define MUSB2_MASK_CSRL_RXPKTRDY
#define MUSB2_REG_TXHUBPORT(n)
#define MUSB2_MASK_CSRL_TXFIFONEMPTY
#define MUSB2_MASK_ISOUPD
#define MUSB2_MASK_CSRH_RXDT_WREN
#define MUSB2_READ_2(sc, reg)
#define MUSB2_MASK_CSRH_TXDT_WREN
#define MUSB2_MASK_IVBUSERR
#define MUSB2_MASK_TI_PROTO_INTR
#define MUSB2_MASK_CSR0L_SENDSTALL
#define MUSB2_MASK_CSRL_TXDT_CLR
#define MUSB2_REG_EPINDEX
#define MUSB2_MASK_CSR0L_SETUPPKT
#define MUSB2_MASK_TI_PROTO_CTRL
#define MUSB2_MASK_RX_FSIZE
#define MUSB2_REG_TXHADDR(n)
uint8_t() musbotg_cmd_t(struct musbotg_td *td)
struct usb_config_descriptor confd
uint8_t status_high_speed
uint8_t change_over_current
uint8_t port_over_current
void(* sc_clocks_on)(void *arg)
void(* sc_ep_int_set)(struct musbotg_softc *sc, int ep, int on)
union musbotg_hub_temp sc_hub_temp
bus_space_tag_t sc_io_tag
bus_space_handle_t sc_io_hdl
void(* sc_clocks_off)(void *arg)
uint32_t sc_bounce_buf[(1024 *3)/4]
struct usb_hw_ep_profile sc_hw_ep_profile[MUSB2_EP_MAX]
struct musbotg_flags sc_flags
const struct musb_otg_ep_cfg * sc_ep_cfg
struct usb_page_cache * pc
struct musbotg_td * td_next
uint8_t transaction_started
struct musbotg_td * obj_next
struct usb_page_cache * pc
void(* endpoint_init)(struct usb_device *, struct usb_endpoint_descriptor *, struct usb_endpoint *)
const struct usb_bus_methods * methods
struct usb_xfer_queue intr_q
uByte bConfigurationValue
enum usb_hc_mode usb_mode
struct usb_device_flags flags
const struct usb_pipe_methods * methods
struct usb_endpoint_descriptor * edesc
uWord wHubCharacteristics
uint16_t max_in_frame_size
uint16_t max_out_frame_size
void(* open)(struct usb_xfer *)
uint32_t hc_max_frame_size
uint8_t hc_max_packet_count
struct usb_xfer * curr_xfer
uint16_t hc_max_packet_size
const struct usb_pipe_methods * methods
enum usb_hc_mode usb_mode
usb_frlength_t * frlengths
struct usb_page_cache * frbuffers
struct usb_endpoint * endpoint
struct usb_xfer_flags_int flags_int
struct usb_xfer_flags flags
struct usb_xfer_root * xroot
struct usb_port_status ps
#define UT_WRITE_INTERFACE
#define UR_SET_DESCRIPTOR
#define UT_WRITE_CLASS_OTHER
#define UT_WRITE_CLASS_DEVICE
#define UPS_C_OVERCURRENT_INDICATOR
#define UR_CLEAR_TT_BUFFER
#define UHF_C_PORT_SUSPEND
#define UT_READ_CLASS_INTERFACE
#define UDESC_DEVICE_QUALIFIER
#define UF_DEVICE_REMOTE_WAKEUP
#define UT_READ_VENDOR_INTERFACE
#define UHF_C_PORT_OVER_CURRENT
#define UPS_PORT_MODE_DEVICE
#define UHD_OC_INDIVIDUAL
#define UT_WRITE_ENDPOINT
#define UT_READ_CLASS_DEVICE
#define UT_WRITE_CLASS_INTERFACE
#define UT_READ_CLASS_OTHER
#define UHF_PORT_INDICATOR
#define UHD_PWR_NO_SWITCH
#define UPS_C_CONNECT_STATUS
#define UPS_CURRENT_CONNECT_STATUS
#define UHF_C_PORT_ENABLE
#define UT_WRITE_VENDOR_INTERFACE
#define UPS_OVERCURRENT_INDICATOR
#define UT_READ_INTERFACE
#define UR_GET_DESCRIPTOR
#define UHF_C_PORT_CONNECTION
void usbd_get_page(struct usb_page_cache *pc, usb_frlength_t offset, struct usb_page_search *res)
void usbd_copy_in(struct usb_page_cache *cache, usb_frlength_t offset, const void *ptr, usb_frlength_t len)
void usbd_copy_out(struct usb_page_cache *cache, usb_frlength_t offset, void *ptr, usb_frlength_t len)
#define USB_HW_POWER_RESUME
#define USB_HW_POWER_SUSPEND
#define USB_HW_POWER_SHUTDOWN
const struct usb_string_lang usb_string_lang_en
#define USB_ADD_BYTES(ptr, size)
#define USB_BUS_UNLOCK(_b)
#define USB_BUS_LOCK_ASSERT(_b, _t)
enum usb_dev_speed usbd_get_speed(struct usb_device *udev)
void uhub_root_intr(struct usb_bus *bus, const uint8_t *ptr, uint8_t len)
void usbd_transfer_setup_sub(struct usb_setup_params *parm)
void usbd_transfer_done(struct usb_xfer *xfer, usb_error_t error)
void usbd_transfer_enqueue(struct usb_xfer_queue *pq, struct usb_xfer *xfer)
uint8_t usbd_xfer_get_isochronous_start_frame(struct usb_xfer *xfer, uint32_t frame_curr, uint32_t frame_min, uint32_t frame_ms, uint32_t frame_mask, uint32_t *p_frame_start)
void usbd_transfer_timeout_ms(struct usb_xfer *xfer, void(*cb)(void *arg), usb_timeout_t ms)
void usb_pause_mtx(struct mtx *mtx, int timo)
@ USB_ERR_NORMAL_COMPLETION