diff --git a/USBHost_t36.h b/USBHost_t36.h index 2b96901..bb3a713 100644 --- a/USBHost_t36.h +++ b/USBHost_t36.h @@ -56,7 +56,7 @@ // your best effort to read chapter 4 before asking USB questions! -//#define USBHOST_PRINT_DEBUG +#define USBHOST_PRINT_DEBUG /************************************************/ /* Data Types */ @@ -563,6 +563,7 @@ protected: void send_clearstatus_overcurrent(uint32_t port); void send_clearstatus_reset(uint32_t port); void send_setreset(uint32_t port); + void send_setinterface(); static void callback(const Transfer_t *transfer); void status_change(const Transfer_t *transfer); void new_port_status(uint32_t port, uint32_t status); diff --git a/hub.cpp b/hub.cpp index 77b9bc7..2e660cf 100644 --- a/hub.cpp +++ b/hub.cpp @@ -215,6 +215,14 @@ void USBHub::send_setreset(uint32_t port) } } +void USBHub::send_setinterface() +{ + // assumes not already sending another control transfer + mk_setup(setup, 1, 11, altsetting, interface_number, 0); + queue_Control_Transfer(device, &setup, NULL, this); + sending_control_transfer = 1; +} + static uint32_t lowestbit(uint32_t bitmask) { return __builtin_ctz(bitmask); @@ -234,6 +242,9 @@ void USBHub::control(const Transfer_t *transfer) numports = hub_desc[2]; characteristics = hub_desc[3]; powertime = hub_desc[5]; + if (interface_count > 1) { + send_setinterface(); + } // TODO: do we need to use the DeviceRemovable // bits to make synthetic device connect events? println("Hub ports = ", numports);