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);
28 PCD_HandleTypeDef* hpcd, stm32_usb_dev_id_t
id,
size_t max_ep_num,
31 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
32 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem*>>
35 USB::USBSpec spec = USB::USBSpec::USB_2_1)
49 void Start(
bool)
override { HAL_PCD_Start(hpcd_); }
50 void Stop(
bool)
override { HAL_PCD_Stop(hpcd_); }
52 PCD_HandleTypeDef* hpcd_;
53 stm32_usb_dev_id_t id_;
57#if defined(USB_OTG_FS)
58#if !defined(USB_OTG_FS_TOTAL_FIFO_SIZE)
59#if defined(STM32H7) || defined(STM32N6)
60#define USB_OTG_FS_TOTAL_FIFO_SIZE 4096
62#define USB_OTG_FS_TOTAL_FIFO_SIZE 1280
68class STM32USBDeviceOtgFS :
public STM32USBDevice
84 PCD_HandleTypeDef* hpcd,
size_t rx_fifo_size,
85 const std::initializer_list<LibXR::RawData> RX_EP_CFGS,
86 const std::initializer_list<EPInConfig> TX_EP_CFGS,
87 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
89 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
90 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem*>>
92 ConstRawData uid = {
nullptr, 0});
94 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context)
override;
99#if defined(USB_OTG_HS)
100#if !defined(USB_OTG_HS_TOTAL_FIFO_SIZE)
101#define USB_OTG_HS_TOTAL_FIFO_SIZE 4096
106class STM32USBDeviceOtgHS :
public STM32USBDevice
122 PCD_HandleTypeDef* hpcd,
size_t rx_fifo_size,
123 const std::initializer_list<LibXR::RawData> RX_EP_CFGS,
124 const std::initializer_list<EPInConfig> TX_EP_CFGS,
125 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
127 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
128 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem*>>
130 ConstRawData uid = {
nullptr, 0});
132 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context)
override;
138#if defined(PMA_END_ADDR)
139#define LIBXR_STM32_USB_PMA_SIZE PMA_END_ADDR
141#elif defined(STM32F0)
142#define LIBXR_STM32_USB_PMA_SIZE 1024u
145#elif defined(STM32F102xB) || defined(STM32F102xC) || defined(STM32F103x6) || \
146 defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)
147#define LIBXR_STM32_USB_PMA_SIZE 512u
149#if defined(HAL_CAN_MODULE_ENABLED)
150#error "STM32F102/F103 cannot use CAN at the same time with USB."
154#elif defined(STM32F302xB) || defined(STM32F302xC) || defined(STM32F303xB) || \
155 defined(STM32F303xC) || defined(STM32F373xC)
156#define LIBXR_STM32_USB_PMA_SIZE 512u
161#elif defined(STM32F302x6) || defined(STM32F302x8) || defined(STM32F302xD) || \
162 defined(STM32F302xE) || defined(STM32F303xD) || defined(STM32F303xE)
164#if defined(HAL_CAN_MODULE_ENABLED)
166#define LIBXR_STM32_USB_PMA_SIZE 768u
169#define LIBXR_STM32_USB_PMA_SIZE 1024u
173#elif defined(STM32L0)
174#define LIBXR_STM32_USB_PMA_SIZE 1024u
177#elif defined(STM32L1)
178#define LIBXR_STM32_USB_PMA_SIZE 512u
181#elif defined(STM32G4)
182#define LIBXR_STM32_USB_PMA_SIZE 1024u
185#elif defined(STM32G0)
186#define LIBXR_STM32_USB_PMA_SIZE 2048u
189#elif defined(STM32C0)
190#define LIBXR_STM32_USB_PMA_SIZE 2048u
193#elif defined(STM32H503xx) || defined(STM32H563xx) || defined(STM32H573xx) || \
195#define LIBXR_STM32_USB_PMA_SIZE 2048u
198#elif defined(STM32WB)
199#define LIBXR_STM32_USB_PMA_SIZE 1024u
202#elif defined(STM32L4)
203#define LIBXR_STM32_USB_PMA_SIZE 1024u
206#elif defined(STM32L5)
207#define LIBXR_STM32_USB_PMA_SIZE 1024u
210#elif defined(STM32U5)
211#define LIBXR_STM32_USB_PMA_SIZE 2048u
214#elif defined(STM32U0)
215#define LIBXR_STM32_USB_PMA_SIZE 1024u
218#elif defined(STM32U3)
219#define LIBXR_STM32_USB_PMA_SIZE 2048u
223 "Unknown STM32 USB FS/DRD with PMA. Please define LIBXR_STM32_USB_PMA_SIZE manually."
226class STM32USBDeviceDevFs :
public STM32USBDevice
235 size_t hw_buffer_size1, hw_buffer_size2;
236 bool double_buffer_is_in =
false;
238 EPConfig(
LibXR::RawData buffer,
size_t hw_buffer_size,
bool is_in)
241 hw_buffer_size1(hw_buffer_size),
243 double_buffer_is_in(is_in)
248 size_t hw_buffer_size_in,
size_t hw_buffer_size_out)
249 : buffer1(buffer_in),
251 hw_buffer_size1(hw_buffer_size_in),
252 hw_buffer_size2(hw_buffer_size_out)
263 PCD_HandleTypeDef* hpcd,
const std::initializer_list<EPConfig> EP_CFGS,
264 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
266 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
267 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem*>>
269 ConstRawData uid = {
nullptr, 0});
271 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context)
override;
常量原始数据封装类。 A class for encapsulating constant raw data.
原始数据封装类。 A class for encapsulating raw data.
STM32 USB 设备核心实现 / STM32 USB device core implementation.
STM32USBDevice(PCD_HandleTypeDef *hpcd, stm32_usb_dev_id_t id, size_t max_ep_num, 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}, USB::Speed speed=USB::Speed::FULL, USB::USBSpec spec=USB::USBSpec::USB_2_1)
构造 USB 设备核心对象 / Construct USB device core object
void Init(bool in_isr) override
初始化 / Initialize
void Stop(bool) override
停止设备(由子类实现)/ Stop device (implemented by derived class)
void Deinit(bool in_isr) override
反初始化 / Deinitialize
void Start(bool) override
启动设备(由子类实现)/ Start device (implemented by derived class)
USB 设备协议栈核心:EP0 控制传输、描述符、配置、标准/类/厂商请求 USB device core: EP0 control transfer, descriptors,...
virtual void Deinit(bool in_isr)
反初始化 / Deinitialize
virtual void Init(bool in_isr)
初始化 / Initialize
DeviceCore(EndpointPool &ep_pool, USBSpec spec, Speed speed, DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid, uint16_t bcd, const std::initializer_list< const DescriptorStrings::LanguagePack * > &lang_list, const std::initializer_list< const std::initializer_list< ConfigDescriptorItem * > > &configs, ConstRawData uid={nullptr, 0})
构造函数 / Constructor
Speed speed
设备速度 / Device speed
PacketSize0
控制端点0最大包长度枚举 Packet size for endpoint 0 (bMaxPacketSize0)
USB端点池类 / USB endpoint pool class.
EndpointPool(size_t endpoint_num)
构造函数 / Constructor