2#include <Adafruit_TinyUSB.h>
13#include "host/usbh_pvt.h"
18#error "USB Audio Host: host support is not enabled in the Adafruit TinyUSB Library (CFG_TUH_ENABLED); e.g. on RP2040 select the USB Stack 'Adafruit TinyUSB Host'"
21#if TUSB_VERSION_NUMBER < 1700
22#error "USB Audio Host requires TinyUSB >= 0.17 (a current Adafruit TinyUSB Library)"
66#if CFG_TUH_ENUMERATION_BUFSIZE < 512
68 "CFG_TUH_ENUMERATION_BUFSIZE is %d: devices with a larger "
69 "configuration descriptor are not detected",
70 (
int)CFG_TUH_ENUMERATION_BUFSIZE);
72 if (tuh_rhport_is_active(
rhport_))
return true;
83 host().task(0,
false);
91 uint8_t* data)
override {
98 memset(&xfer, 0,
sizeof(xfer));
102 xfer.buffer =
setup.wLength > 0 ? data :
nullptr;
105 return tuh_control_xfer(&xfer);
120 tusb_desc_endpoint_t desc;
121 memset(&desc, 0,
sizeof(desc));
122 desc.bLength =
sizeof(tusb_desc_endpoint_t);
123 desc.bDescriptorType = TUSB_DESC_ENDPOINT;
125 desc.bmAttributes.xfer = TUSB_XFER_ISOCHRONOUS;
126 desc.bmAttributes.sync = ep.
sync;
127 desc.bmAttributes.usage = ep.
usage;
130 if (!tuh_edpt_open(daddr, &desc)) {
153 if (s ==
nullptr || !s->
open)
return;
156 tuh_edpt_abort_xfer(daddr, ep_addr);
157 tuh_edpt_close(daddr, ep_addr);
161 tusb_speed_t sp = tuh_speed_get(
daddr_);
167 uint32_t
millis()
const override {
return tusb_time_millis_api(); }
176 tusb_desc_interface_t
const* itf_desc,
179 if (self ==
nullptr || self->
events_ ==
nullptr)
return 0;
180 if (rhport != self->
rhport_)
return 0;
181 uint16_t vid = 0, pid = 0;
182 tuh_vid_pid_get(daddr, &vid, &pid);
183 const uint8_t* desc = (
const uint8_t*)itf_desc;
184 uint16_t len = self->
events_->
onAttach(daddr, vid, pid, desc, max_len);
185 if (len <
sizeof(tusb_desc_interface_t))
return 0;
188 self->
last_itf_ = itf_desc->bInterfaceNumber;
189 for (
const uint8_t* p = desc; p < desc + len && p[0] > 0; p += p[0]) {
190 if (p[1] == TUSB_DESC_INTERFACE && p[2] > self->
last_itf_)
200 usbh_driver_set_config_complete(daddr, self->
last_itf_);
202 usbh_driver_set_config_complete(daddr, itf_num);
207 static bool driverXfer(uint8_t daddr, uint8_t ep_addr, xfer_result_t result,
208 uint32_t xferred_bytes) {
210 if (self ==
nullptr)
return false;
212 if (s ==
nullptr || !s->
open)
return true;
216 : (uint16_t)xferred_bytes;
219 if (!s->
open)
return true;
230 if (self ==
nullptr)
return;
232 if (s.daddr == daddr) {
264 static Adafruit_USBH_Host default_host;
272 if (s.daddr == daddr && s.ep_addr == ep_addr)
return &s;
296 if (self ==
nullptr || self->
events_ ==
nullptr)
return;
298 (uint16_t)xfer->actual_len);
308 uint8_t* driver_count) {
310 static usbh_class_driver_t
const driver = {
312 USBAudioHostBackendTinyUSB::driverInit,
313 USBAudioHostBackendTinyUSB::driverDeinit,
314 USBAudioHostBackendTinyUSB::driverOpen,
315 USBAudioHostBackendTinyUSB::driverSetConfig,
316 USBAudioHostBackendTinyUSB::driverXfer,
317 USBAudioHostBackendTinyUSB::driverClose,
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define LOGE(...)
Definition AudioLoggerIDF.h:30
usbh_class_driver_t const * usbh_app_driver_get_cb(uint8_t *driver_count)
Definition USBAudioHostBackendTinyUSB.h:307