4#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32P4)
8#include "usb/usb_host.h"
9#include <freertos/FreeRTOS.h>
10#include <freertos/task.h>
40static const char *
const TAG =
"usb_host";
47static const uint8_t USB_RECIP_DEVICE = 0;
48static const uint8_t USB_RECIP_INTERFACE = 1;
49static const uint8_t USB_RECIP_ENDPOINT = 2;
50static const uint8_t USB_TYPE_STANDARD = 0 << 5;
51static const uint8_t USB_TYPE_CLASS = 1 << 5;
52static const uint8_t USB_TYPE_VENDOR = 2 << 5;
53static const uint8_t USB_DIR_MASK = 1 << 7;
54static const uint8_t USB_DIR_IN = 1 << 7;
55static const uint8_t USB_DIR_OUT = 0;
56static const size_t SETUP_PACKET_SIZE = 8;
58static constexpr size_t MAX_REQUESTS = USB_HOST_MAX_REQUESTS;
59static_assert(MAX_REQUESTS >= 1 && MAX_REQUESTS <= 32,
"MAX_REQUESTS must be between 1 and 32");
67using trq_bitmask_t = std::conditional<(MAX_REQUESTS <= 16), uint16_t, uint32_t>::type;
68static constexpr trq_bitmask_t ALL_REQUESTS_IN_USE = MAX_REQUESTS == 32 ? ~0 : (1 << MAX_REQUESTS) - 1;
70static constexpr size_t USB_EVENT_QUEUE_SIZE = 32;
71static constexpr size_t USB_TASK_STACK_SIZE = 4096;
72static constexpr UBaseType_t USB_TASK_PRIORITY = 5;
131 void setup()
override;
132 void loop()
override;
143 const std::vector<uint8_t> &data = {});
181 void loop()
override;
182 void setup()
override;
TransferRequest * get_trq_()
USBClient(uint16_t vid, uint16_t pid)
trq_bitmask_t get_trq_in_use() const
usb_host_client_handle_t handle_
void on_opened(uint8_t addr)
TransferRequest requests_[MAX_REQUESTS]
float get_setup_priority() const override
bool transfer_out(uint8_t ep_address, const transfer_cb_t &callback, const uint8_t *data, uint16_t length)
Performs an output transfer operation.
void dump_config() override
void release_trq(TransferRequest *trq)
static void usb_task_fn(void *arg)
virtual void on_connected()
virtual void disconnect()
TaskHandle_t usb_task_handle_
EventPool< UsbEvent, USB_EVENT_QUEUE_SIZE > event_pool
virtual void on_disconnected()
bool control_transfer(uint8_t type, uint8_t request, uint16_t value, uint16_t index, const transfer_cb_t &callback, const std::vector< uint8_t > &data={})
bool transfer_in(uint8_t ep_address, const transfer_cb_t &callback, uint16_t length)
Performs a transfer input operation.
void on_removed(usb_device_handle_t handle)
usb_device_handle_t device_handle_
void usb_task_loop() const
std::atomic< trq_bitmask_t > trq_in_use_
LockFreeQueue< UsbEvent, USB_EVENT_QUEUE_SIZE > event_queue
std::vector< USBClient * > clients_
float get_setup_priority() const override
const float BUS
For communication buses like i2c/spi.
const float IO
For components that represent GPIO pins like PCF8573.
std::conditional<(MAX_REQUESTS<=16), uint16_t, uint32_t >::type trq_bitmask_t
std::function< void(const TransferStatus &)> transfer_cb_t
Providing packet encoding functions for exchanging data with a remote host.
usb_transfer_t * transfer
union esphome::usb_host::UsbEvent::@159 data
usb_device_handle_t handle
struct esphome::usb_host::UsbEvent::@159::@161 device_gone
struct esphome::usb_host::UsbEvent::@159::@160 device_new