5#include <initializer_list>
8#include "esp_intr_alloc.h"
9#include "libxr_type.hpp"
10#include "usb/core/ep_pool.hpp"
11#include "usb/device/dev_core.hpp"
13#if (SOC_USB_OTG_SUPPORTED && defined(CONFIG_IDF_TARGET_ESP32S3) && \
14 CONFIG_IDF_TARGET_ESP32S3) || \
20class ESP32USBEndpoint;
83 const std::initializer_list<EPConfig> ep_cfgs,
86 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> lang_list,
87 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem*>>
94 void Init(
bool in_isr)
override;
115 void Stop(
bool in_isr)
override;
120 static constexpr uint8_t ENDPOINT_COUNT = 7;
121 static constexpr uint8_t IN_ENDPOINT_LIMIT = 5;
122 static constexpr uint32_t INTERRUPT_DISPATCH_GUARD = 64U;
123 static constexpr size_t SETUP_PACKET_BYTES = 8U;
124 static constexpr size_t SETUP_DMA_BUFFER_BYTES = 64U;
131 bool setup_direction_out =
144 USB::Endpoint* out[ENDPOINT_COUNT] =
154 uint16_t depth_words =
158 uint16_t tx_next_words =
160 uint16_t tx_words[ENDPOINT_COUNT] =
163 bool tx_bound[ENDPOINT_COUNT] = {};
165 uint8_t allocated_in = 0U;
174 intr_handle_t intr_handle =
176 void* phy_handle =
nullptr;
177 bool phy_ready =
false;
180 bool started =
false;
181 bool rom_usb_cleaned =
false;
188 static void IRAM_ATTR IsrEntry(
void* arg);
193 bool EnsurePhyReady();
198 bool EnsureInterruptReady();
203 void EnsureRomUsbCleaned();
208 void InitializeCore();
213 void ClearTxFifoRegisters();
223 void ResetFifoState();
228 void ResetDeviceState();
233 void ResetEndpointHardwareState();
238 void ReloadSetupPacketCount();
243 void HandleInterrupt();
248 void HandleBusReset(
bool in_isr);
253 void HandleEndpointInterrupt(
bool in_isr,
bool in_dir);
258 void HandleRxFifoLevel();
263 void ResetControlState();
268 void UpdateSetupState(
const uint8_t* setup);
274 bool LastSetupDirectionOut()
const {
return control_.setup_direction_out; }
279 bool DmaEnabled()
const {
return true; }
284 bool AllocateTxFifo(uint8_t ep_num, uint16_t packet_size,
bool is_bulk,
285 uint16_t& fifo_words);
291 bool EnsureRxFifo(uint16_t packet_size);
293 EndpointMap endpoint_map_ = {};
294 FifoState fifo_state_ =
296 RuntimeState runtime_ =
298 alignas(SETUP_DMA_BUFFER_BYTES) uint8_t setup_packet_[SETUP_DMA_BUFFER_BYTES] =
300 ControlState control_ = {};
只读原始数据视图 / Immutable raw data view
ESP32-S3 USB OTG 设备核心实现 / ESP32-S3 USB OTG device-core implementation.
void Start(bool in_isr) override
启动 USB device controller / Start the USB device controller
void Deinit(bool in_isr) override
去初始化 USB device core 状态 / Deinitialize the USB device-core state
ESP32USBDevice(const std::initializer_list< EPConfig > ep_cfgs, USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid, uint16_t bcd, const std::initializer_list< const USB::DescriptorStrings::LanguagePack * > lang_list, const std::initializer_list< const std::initializer_list< USB::ConfigDescriptorItem * > > configs, ConstRawData uid={nullptr, 0})
构造 ESP32-S3 USB device core / Construct the ESP32-S3 USB device core
void Stop(bool in_isr) override
停止 USB device controller / Stop the USB device controller
void Init(bool in_isr) override
初始化 USB device core 状态 / Initialize the USB device-core state
ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override
在控制传输阶段写入设备地址 / Write the device address during control-transfer sequencing
ESP32-S3 USB endpoint implementation.
可写原始数据视图 / Mutable raw data view
USB 设备协议栈核心:EP0 控制传输、描述符、配置、标准/类/厂商请求 USB device core: EP0 control transfer, descriptors,...
Context
控制传输上下文 / Control transfer context
PacketSize0
控制端点0最大包长度枚举 Packet size for endpoint 0 (bMaxPacketSize0)
USB 端点基类 / USB Endpoint base class.
USB端点池类 / USB endpoint pool class.
LibXR 命名空间 / LibXR namespace.
ErrorCode
定义错误码枚举 / Defines an enumeration for error codes
ESP32-S3 USB endpoint 配置项 / ESP32-S3 USB endpoint configuration entry.
EPConfig(RawData buffer)
使用同一块 buffer 同时生成 IN/OUT endpoint / Create both IN and OUT endpoints from one shared buffer
DirectionHint
该配置项应如何生成 endpoint 方向 / How this config entry should populate endpoint directions
@ BothDirections
同时生成 IN/OUT endpoint / Create both IN and OUT endpoints
@ OutOnly
仅生成 OUT endpoint / Create only the OUT endpoint
@ InOnly
仅生成 IN endpoint / Create only the IN endpoint
EPConfig(RawData buffer, bool is_in)
使用同一块 buffer 生成单方向 endpoint / Create a single-direction endpoint from one shared buffer
DirectionHint direction_hint