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)
56 if (map_[id_] ==
this)
62 PCD_HandleTypeDef* hpcd_;
63 stm32_usb_dev_id_t id_;
67#if defined(USB_OTG_FS)
68#if !defined(USB_OTG_FS_TOTAL_FIFO_SIZE)
69#if defined(STM32H7) || defined(STM32N6)
70#define USB_OTG_FS_TOTAL_FIFO_SIZE 4096
72#define USB_OTG_FS_TOTAL_FIFO_SIZE 1280
78class STM32USBDeviceOtgFS :
public STM32USBDevice
94 PCD_HandleTypeDef* hpcd,
size_t rx_fifo_size,
95 const std::initializer_list<LibXR::RawData> RX_EP_CFGS,
96 const std::initializer_list<EPInConfig> TX_EP_CFGS,
97 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
99 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
100 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem*>>
102 ConstRawData uid = {
nullptr, 0});
104 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context)
override;
109#if defined(USB_OTG_HS)
110#if !defined(USB_OTG_HS_TOTAL_FIFO_SIZE)
111#define USB_OTG_HS_TOTAL_FIFO_SIZE 4096
116class STM32USBDeviceOtgHS :
public STM32USBDevice
132 PCD_HandleTypeDef* hpcd,
size_t rx_fifo_size,
133 const std::initializer_list<LibXR::RawData> RX_EP_CFGS,
134 const std::initializer_list<EPInConfig> TX_EP_CFGS,
135 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
137 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
138 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem*>>
140 ConstRawData uid = {
nullptr, 0});
142 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context)
override;
148#if defined(PMA_END_ADDR)
149#define LIBXR_STM32_USB_PMA_SIZE PMA_END_ADDR
151#elif defined(STM32F0)
152#define LIBXR_STM32_USB_PMA_SIZE 1024u
155#elif defined(STM32F102xB) || defined(STM32F102xC) || defined(STM32F103x6) || \
156 defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)
157#define LIBXR_STM32_USB_PMA_SIZE 512u
159#if defined(HAL_CAN_MODULE_ENABLED)
160#error "STM32F102/F103 cannot use CAN at the same time with USB."
164#elif defined(STM32F302xB) || defined(STM32F302xC) || defined(STM32F303xB) || \
165 defined(STM32F303xC) || defined(STM32F373xC)
166#define LIBXR_STM32_USB_PMA_SIZE 512u
171#elif defined(STM32F302x6) || defined(STM32F302x8) || defined(STM32F302xD) || \
172 defined(STM32F302xE) || defined(STM32F303xD) || defined(STM32F303xE)
174#if defined(HAL_CAN_MODULE_ENABLED)
176#define LIBXR_STM32_USB_PMA_SIZE 768u
179#define LIBXR_STM32_USB_PMA_SIZE 1024u
183#elif defined(STM32L0)
184#define LIBXR_STM32_USB_PMA_SIZE 1024u
187#elif defined(STM32L1)
188#define LIBXR_STM32_USB_PMA_SIZE 512u
191#elif defined(STM32G4)
192#define LIBXR_STM32_USB_PMA_SIZE 1024u
195#elif defined(STM32G0)
196#define LIBXR_STM32_USB_PMA_SIZE 2048u
199#elif defined(STM32C0)
200#define LIBXR_STM32_USB_PMA_SIZE 2048u
203#elif defined(STM32H503xx) || defined(STM32H563xx) || defined(STM32H573xx) || \
205#define LIBXR_STM32_USB_PMA_SIZE 2048u
208#elif defined(STM32WB)
209#define LIBXR_STM32_USB_PMA_SIZE 1024u
212#elif defined(STM32L4)
213#define LIBXR_STM32_USB_PMA_SIZE 1024u
216#elif defined(STM32L5)
217#define LIBXR_STM32_USB_PMA_SIZE 1024u
220#elif defined(STM32U5)
221#define LIBXR_STM32_USB_PMA_SIZE 2048u
224#elif defined(STM32U0)
225#define LIBXR_STM32_USB_PMA_SIZE 1024u
228#elif defined(STM32U3)
229#define LIBXR_STM32_USB_PMA_SIZE 2048u
233 "Unknown STM32 USB FS/DRD with PMA. Please define LIBXR_STM32_USB_PMA_SIZE manually."
236class STM32USBDeviceDevFs :
public STM32USBDevice
245 size_t hw_buffer_size1, hw_buffer_size2;
246 bool double_buffer_is_in =
false;
248 EPConfig(
LibXR::RawData buffer,
size_t hw_buffer_size,
bool is_in)
251 hw_buffer_size1(hw_buffer_size),
253 double_buffer_is_in(is_in)
258 size_t hw_buffer_size_in,
size_t hw_buffer_size_out)
259 : buffer1(buffer_in),
261 hw_buffer_size1(hw_buffer_size_in),
262 hw_buffer_size2(hw_buffer_size_out)
273 PCD_HandleTypeDef* hpcd,
const std::initializer_list<EPConfig> EP_CFGS,
274 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
276 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
277 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem*>>
279 ConstRawData uid = {
nullptr, 0});
281 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context)
override;
只读原始数据视图 / Immutable raw data view
可写原始数据视图 / Mutable raw data view
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