ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
tinyusb_component.h
Go to the documentation of this file.
1#pragma once
2#if defined(USE_ESP32_VARIANT_ESP32P4) || defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) || \
3 defined(USE_ESP32_VARIANT_ESP32S31) || defined(USE_ESP32_VARIANT_ESP32H4)
6
7#include <utility>
8#include "tinyusb.h"
9#include "tusb.h"
10
11namespace esphome::tinyusb {
12
22
23static const char *const DEFAULT_USB_STR = "ESPHome";
24
25class TinyUSB final : public Component {
26 public:
27 void setup() override;
28 void loop() override;
29 void dump_config() override;
30 float get_setup_priority() const override { return setup_priority::BUS; }
31
33 bool is_mounted() const { return tud_mounted(); }
35 template<typename F> void add_on_mount_state_callback(F &&callback) {
36 this->mount_state_callback_.add(std::forward<F>(callback));
37 }
38
39 void set_usb_desc_product_id(uint16_t product_id) { this->usb_descriptor_.idProduct = product_id; }
40 void set_usb_desc_vendor_id(uint16_t vendor_id) { this->usb_descriptor_.idVendor = vendor_id; }
41 void set_usb_desc_lang_id(uint16_t lang_id) {
42 this->usb_desc_lang_id_[0] = lang_id & 0xFF;
43 this->usb_desc_lang_id_[1] = lang_id >> 8;
44 }
45 void set_usb_desc_manufacturer(const char *usb_desc_manufacturer) {
46 this->string_descriptor_[MANUFACTURER] = usb_desc_manufacturer;
47 }
48 void set_usb_desc_product(const char *usb_desc_product) { this->string_descriptor_[PRODUCT] = usb_desc_product; }
49 void set_usb_desc_serial(const char *usb_desc_serial) { this->string_descriptor_[SERIAL_NUMBER] = usb_desc_serial; }
51 void set_vbus_monitor_pin(int pin) { this->vbus_monitor_pin_ = static_cast<int8_t>(pin); }
53 void set_full_speed_config(const uint8_t *descriptor) { this->tusb_cfg_.descriptor.full_speed_config = descriptor; }
54
55 protected:
56 char usb_desc_lang_id_[2] = {0x09, 0x04}; // defaults to english
57
58 const char *string_descriptor_[SIZE] = {
59 this->usb_desc_lang_id_, // 0: supported language is English (0x0409)
60 DEFAULT_USB_STR, // 1: Manufacturer
61 DEFAULT_USB_STR, // 2: Product
62 nullptr, // 3: Serial Number
63 nullptr, // 4: Interface
64 nullptr, // 5: Terminator
65 };
66
68 // Edge-detection baseline for loop(); is_mounted() reads the live state instead.
71
72 tinyusb_config_t tusb_cfg_{};
73 tusb_desc_device_t usb_descriptor_{
74 .bLength = sizeof(tusb_desc_device_t),
75 .bDescriptorType = TUSB_DESC_DEVICE,
76 .bcdUSB = 0x0200,
77 .bDeviceClass = TUSB_CLASS_MISC,
78 .bDeviceSubClass = MISC_SUBCLASS_COMMON,
79 .bDeviceProtocol = MISC_PROTOCOL_IAD,
80 .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,
81 .idVendor = 0x303A,
82 .idProduct = 0x4001,
83 .bcdDevice = CONFIG_TINYUSB_DESC_BCD_DEVICE,
84 .iManufacturer = 1,
85 .iProduct = 2,
86 .iSerialNumber = 3,
87 .bNumConfigurations = 1,
88 };
89};
90
91} // namespace esphome::tinyusb
92#endif // USE_ESP32_VARIANT_ESP32P4 || USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3 ||
93 // USE_ESP32_VARIANT_ESP32S31 || USE_ESP32_VARIANT_ESP32H4
void set_usb_desc_serial(const char *usb_desc_serial)
void set_usb_desc_product(const char *usb_desc_product)
void set_usb_desc_lang_id(uint16_t lang_id)
const char * string_descriptor_[SIZE]
void set_usb_desc_vendor_id(uint16_t vendor_id)
tusb_desc_device_t usb_descriptor_
void add_on_mount_state_callback(F &&callback)
Called with the new mount state whenever a host mounts or unmounts the device.
float get_setup_priority() const override
LazyCallbackManager< void(bool)> mount_state_callback_
void set_vbus_monitor_pin(int pin)
Self-powered device: watch VBUS on this GPIO so a cable pull becomes a detach.
void set_usb_desc_product_id(uint16_t product_id)
bool is_mounted() const
True while a USB host has enumerated and configured the device.
void set_usb_desc_manufacturer(const char *usb_desc_manufacturer)
void set_full_speed_config(const uint8_t *descriptor)
Configuration descriptor from a class component that esp_tinyusb has no built-in default for (HID).
constexpr float BUS
For communication buses like i2c/spi.
Definition component.h:39