ESPHome 2025.6.0
Loading...
Searching...
No Matches
usb_host.h
Go to the documentation of this file.
1#pragma once
2
3// Should not be needed, but it's required to pass CI clang-tidy checks
4#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
6#include <vector>
7#include "usb/usb_host.h"
8
9#include <list>
10
11namespace esphome {
12namespace usb_host {
13
14static const char *const TAG = "usb_host";
15
16// constants for setup packet type
17static const uint8_t USB_RECIP_DEVICE = 0;
18static const uint8_t USB_RECIP_INTERFACE = 1;
19static const uint8_t USB_RECIP_ENDPOINT = 2;
20static const uint8_t USB_TYPE_STANDARD = 0 << 5;
21static const uint8_t USB_TYPE_CLASS = 1 << 5;
22static const uint8_t USB_TYPE_VENDOR = 2 << 5;
23static const uint8_t USB_DIR_MASK = 1 << 7;
24static const uint8_t USB_DIR_IN = 1 << 7;
25static const uint8_t USB_DIR_OUT = 0;
26static const size_t SETUP_PACKET_SIZE = 8;
27
28static const size_t MAX_REQUESTS = 16; // maximum number of outstanding requests possible.
29
30// used to report a transfer status
32 bool success;
33 uint16_t error_code;
34 uint8_t *data;
35 size_t data_len;
36 uint8_t endpoint;
37 void *user_data;
38};
39
40using transfer_cb_t = std::function<void(const TransferStatus &)>;
41
42class USBClient;
43
44// struct used to capture all data needed for a transfer
51
52// callback function type.
53
62class USBClient : public Component {
63 friend class USBHost;
64
65 public:
66 USBClient(uint16_t vid, uint16_t pid) : vid_(vid), pid_(pid) { init_pool(); }
67
68 void init_pool() {
69 this->trq_pool_.clear();
70 for (size_t i = 0; i != MAX_REQUESTS; i++)
71 this->trq_pool_.push_back(&this->requests_[i]);
72 }
73 void setup() override;
74 void loop() override;
75 // setup must happen after the host bus has been setup
76 float get_setup_priority() const override { return setup_priority::IO; }
77 void on_opened(uint8_t addr);
78 void on_removed(usb_device_handle_t handle);
79 void control_transfer_callback(const usb_transfer_t *xfer) const;
80 void transfer_in(uint8_t ep_address, const transfer_cb_t &callback, uint16_t length);
81 void transfer_out(uint8_t ep_address, const transfer_cb_t &callback, const uint8_t *data, uint16_t length);
82 void dump_config() override;
84 bool control_transfer(uint8_t type, uint8_t request, uint16_t value, uint16_t index, const transfer_cb_t &callback,
85 const std::vector<uint8_t> &data = {});
86
87 protected:
88 bool register_();
90 virtual void disconnect();
91 virtual void on_connected() {}
92 virtual void on_disconnected() { this->init_pool(); }
93
94 usb_host_client_handle_t handle_{};
95 usb_device_handle_t device_handle_{};
96 int device_addr_{-1};
98 uint16_t vid_{};
99 uint16_t pid_{};
100 std::list<TransferRequest *> trq_pool_{};
101 TransferRequest requests_[MAX_REQUESTS]{};
102};
103class USBHost : public Component {
104 public:
105 float get_setup_priority() const override { return setup_priority::BUS; }
106 void loop() override;
107 void setup() override;
108
109 protected:
110 std::vector<USBClient *> clients_{};
111};
112
113} // namespace usb_host
114} // namespace esphome
115
116#endif // USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3
USBClient(uint16_t vid, uint16_t pid)
Definition usb_host.h:66
usb_host_client_handle_t handle_
Definition usb_host.h:94
TransferRequest requests_[MAX_REQUESTS]
Definition usb_host.h:101
void transfer_in(uint8_t ep_address, const transfer_cb_t &callback, uint16_t length)
Performs a transfer input operation.
void transfer_out(uint8_t ep_address, const transfer_cb_t &callback, const uint8_t *data, uint16_t length)
Performs an output transfer operation.
float get_setup_priority() const override
Definition usb_host.h:76
std::list< TransferRequest * > trq_pool_
Definition usb_host.h:100
void control_transfer_callback(const usb_transfer_t *xfer) const
void release_trq(TransferRequest *trq)
virtual void on_connected()
Definition usb_host.h:91
virtual void on_disconnected()
Definition usb_host.h:92
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={})
void on_removed(usb_device_handle_t handle)
usb_device_handle_t device_handle_
Definition usb_host.h:95
std::vector< USBClient * > clients_
Definition usb_host.h:110
float get_setup_priority() const override
Definition usb_host.h:105
uint8_t type
const float BUS
For communication buses like i2c/spi.
Definition component.cpp:17
const float IO
For components that represent GPIO pins like PCF8573.
Definition component.cpp:18
std::function< void(const TransferStatus &)> transfer_cb_t
Definition usb_host.h:40
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
uint16_t length
Definition tt21100.cpp:0