39#ifndef CFG_TUH_TASK_QUEUE_SZ
40 #define CFG_TUH_TASK_QUEUE_SZ 16
43#ifndef CFG_TUH_INTERFACE_MAX
44 #define CFG_TUH_INTERFACE_MAX 8
55TU_ATTR_WEAK
bool hcd_configure(uint8_t rhport, uint32_t cfg_id,
const void* cfg_param) {
115 uint8_t itf2drv[CFG_TUH_INTERFACE_MAX];
116 uint8_t ep2drv[CFG_TUH_ENDPOINT_MAX][2];
120#if CFG_TUH_API_EDPT_XFER
125 }ep_callback[CFG_TUH_ENDPOINT_MAX][2];
133#if CFG_TUSB_DEBUG >= CFG_TUH_LOG_LEVEL
134 #define DRIVER_NAME(_name) _name
136 #define DRIVER_NAME(_name) NULL
142 .
name = DRIVER_NAME(
"CDC"),
154 .name = DRIVER_NAME(
"MSC"),
166 .name = DRIVER_NAME(
"HID"),
178 .name = DRIVER_NAME(
"HUB"),
190 .name = DRIVER_NAME(
"VENDOR"),
192 .deinit = cush_deinit,
194 .set_config = cush_set_config,
208#define TOTAL_DRIVER_COUNT (_app_driver_count + BUILTIN_DRIVER_COUNT)
215 }
else if ( drv_id < TOTAL_DRIVER_COUNT && BUILTIN_DRIVER_COUNT > 0) {
227#define TOTAL_DEVICES (CFG_TUH_DEVICE_MAX + CFG_TUH_HUB)
240#if OSAL_MUTEX_REQUIRED
244 #define _usbh_mutex NULL
252CFG_TUH_MEM_SECTION CFG_TUH_MEM_ALIGN
258CFG_TUH_MEM_SECTION
struct {
294 return dev->configured;
301 TU_VERIFY(dev && dev->addressed && dev->
vid != 0);
351 TU_LOG_USBH(
"USBH init on controller %u, speed = %s\r\n", rhport,
367#if OSAL_MUTEX_REQUIRED
383 for (uint8_t i = 0; i < TOTAL_DEVICES; i++) {
388 for (uint8_t drv_id = 0; drv_id < TOTAL_DRIVER_COUNT; drv_id++) {
391 TU_LOG_USBH(
"%s init\r\n", driver->
name);
399 TU_ASSERT(
hcd_init(rhport, rh_init));
419 for (uint8_t drv_id = 0; drv_id < TOTAL_DRIVER_COUNT; drv_id++) {
421 if (driver && driver->
deinit) {
422 TU_LOG_USBH(
"%s deinit\r\n", driver->
name);
430 #if OSAL_MUTEX_REQUIRED
477 case HCD_EVENT_DEVICE_ATTACH:
480 if (
_dev0.enumerating) {
486 TU_LOG1(
"[%u:] USBH Device Attach (duplicated)\r\n", event.
rhport);
490 TU_LOG_USBH(
"[%u:] USBH Defer Attach until current enumeration complete\r\n", event.
rhport);
501 TU_LOG1(
"[%u:] USBH Device Attach\r\n", event.
rhport);
502 _dev0.enumerating = 1;
507 case HCD_EVENT_DEVICE_REMOVE:
520 case HCD_EVENT_XFER_COMPLETE: {
521 uint8_t
const ep_addr =
event.xfer_complete.ep_addr;
523 uint8_t
const ep_dir = (uint8_t)
tu_edpt_dir(ep_addr);
529 TU_ASSERT(epnum == 0,);
533 TU_VERIFY(dev && dev->connected,);
543 #if CFG_TUH_API_EDPT_XFER
548 .daddr =
event.dev_addr,
550 .result =
event.xfer_complete.result,
561 uint8_t drv_id = dev->
ep2drv[epnum][ep_dir];
564 TU_LOG_USBH(
"%s xfer callback\r\n", driver->
name);
577 case USBH_EVENT_FUNC_CALL:
585#if CFG_TUSB_OS != OPT_OS_NONE && CFG_TUSB_OS != OPT_OS_PICO
604 TU_VERIFY(
xfer->ep_addr == 0 &&
xfer->setup);
609 TU_VERIFY(
_dev0.enumerating);
612 TU_VERIFY(dev && dev->connected);
636 TU_LOG_USBH(
"[%u:%u] %s: ", rhport,
daddr,
639 TU_LOG_BUF_USBH(
xfer->setup, 8);
641 if (
xfer->complete_cb) {
664 if (
xfer->user_data != 0) {
667 xfer->result = result;
690 .actual_len = (uint32_t)
_ctrl_xfer.actual_len,
710 TU_LOG_USBH(
"[%u:%u] Control %s, xferred_bytes = %" PRIu32
"\r\n", rhport,
daddr, result ==
XFER_RESULT_STALLED ?
"STALLED" :
"FAILED", xferred_bytes);
728 TU_LOG_USBH(
"[%u:%u] Control data:\r\n", rhport,
daddr);
729 TU_LOG_MEM_USBH(
_ctrl_xfer.buffer, xferred_bytes, 2);
732 _ctrl_xfer.actual_len = (uint16_t) xferred_bytes;
743 for(uint8_t epnum=1; epnum<CFG_TUH_ENDPOINT_MAX; epnum++) {
744 for(uint8_t dir=0; dir<2; dir++) {
754 default:
return false;
767 uint8_t
const ep_addr =
xfer->ep_addr;
769 TU_VERIFY(
daddr && ep_addr);
773 xfer->complete_cb,
xfer->user_data)) {
782 TU_LOG_USBH(
"[%u] Aborted transfer on EP %02X\r\n",
daddr, ep_addr);
834 event.
event_id = USBH_EVENT_FUNC_CALL;
835 event.func_call.func = func;
836 event.func_call.param = param;
849 TU_ASSERT(dev && dev->connected);
855 TU_LOG_USBH(
"[%u] Claimed EP 0x%02x\r\n",
dev_addr, ep_addr);
864 TU_VERIFY(dev && dev->connected);
870 TU_LOG_USBH(
"[%u] Released EP 0x%02x\r\n",
dev_addr, ep_addr);
889 TU_LOG_USBH(
" Queue EP %02X with %u bytes ... \r\n", ep_addr,
total_bytes);
892 TU_ASSERT(ep_state->
busy == 0);
898#if CFG_TUH_API_EDPT_XFER
904 TU_LOG_USBH(
"OK\r\n");
910 TU_LOG1(
"Failed\r\n");
921 .bEndpointAddress = 0,
923 .wMaxPacketSize = max_packet_size,
966 case HCD_EVENT_DEVICE_REMOVE:
973 _dev0.enumerating = 0;
998 .wValue = tu_htole16( TU_U16(type, index) ),
999 .wIndex = tu_htole16(language_id),
1000 .wLength = tu_htole16(len)
1066 TU_LOG_USBH(
"HID Get Report Descriptor\r\n");
1074 .wValue = tu_htole16(TU_U16(desc_type, index)),
1075 .wIndex = tu_htole16((uint16_t) itf_num),
1092 TU_LOG_USBH(
"Set Configuration = %d\r\n", config_num);
1100 .wValue = tu_htole16(config_num),
1118 TU_LOG_USBH(
"Set Interface %u Alternate %u\r\n", itf_num, itf_alt);
1126 .wValue = tu_htole16(itf_alt),
1127 .wIndex = tu_htole16(itf_num),
1146#define _CONTROL_SYNC_API(_async_func, ...) \
1147 xfer_result_t result = XFER_RESULT_INVALID;\
1148 TU_VERIFY(_async_func(__VA_ARGS__, NULL, (uintptr_t) &result), XFER_RESULT_TIMEOUT); \
1149 return (uint8_t) result
1152 void*
buffer, uint16_t len) {
1161 void*
buffer, uint16_t len) {
1166 void*
buffer, uint16_t len) {
1171 void*
buffer, uint16_t len) {
1176 void*
buffer, uint16_t len) {
1181 void*
buffer, uint16_t len) {
1186 void*
buffer, uint16_t len) {
1195 return (CFG_TUH_HUB > 0) && (
daddr > CFG_TUH_DEVICE_MAX);
1222 uint32_t removing_hubs = 0;
1224 for (uint8_t dev_id = 0; dev_id < TOTAL_DEVICES; dev_id++) {
1226 uint8_t
const daddr = dev_id + 1;
1229 if (dev->
rhport == rhport && dev->connected &&
1230 (hub_addr == 0 || dev->
hub_addr == hub_addr) &&
1231 (hub_port == 0 || dev->
hub_port == hub_port)) {
1232 TU_LOG_USBH(
"[%u:%u:%u] unplugged address = %u\r\n", rhport, hub_addr, hub_port,
daddr);
1235 TU_LOG_USBH(
" is a HUB device %u\r\n",
daddr);
1236 removing_hubs |= TU_BIT(dev_id - CFG_TUH_DEVICE_MAX);
1243 for (uint8_t drv_id = 0; drv_id < TOTAL_DRIVER_COUNT; drv_id++) {
1258 if (removing_hubs == 0)
break;
1261 for (uint8_t h_id = 0; h_id < CFG_TUH_HUB; h_id++) {
1263 removing_hubs &= ~TU_BIT(h_id);
1266 hub_addr = h_id + 1 + CFG_TUH_DEVICE_MAX;
1272 (void) removing_hubs;
1318 ATTEMPT_COUNT_MAX = 3,
1319 ATTEMPT_DELAY_MS = 100
1321 static uint8_t failed_count = 0;
1325 bool retry =
_dev0.enumerating && (failed_count < ATTEMPT_COUNT_MAX);
1329 TU_LOG1(
"Enumeration attempt %u\r\n", failed_count);
1342 uintptr_t
const state =
xfer->user_data;
1390 uint8_t
const addr0 = 0;
1394 TU_LOG_USBH(
"Get 8 byte of Device Descriptor\r\n");
1404 TU_LOG_USBH(
"Port reset2 \r\n");
1421 TU_ATTR_FALLTHROUGH;
1432 const uint8_t new_addr = (uint8_t) tu_le16toh(
xfer->setup->wValue);
1435 TU_ASSERT(new_dev,);
1436 new_dev->addressed = 1;
1445 TU_LOG_USBH(
"Get Device Descriptor\r\n");
1456 dev->
vid = desc_device->idVendor;
1457 dev->
pid = desc_device->idProduct;
1460 dev->
i_serial = desc_device->iSerialNumber;
1466 TU_LOG_USBH(
"Get Configuration[0] Descriptor (9 bytes)\r\n");
1476 uint16_t
const total_len = tu_le16toh(
1480 TU_ASSERT(total_len <= CFG_TUH_ENUMERATION_BUFSIZE,);
1484 TU_LOG_USBH(
"Get Configuration[0] Descriptor\r\n");
1495 TU_LOG_USBH(
"Device configured\r\n");
1499 dev->configured = 1;
1577 start = CFG_TUH_DEVICE_MAX;
1578 end = start + CFG_TUH_HUB;
1581 end = start + CFG_TUH_DEVICE_MAX;
1584 for (uint8_t idx = start; idx < end; idx++) {
1596 TU_ASSERT(new_addr != 0);
1597 TU_LOG_USBH(
"Set Address = %d\r\n", new_addr);
1604 new_dev->connected = 1;
1605 new_dev->
ep0_size = desc_device->bMaxPacketSize0;
1614 .wValue = tu_htole16(new_addr),
1633 uint16_t
const total_len = tu_le16toh(desc_cfg->
wTotalLength);
1634 uint8_t
const* desc_end = ((uint8_t
const*) desc_cfg) + total_len;
1637 TU_LOG_USBH(
"Parsing Configuration descriptor (wTotalLength = %u)\r\n", total_len);
1640 while( p_desc < desc_end ) {
1641 uint8_t assoc_itf_count = 1;
1661 if (1 == assoc_itf_count &&
1665 assoc_itf_count = 2;
1672 if (1 == assoc_itf_count &&
1675 assoc_itf_count = 2;
1683 for (uint8_t drv_id = 0; drv_id < TOTAL_DRIVER_COUNT; drv_id++) {
1687 TU_LOG_USBH(
" %s opened\r\n", driver->
name);
1690 for(uint8_t i=0; i<assoc_itf_count; i++) {
1695 dev->
itf2drv[itf_num] = drv_id;
1704 if ( drv_id == TOTAL_DRIVER_COUNT - 1 ) {
1705 TU_LOG_USBH(
"[%u:%u] Interface %u: class = %u subclass = %u protocol = %u is not supported\r\n",
1720 for(itf_num++; itf_num < CFG_TUH_INTERFACE_MAX; itf_num++) {
1724 uint8_t
const drv_id = dev->
itf2drv[itf_num];
1727 TU_LOG_USBH(
"%s set config: itf = %u\r\n", driver->
name, itf_num);
1734 if (itf_num == CFG_TUH_INTERFACE_MAX) {
1738 TU_LOG_USBH(
"HUB address = %u is mounted\r\n",
dev_addr);
1748 _dev0.enumerating = 0;
bool cdch_open(uint8_t rhport, uint8_t daddr, tusb_desc_interface_t const *itf_desc, uint16_t max_len)
bool cdch_set_config(uint8_t daddr, uint8_t itf_num)
void cdch_close(uint8_t daddr)
bool cdch_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes)
xfer_td_t xfer[EP_CBI_COUNT+1][2]
static const tusb_desc_endpoint_t ep0_desc
@ AUDIO_SUBCLASS_CONTROL
Audio Control.
@ AUDIO_FUNC_PROTOCOL_CODE_UNDEF
bool hub_port_get_status(uint8_t hub_addr, uint8_t hub_port, void *resp, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
void hub_close(uint8_t dev_addr)
bool hub_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *itf_desc, uint16_t max_len)
bool hub_xfer_cb(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
bool hub_edpt_status_xfer(uint8_t dev_addr)
static TU_ATTR_ALWAYS_INLINE bool hub_port_clear_reset_change(uint8_t hub_addr, uint8_t hub_port, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
bool hub_set_config(uint8_t dev_addr, uint8_t itf_num)
static TU_ATTR_ALWAYS_INLINE bool hub_port_reset(uint8_t hub_addr, uint8_t hub_port, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
void hcd_int_disable(uint8_t rhport)
bool hcd_edpt_open(uint8_t rhport, uint8_t daddr, tusb_desc_endpoint_t const *ep_desc)
void hcd_int_enable(uint8_t rhport)
void hcd_device_close(uint8_t rhport, uint8_t dev_addr)
bool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr)
void hcd_port_reset_end(uint8_t rhport)
bool hcd_setup_send(uint8_t rhport, uint8_t daddr, uint8_t const setup_packet[8])
void hcd_port_reset(uint8_t rhport)
bool hcd_port_connect_status(uint8_t rhport)
tusb_speed_t hcd_port_speed_get(uint8_t rhport)
bool hcd_edpt_xfer(uint8_t rhport, uint8_t daddr, uint8_t ep_addr, uint8_t *buffer, uint16_t buflen)
bool hcd_init(uint8_t rhport, const tusb_rhport_init_t *rh_init)
void hidh_close(uint8_t daddr)
bool hidh_open(uint8_t rhport, uint8_t daddr, tusb_desc_interface_t const *desc_itf, uint16_t max_len)
bool hidh_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
bool hidh_set_config(uint8_t daddr, uint8_t itf_num)
bool msch_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *desc_itf, uint16_t max_len)
void msch_close(uint8_t dev_addr)
bool msch_set_config(uint8_t dev_addr, uint8_t itf_num)
bool msch_xfer_cb(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes)
static TU_ATTR_ALWAYS_INLINE bool osal_queue_empty(osal_queue_t qhdl)
static TU_ATTR_ALWAYS_INLINE osal_queue_t osal_queue_create(osal_queue_def_t *qdef)
StaticSemaphore_t osal_mutex_def_t
QueueHandle_t osal_queue_t
static TU_ATTR_ALWAYS_INLINE bool osal_mutex_lock(osal_mutex_t mutex_hdl, uint32_t msec)
static TU_ATTR_ALWAYS_INLINE bool osal_queue_send(osal_queue_t qhdl, void const *data, bool in_isr)
static TU_ATTR_ALWAYS_INLINE bool osal_mutex_unlock(osal_mutex_t mutex_hdl)
static TU_ATTR_ALWAYS_INLINE bool osal_mutex_delete(osal_mutex_t mutex_hdl)
static TU_ATTR_ALWAYS_INLINE bool osal_queue_receive(osal_queue_t qhdl, void *data, uint32_t msec)
static TU_ATTR_ALWAYS_INLINE bool osal_queue_delete(osal_queue_t qhdl)
SemaphoreHandle_t osal_mutex_t
static TU_ATTR_ALWAYS_INLINE osal_mutex_t osal_mutex_create(osal_mutex_def_t *mdef)
static void * memcpy(void *dst, const void *src, size_t n)
AUDIO Channel Cluster Descriptor (4.1)
uint16_t wTotalLength
Total number of bytes returned for the class-specific AudioControl interface descriptor....
struct TU_ATTR_PACKED::@16::TU_ATTR_PACKED bmRequestType_bit
uint8_t bInterfaceCount
Total number of associated interfaces.
uint8_t bInterfaceClass
Class code (assigned by the USB-IF).
uint8_t bLength
Size of this descriptor in bytes: 9.
uint8_t bInterfaceSubClass
Subclass code (assigned by the USB-IF). These codes are qualified by the value of the bInterfaceCla...
uint8_t bRequest
Request type audio_cs_req_t.
uint8_t bInterfaceProtocol
Protocol code (assigned by the USB). These codes are qualified by the value of the bInterfaceClass ...
uint8_t bInterfaceNumber
Number of this interface. Zero-based value identifying the index in the array of concurrent interface...
struct hcd_event_t::@86::@88 connection
struct hcd_event_t::@86::@90 func_call
struct hcd_event_t::@86::@89 xfer_complete
union hub_port_status_response_t::@93 status
union hub_port_status_response_t::@93 change
tuh_xfer_cb_t complete_cb
bool(*const set_config)(uint8_t dev_addr, uint8_t itf_num)
bool(*const deinit)(void)
void(*const close)(uint8_t dev_addr)
bool(*const open)(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *itf_desc, uint16_t max_len)
bool(*const xfer_cb)(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
volatile uint8_t enumerating
volatile uint8_t connected
volatile uint8_t configured
volatile uint8_t suspended
volatile uint8_t addressed
tu_edpt_state_t ep_status[CFG_TUH_ENDPOINT_MAX][2]
uint8_t itf2drv[CFG_TUH_INTERFACE_MAX]
uint8_t ep2drv[CFG_TUH_ENDPOINT_MAX][2]
tuh_xfer_cb_t complete_cb
struct usbh_device_t::@118 ep_callback[CFG_TUH_ENDPOINT_MAX][2]
volatile uint16_t actual_len
char const *const tu_str_speed[]
TU_ATTR_WEAK void tusb_time_delay_ms_api(uint32_t ms)
static TU_ATTR_ALWAYS_INLINE uint16_t tu_min16(uint16_t x, uint16_t y)
static TU_ATTR_ALWAYS_INLINE uint16_t tu_unaligned_read16(const void *mem)
static TU_ATTR_ALWAYS_INLINE bool tu_bit_test(uint32_t value, uint8_t pos)
char const *const tu_str_std_request[]
char const *const tu_str_xfer_result[]
bool tu_edpt_validate(tusb_desc_endpoint_t const *desc_ep, tusb_speed_t speed)
bool tu_edpt_claim(tu_edpt_state_t *ep_state, osal_mutex_t mutex)
bool tu_edpt_release(tu_edpt_state_t *ep_state, osal_mutex_t mutex)
uint16_t tu_desc_get_interface_total_len(tusb_desc_interface_t const *desc_itf, uint8_t itf_count, uint16_t max_len)
void tu_edpt_bind_driver(uint8_t ep2drv[][2], tusb_desc_interface_t const *p_desc, uint16_t desc_len, uint8_t driver_id)
@ TUSB_REQ_GET_DESCRIPTOR
@ TUSB_REQ_SET_CONFIGURATION
tusb_speed_t
defined base on EHCI specs value for Endpoint Speed
static TU_ATTR_ALWAYS_INLINE uint8_t tu_edpt_number(uint8_t addr)
TU_ATTR_PACKED_BEGIN TU_ATTR_BIT_FIELD_ORDER_BEGIN struct TU_ATTR_PACKED tusb_desc_device_t
USB Device Descriptor.
@ TUSB_REQ_RCPT_INTERFACE
TU_ATTR_PACKED_END TU_ATTR_BIT_FIELD_ORDER_END static TU_ATTR_ALWAYS_INLINE tusb_dir_t tu_edpt_dir(uint8_t addr)
struct TU_ATTR_PACKED tusb_desc_endpoint_t
USB Endpoint Descriptor.
static TU_ATTR_ALWAYS_INLINE uint8_t tu_edpt_addr(uint8_t num, uint8_t dir)
static TU_ATTR_ALWAYS_INLINE uint8_t tu_desc_type(void const *desc)
static TU_ATTR_ALWAYS_INLINE uint8_t const * tu_desc_next(void const *desc)
@ TUSB_DESC_INTERFACE_ASSOCIATION
@ TUSB_DESC_CONFIGURATION
static void _control_blocking_complete_cb(tuh_xfer_t *xfer)
bool usbh_edpt_xfer_with_callback(uint8_t dev_addr, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
bool tuh_vid_pid_get(uint8_t dev_addr, uint16_t *vid, uint16_t *pid)
bool tuh_descriptor_get_manufacturer_string(uint8_t daddr, uint16_t language_id, void *buffer, uint16_t len, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
uint8_t tuh_descriptor_get_device_sync(uint8_t daddr, void *buffer, uint16_t len)
bool tuh_edpt_xfer(tuh_xfer_t *xfer)
static TU_ATTR_ALWAYS_INLINE usbh_device_t * get_device(uint8_t dev_addr)
void tuh_task_ext(uint32_t timeout_ms, bool in_isr)
TU_ATTR_WEAK bool hcd_deinit(uint8_t rhport)
@ ENUM_DEBOUNCING_DELAY_MS
bool tuh_descriptor_get_device(uint8_t daddr, void *buffer, uint16_t len, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
volatile uint16_t actual_len
uint8_t tuh_descriptor_get_serial_string_sync(uint8_t daddr, uint16_t language_id, void *buffer, uint16_t len)
bool tuh_task_event_ready(void)
static TU_ATTR_ALWAYS_INLINE void _set_control_xfer_stage(uint8_t stage)
bool tuh_descriptor_get(uint8_t daddr, uint8_t type, uint8_t index, void *buffer, uint16_t len, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
bool tuh_rhport_is_active(uint8_t rhport)
static usbh_class_driver_t const usbh_class_drivers[]
void usbh_driver_set_config_complete(uint8_t dev_addr, uint8_t itf_num)
bool tuh_descriptor_get_configuration(uint8_t daddr, uint8_t index, void *buffer, uint16_t len, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static TU_ATTR_ALWAYS_INLINE bool queue_event(hcd_event_t const *event, bool in_isr)
tu_static usbh_class_driver_t const * _app_driver
CFG_TUH_MEM_SECTION struct @98 _ctrl_xfer
CFG_TUH_MEM_ALIGN tusb_control_request_t request
OSAL_QUEUE_DEF(usbh_int_set, _usbh_qdef, CFG_TUH_TASK_QUEUE_SZ, hcd_event_t)
bool usbh_edpt_release(uint8_t dev_addr, uint8_t ep_addr)
bool tuh_configuration_set(uint8_t daddr, uint8_t config_num, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static void enum_full_complete(void)
bool tuh_descriptor_get_string(uint8_t daddr, uint8_t index, uint16_t language_id, void *buffer, uint16_t len, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static usbh_device_t _usbh_devices[TOTAL_DEVICES]
bool tuh_interface_set(uint8_t daddr, uint8_t itf_num, uint8_t itf_alt, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static osal_queue_t _usbh_q
uint8_t tuh_descriptor_get_product_string_sync(uint8_t daddr, uint16_t language_id, void *buffer, uint16_t len)
tusb_speed_t tuh_speed_get(uint8_t dev_addr)
bool tuh_descriptor_get_product_string(uint8_t daddr, uint16_t language_id, void *buffer, uint16_t len, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
uint8_t tuh_descriptor_get_string_sync(uint8_t daddr, uint8_t index, uint16_t language_id, void *buffer, uint16_t len)
static osal_mutex_def_t _usbh_mutexdef
bool tuh_configure(uint8_t rhport, uint32_t cfg_id, const void *cfg_param)
static void clear_device(usbh_device_t *dev)
tu_static uint8_t _app_driver_count
static void _control_xfer_complete(uint8_t daddr, xfer_result_t result)
@ ENUM_GET_9BYTE_CONFIG_DESC
@ ENUM_GET_FULL_CONFIG_DESC
static bool _parse_configuration_descriptor(uint8_t dev_addr, tusb_desc_configuration_t const *desc_cfg)
void hcd_devtree_get_info(uint8_t dev_addr, hcd_devtree_info_t *devtree_info)
void usbh_defer_func(osal_task_func_t func, void *param, bool in_isr)
static bool usbh_control_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
uint8_t * usbh_get_enum_buf(void)
bool tuh_control_xfer(tuh_xfer_t *xfer)
static bool usbh_edpt_control_open(uint8_t dev_addr, uint8_t max_packet_size)
CFG_TUH_MEM_SECTION static CFG_TUH_MEM_ALIGN uint8_t _usbh_ctrl_buf[CFG_TUH_ENUMERATION_BUFSIZE]
TU_ATTR_FAST_FUNC void hcd_event_handler(hcd_event_t const *event, bool in_isr)
uint8_t tuh_descriptor_get_manufacturer_string_sync(uint8_t daddr, uint16_t language_id, void *buffer, uint16_t len)
static osal_mutex_t _usbh_mutex
bool tuh_rhport_init(uint8_t rhport, const tusb_rhport_init_t *rh_init)
void usbh_int_set(bool enabled)
bool tuh_deinit(uint8_t rhport)
bool usbh_edpt_claim(uint8_t dev_addr, uint8_t ep_addr)
static bool enum_new_device(hcd_event_t *event)
static uint8_t get_new_address(bool is_hub)
bool tuh_rhport_reset_bus(uint8_t rhport, bool active)
bool tuh_mounted(uint8_t dev_addr)
static void process_enumeration(tuh_xfer_t *xfer)
uint8_t tuh_descriptor_get_sync(uint8_t daddr, uint8_t type, uint8_t index, void *buffer, uint16_t len)
tuh_xfer_cb_t complete_cb
TU_ATTR_WEAK void tuh_event_hook_cb(uint8_t rhport, uint32_t eventid, bool in_isr)
uint8_t tuh_descriptor_get_configuration_sync(uint8_t daddr, uint8_t index, void *buffer, uint16_t len)
bool tuh_edpt_open(uint8_t dev_addr, tusb_desc_endpoint_t const *desc_ep)
bool usbh_edpt_busy(uint8_t dev_addr, uint8_t ep_addr)
uint8_t tuh_descriptor_get_hid_report_sync(uint8_t daddr, uint8_t itf_num, uint8_t desc_type, uint8_t index, void *buffer, uint16_t len)
bool tuh_descriptor_get_hid_report(uint8_t daddr, uint8_t itf_num, uint8_t desc_type, uint8_t index, void *buffer, uint16_t len, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
TU_ATTR_WEAK bool hcd_configure(uint8_t rhport, uint32_t cfg_id, const void *cfg_param)
static bool _get_descriptor(uint8_t daddr, uint8_t type, uint8_t index, uint16_t language_id, void *buffer, uint16_t len, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static usbh_class_driver_t const * get_driver(uint8_t drv_id)
static void process_removing_device(uint8_t rhport, uint8_t hub_addr, uint8_t hub_port)
static bool enum_request_set_addr(void)
bool tuh_descriptor_get_serial_string(uint8_t daddr, uint16_t language_id, void *buffer, uint16_t len, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
bool tuh_edpt_abort_xfer(uint8_t daddr, uint8_t ep_addr)
static uint8_t _usbh_controller
static TU_ATTR_ALWAYS_INLINE bool is_hub_addr(uint8_t daddr)
uint8_t usbh_get_rhport(uint8_t dev_addr)
static TU_ATTR_ALWAYS_INLINE void tuh_task(void)
TU_ATTR_WEAK void tuh_umount_cb(uint8_t daddr)
void(* tuh_xfer_cb_t)(tuh_xfer_t *xfer)
TU_ATTR_WEAK void tuh_mount_cb(uint8_t daddr)
usbh_class_driver_t const * usbh_app_driver_get_cb(uint8_t *driver_count) TU_ATTR_WEAK
void cush_isr(pipe_handle_t pipe_hdl, xfer_result_t event)
void cush_close(uint8_t dev_addr)