6#include "AudioLogger.h"
9#include "esp_intr_alloc.h"
11#include "freertos/FreeRTOS.h"
12#include "freertos/task.h"
13#include "usb/usb_host.h"
45 usb_host_client_deregister(
client_);
55 usb_host_client_config_t client_cfg;
56 memset(&client_cfg, 0,
sizeof(client_cfg));
57 client_cfg.is_synchronous =
false;
58 client_cfg.max_num_event_msg = 5;
59 client_cfg.async.client_event_callback =
clientEvent;
60 client_cfg.async.callback_arg =
this;
61 esp_err_t rc = usb_host_client_register(&client_cfg, &
client_);
63 LOGE(
"usb_host_client_register: %s", esp_err_to_name(rc));
72 LOGE(
"usb_host_transfer_alloc: %s", esp_err_to_name(rc));
91 usb_host_client_handle_events(
client_, 1);
95 uint8_t* data)
override {
99 usb_setup_packet_t* pkt = (usb_setup_packet_t*)
ctrl_xfer_->data_buffer;
100 pkt->bmRequestType =
setup.bmRequestType;
101 pkt->bRequest =
setup.bRequest;
102 pkt->wValue =
setup.wValue;
103 pkt->wIndex =
setup.wIndex;
104 pkt->wLength =
setup.wLength;
105 bool is_in = (
setup.bmRequestType & 0x80) != 0;
106 if (!is_in &&
setup.wLength > 0 && data !=
nullptr)
118 LOGW(
"usb_host_transfer_submit_control: %s", esp_err_to_name(rc));
127 if (
dev_ ==
nullptr || daddr !=
daddr_)
return false;
129 if (claimed !=
nullptr && claimed->
claimed && claimed->
alt != alt) {
132 if (alt != 0 && (claimed ==
nullptr || !claimed->
claimed)) {
133 esp_err_t rc = usb_host_interface_claim(
client_,
dev_, itf, alt);
135 LOGE(
"usb_host_interface_claim %d/%d: %s", itf, alt,
136 esp_err_to_name(rc));
139 if (claimed ==
nullptr) {
158 if (
dev_ ==
nullptr || daddr !=
daddr_)
return false;
174 usb_transfer_t* xfer =
nullptr;
175 esp_err_t rc = usb_host_transfer_alloc(
178 LOGE(
"usb_host_transfer_alloc: %s", esp_err_to_name(rc));
182 xfer->device_handle =
dev_;
185 xfer->context =
this;
196 if (s ==
nullptr || !s->
open)
return;
198 if (
dev_ ==
nullptr)
return;
200 usb_host_endpoint_halt(
dev_, ep_addr);
201 usb_host_endpoint_flush(
dev_, ep_addr);
202 usb_host_endpoint_clear(
dev_, ep_addr);
207 usb_device_info_t info;
215 return (uint32_t)(esp_timer_get_time() / 1000);
241 usb_device_handle_t
dev_ =
nullptr;
253 usb_host_config_t host_cfg;
254 memset(&host_cfg, 0,
sizeof(host_cfg));
255 host_cfg.skip_phy_setup =
false;
256 host_cfg.intr_flags = ESP_INTR_FLAG_LEVEL1;
257 esp_err_t rc = usb_host_install(&host_cfg);
258 if (rc == ESP_ERR_INVALID_STATE) {
259 LOGI(
"USB host library is already installed");
260 }
else if (rc != ESP_OK) {
261 LOGE(
"usb_host_install: %s", esp_err_to_name(rc));
264 xTaskCreate(
libraryTask,
"usb_host_lib", 4096,
nullptr, 5,
275 if (flags & USB_HOST_LIB_EVENT_FLAGS_NO_CLIENTS) {
276 usb_host_device_free_all();
281 static void clientEvent(
const usb_host_client_event_msg_t* msg,
void* arg) {
283 switch (msg->event) {
284 case USB_HOST_CLIENT_EVENT_NEW_DEV:
287 case USB_HOST_CLIENT_EVENT_DEV_GONE:
288 if (msg->dev_gone.dev_hdl == self->
dev_) {
289 uint8_t daddr = self->
daddr_;
303 usb_device_handle_t dev =
nullptr;
304 if (usb_host_device_open(
client_, address, &dev) != ESP_OK)
return;
305 const usb_device_desc_t* dev_desc =
nullptr;
306 const usb_config_desc_t* cfg_desc =
nullptr;
307 if (usb_host_get_device_descriptor(dev, &dev_desc) != ESP_OK ||
308 usb_host_get_active_config_descriptor(dev, &cfg_desc) != ESP_OK) {
309 usb_host_device_close(
client_, dev);
312 const uint8_t* start = (
const uint8_t*)cfg_desc;
313 const uint8_t*
end = start + cfg_desc->wTotalLength;
317 bool accepted =
false;
318 for (
const uint8_t* p = start; p + 2 <=
end && p[0] >= 2; p += p[0]) {
322 dev_desc->idProduct, p,
323 (uint16_t)(
end - p));
332 usb_host_device_close(
client_, dev);
340 if (
dev_ ==
nullptr)
return;
345 if (itf.claimed) usb_host_interface_release(
client_,
dev_, itf.itf);
358 if (s.ep_addr == ep_addr)
return &s;
365 for (
auto t : s.transfers) {
366 if (t == xfer)
return &s;
374 if (i.itf == itf)
return &i;
383 esp_err_t rc = usb_host_interface_release(
client_,
dev_, itf.
itf);
385 LOGI(
"usb_host_interface_release %d: %s", itf.
itf, esp_err_to_name(rc));
393 for (
auto t : s.
transfers) usb_host_transfer_free(t);
399 for (
int j = 0; j < s.
packets; j++) {
406 xfer->isoc_packet_desc[j].num_bytes = len;
409 xfer->num_bytes = total;
410 if (usb_host_transfer_submit(xfer) == ESP_OK) {
413 LOGW(
"usb_host_transfer_submit 0x%x failed", s.
ep_addr);
420 if (s ==
nullptr)
return;
422 if (!s->
open || self->
dev_ ==
nullptr) {
427 xfer->status == USB_TRANSFER_STATUS_COMPLETED) {
429 for (
int j = 0; j < s->
packets; j++) {
430 usb_isoc_packet_desc_t& pd = xfer->isoc_packet_desc[j];
431 if (pd.status != USB_TRANSFER_STATUS_COMPLETED)
continue;
433 (uint16_t)pd.actual_num_bytes);
436 if (xfer->status == USB_TRANSFER_STATUS_NO_DEVICE)
return;
442 bool ok = xfer->status == USB_TRANSFER_STATUS_COMPLETED;
444 if (ok && xfer->actual_num_bytes > 8) {
445 len = (uint16_t)(xfer->actual_num_bytes - 8);
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define portMAX_DELAY
Definition BufferBlocking.h:14