3#include "double_buffer.hpp"
5#include "stm32_usb.hpp"
6#include "stm32_usb_ep.hpp"
7#include "usb/core/ep_pool.hpp"
8#include "usb/device/dev_core.hpp"
10#if defined(HAL_PCD_MODULE_ENABLED)
13stm32_usb_dev_id_t STM32USBDeviceGetID(PCD_HandleTypeDef* hpcd);
22 PCD_HandleTypeDef* hpcd, stm32_usb_dev_id_t
id,
size_t max_ep_num,
25 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
26 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem*>>
29 USB::USBSpec spec = USB::USBSpec::USB_2_0)
43 void Start()
override { HAL_PCD_Start(hpcd_); }
44 void Stop()
override { HAL_PCD_Stop(hpcd_); }
46 PCD_HandleTypeDef* hpcd_;
47 stm32_usb_dev_id_t id_;
51#if defined(USB_OTG_FS)
52#if !defined(USB_OTG_FS_TOTAL_FIFO_SIZE)
53#if defined(STM32H7) || defined(STM32N6)
54#define USB_OTG_FS_TOTAL_FIFO_SIZE 4096
56#define USB_OTG_FS_TOTAL_FIFO_SIZE 1280
59class STM32USBDeviceOtgFS :
public STM32USBDevice
69 PCD_HandleTypeDef* hpcd,
size_t rx_fifo_size,
70 const std::initializer_list<LibXR::RawData> RX_EP_CFGS,
71 const std::initializer_list<EPInConfig> TX_EP_CFGS,
72 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
74 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
75 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem*>>
77 ConstRawData uid = {
nullptr, 0});
79 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context)
override;
84#if defined(USB_OTG_HS)
85#if !defined(USB_OTG_HS_TOTAL_FIFO_SIZE)
86#define USB_OTG_HS_TOTAL_FIFO_SIZE 4096
88class STM32USBDeviceOtgHS :
public STM32USBDevice
98 PCD_HandleTypeDef* hpcd,
size_t rx_fifo_size,
99 const std::initializer_list<LibXR::RawData> RX_EP_CFGS,
100 const std::initializer_list<EPInConfig> TX_EP_CFGS,
101 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
103 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
104 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem*>>
106 ConstRawData uid = {
nullptr, 0});
108 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context)
override;
114#if defined (PMA_END_ADDR)
115#define LIBXR_STM32_USB_PMA_SIZE PMA_END_ADDR
117#elif defined(STM32F0)
118#define LIBXR_STM32_USB_PMA_SIZE 1024u
121#elif defined(STM32F102xB) || defined(STM32F102xC) || defined(STM32F103x6) || \
122 defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)
123#define LIBXR_STM32_USB_PMA_SIZE 512u
125#if defined(HAL_CAN_MODULE_ENABLED)
126#error "STM32F102/F103 cannot use CAN at the same time with USB."
130#elif defined(STM32F302xB) || defined(STM32F302xC) || defined(STM32F303xB) || \
131 defined(STM32F303xC) || defined(STM32F373xC)
132#define LIBXR_STM32_USB_PMA_SIZE 512u
137#elif defined(STM32F302x6) || defined(STM32F302x8) || defined(STM32F302xD) || \
138 defined(STM32F302xE) || defined(STM32F303xD) || defined(STM32F303xE)
140#if defined(HAL_CAN_MODULE_ENABLED)
142#define LIBXR_STM32_USB_PMA_SIZE 768u
145#define LIBXR_STM32_USB_PMA_SIZE 1024u
149#elif defined(STM32L0)
150#define LIBXR_STM32_USB_PMA_SIZE 1024u
153#elif defined(STM32L1)
154#define LIBXR_STM32_USB_PMA_SIZE 512u
157#elif defined(STM32G4)
158#define LIBXR_STM32_USB_PMA_SIZE 1024u
161#elif defined(STM32G0)
162#define LIBXR_STM32_USB_PMA_SIZE 2048u
165#elif defined(STM32C0)
166#define LIBXR_STM32_USB_PMA_SIZE 2048u
169#elif defined(STM32H503xx) || defined(STM32H563xx) || defined(STM32H573xx) || \
171#define LIBXR_STM32_USB_PMA_SIZE 2048u
174#elif defined(STM32WB)
175#define LIBXR_STM32_USB_PMA_SIZE 1024u
178#elif defined(STM32L4)
179#define LIBXR_STM32_USB_PMA_SIZE 1024u
182#elif defined(STM32L5)
183#define LIBXR_STM32_USB_PMA_SIZE 1024u
186#elif defined(STM32U5)
187#define LIBXR_STM32_USB_PMA_SIZE 2048u
190#elif defined(STM32U0)
191#define LIBXR_STM32_USB_PMA_SIZE 1024u
194#elif defined(STM32U3)
195#define LIBXR_STM32_USB_PMA_SIZE 2048u
199 "Unknown STM32 USB FS/DRD with PMA. Please define LIBXR_STM32_USB_PMA_SIZE manually."
202class STM32USBDeviceDevFs :
public STM32USBDevice
208 size_t hw_buffer_size1, hw_buffer_size2;
209 bool double_buffer =
false;
210 bool double_buffer_is_in =
false;
212 EPConfig(
LibXR::RawData buffer,
size_t hw_buffer_size,
bool is_in)
215 hw_buffer_size1(hw_buffer_size),
217 double_buffer_is_in(is_in)
222 size_t hw_buffer_size_in,
size_t hw_buffer_size_out)
223 : buffer1(buffer_in),
225 hw_buffer_size1(hw_buffer_size_in),
226 hw_buffer_size2(hw_buffer_size_out)
234 PCD_HandleTypeDef* hpcd,
const std::initializer_list<EPConfig> EP_CFGS,
235 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
237 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
238 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem*>>
240 ConstRawData uid = {
nullptr, 0});
242 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context)
override;
常量原始数据封装类。 A class for encapsulating constant raw data.
原始数据封装类。 A class for encapsulating raw data.
void Deinit() override
反初始化 USB 设备 / Deinitialize USB device
void Start() override
启动 USB 设备 / Start USB device
void Stop() override
停止 USB 设备 / Stop USB device
void Init() override
初始化 USB 设备 / Initialize USB device
USB 设备协议栈核心类,负责端点 0 控制传输及配置、描述符、标准请求处理等。 USB device protocol stack core class. Handles EP0 control tr...
virtual void Deinit()
反初始化 USB 设备 / Deinitialize USB device
Speed speed
当前速度 / Current speed
virtual void Init()
初始化 USB 设备 / Initialize USB device
PacketSize0
控制端点0最大包长度枚举 Packet size for endpoint 0 (bMaxPacketSize0)
USB端点池类 / USB endpoint pool class.