libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
stm32_usb_dev.hpp
1#pragma once
2
3#include "double_buffer.hpp"
4#include "main.h"
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"
9
10#if defined(HAL_PCD_MODULE_ENABLED)
11
12// NOLINTNEXTLINE
13stm32_usb_dev_id_t STM32USBDeviceGetID(PCD_HandleTypeDef* hpcd);
14
15namespace LibXR
16{
17
22{
23 public:
28 PCD_HandleTypeDef* hpcd, stm32_usb_dev_id_t id, size_t max_ep_num,
29 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
30 uint16_t bcd,
31 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
32 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
33 CONFIGS,
34 ConstRawData uid = {nullptr, 0}, USB::Speed speed = USB::Speed::FULL,
35 USB::USBSpec spec = USB::USBSpec::USB_2_1)
36 : LibXR::USB::EndpointPool(max_ep_num),
37 LibXR::USB::DeviceCore(*this, spec, speed, packet_size, vid, pid, bcd, LANG_LIST,
38 CONFIGS, uid),
39 hpcd_(hpcd),
40 id_(id)
41 {
42 }
43
44 void Init(bool in_isr) override { LibXR::USB::DeviceCore::Init(in_isr); }
45
46 void Deinit(bool in_isr) override { LibXR::USB::DeviceCore::Deinit(in_isr); }
47
48 void Start(bool) override
49 {
50 map_[id_] = this;
51 HAL_PCD_Start(hpcd_);
52 }
53 void Stop(bool) override
54 {
55 HAL_PCD_Stop(hpcd_);
56 if (map_[id_] == this)
57 {
58 map_[id_] = nullptr;
59 }
60 }
61
62 PCD_HandleTypeDef* hpcd_;
63 stm32_usb_dev_id_t id_;
64 static inline STM32USBDevice* map_[STM32_USB_DEV_ID_NUM] = {};
65};
66
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
71#else
72#define USB_OTG_FS_TOTAL_FIFO_SIZE 1280
73#endif
74#endif
78class STM32USBDeviceOtgFS : public STM32USBDevice
79{
80 public:
84 struct EPInConfig
85 {
86 LibXR::RawData buffer;
87 size_t fifo_size;
88 };
89
93 STM32USBDeviceOtgFS(
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,
98 uint16_t bcd,
99 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
100 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
101 CONFIGS,
102 ConstRawData uid = {nullptr, 0});
103
104 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override;
105};
106
107#endif
108
109#if defined(USB_OTG_HS)
110#if !defined(USB_OTG_HS_TOTAL_FIFO_SIZE)
111#define USB_OTG_HS_TOTAL_FIFO_SIZE 4096
112#endif
116class STM32USBDeviceOtgHS : public STM32USBDevice
117{
118 public:
122 struct EPInConfig
123 {
124 LibXR::RawData buffer;
125 size_t fifo_size;
126 };
127
131 STM32USBDeviceOtgHS(
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,
136 uint16_t bcd,
137 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
138 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
139 CONFIGS,
140 ConstRawData uid = {nullptr, 0});
141
142 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override;
143};
144#endif
145
146#if defined(USB_BASE)
147
148#if defined(PMA_END_ADDR)
149#define LIBXR_STM32_USB_PMA_SIZE PMA_END_ADDR
150// --- F0: USB FS Device, PMA = 1024B (dedicated) -------------------------
151#elif defined(STM32F0)
152#define LIBXR_STM32_USB_PMA_SIZE 1024u
153
154// --- F1: F102/F103 USB FS Device, PMA = 512B,与 CAN 共用,不能并行使用 ---
155#elif defined(STM32F102xB) || defined(STM32F102xC) || defined(STM32F103x6) || \
156 defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)
157#define LIBXR_STM32_USB_PMA_SIZE 512u
158
159#if defined(HAL_CAN_MODULE_ENABLED)
160#error "STM32F102/F103 cannot use CAN at the same time with USB."
161#endif
162
163// --- F3 小容量带 USB :PMA = 512B,专用给 USB --------------------
164#elif defined(STM32F302xB) || defined(STM32F302xC) || defined(STM32F303xB) || \
165 defined(STM32F303xC) || defined(STM32F373xC)
166#define LIBXR_STM32_USB_PMA_SIZE 512u
167
168// --- F3 大容量(和 CAN 共享 1KB)的几种:F302x6/8,D/E & F303xD/E -------
169// - 总共 1KB USB+CAN SRAM
170// - 若 CAN 在用:USB 只能用前 768B,最后 256B 给 CAN
171#elif defined(STM32F302x6) || defined(STM32F302x8) || defined(STM32F302xD) || \
172 defined(STM32F302xE) || defined(STM32F303xD) || defined(STM32F303xE)
173
174#if defined(HAL_CAN_MODULE_ENABLED)
175// 给 USB 768B
176#define LIBXR_STM32_USB_PMA_SIZE 768u
177#else
178// 整 1KB 给 USB
179#define LIBXR_STM32_USB_PMA_SIZE 1024u
180#endif
181
182// --- L0: USB FS Device, PMA = 1024B (dedicated) -------------------------
183#elif defined(STM32L0)
184#define LIBXR_STM32_USB_PMA_SIZE 1024u
185
186// --- L1: USB FS Device, PMA = 512B (dedicated) --------------------------
187#elif defined(STM32L1)
188#define LIBXR_STM32_USB_PMA_SIZE 512u
189
190// --- G4: USB FS Device (V1), PMA = 1024B (dedicated) --------------------
191#elif defined(STM32G4)
192#define LIBXR_STM32_USB_PMA_SIZE 1024u
193
194// --- G0: USB_DRD_FS (V2), PMA = 2048B (dedicated) -----------------------
195#elif defined(STM32G0)
196#define LIBXR_STM32_USB_PMA_SIZE 2048u
197
198// --- C0: USB_DRD_FS (V2), PMA = 2048B (dedicated) -----------------------
199#elif defined(STM32C0)
200#define LIBXR_STM32_USB_PMA_SIZE 2048u
201
202// --- H5(H503/563/573/562 DRD_FS),PMA = 2048B -------------------------
203#elif defined(STM32H503xx) || defined(STM32H563xx) || defined(STM32H573xx) || \
204 defined(STM32H562xx)
205#define LIBXR_STM32_USB_PMA_SIZE 2048u
206
207// --- WB55/35: USB FS Device, PMA = 1024B (专门给 USB) ------------------
208#elif defined(STM32WB)
209#define LIBXR_STM32_USB_PMA_SIZE 1024u
210
211// --- L4: USB FS Device (非 OTG),PMA = 1024B ----------------------------
212#elif defined(STM32L4)
213#define LIBXR_STM32_USB_PMA_SIZE 1024u
214
215// --- L5: USB FS Device/DRD,PMA = 1024B -------------------------------
216#elif defined(STM32L5)
217#define LIBXR_STM32_USB_PMA_SIZE 1024u
218
219// --- U5: USB_DRD_FS (V2),PMA = 2048B -----------------------------------
220#elif defined(STM32U5)
221#define LIBXR_STM32_USB_PMA_SIZE 2048u
222
223// --- U0: USB_DRD_FS (V2,1KB 专用) --------------------------------------
224#elif defined(STM32U0)
225#define LIBXR_STM32_USB_PMA_SIZE 1024u
226
227// --- U3: USB_DRD_FS (V2,2KB 专用) --------------------------------------
228#elif defined(STM32U3)
229#define LIBXR_STM32_USB_PMA_SIZE 2048u
230
231#else
232#error \
233 "Unknown STM32 USB FS/DRD with PMA. Please define LIBXR_STM32_USB_PMA_SIZE manually."
234#endif
235
236class STM32USBDeviceDevFs : public STM32USBDevice
237{
238 public:
242 struct EPConfig
243 {
244 LibXR::RawData buffer1, buffer2;
245 size_t hw_buffer_size1, hw_buffer_size2;
246 bool double_buffer_is_in = false;
247
248 EPConfig(LibXR::RawData buffer, size_t hw_buffer_size, bool is_in)
249 : buffer1(buffer),
250 buffer2(nullptr, 0),
251 hw_buffer_size1(hw_buffer_size),
252 hw_buffer_size2(0),
253 double_buffer_is_in(is_in)
254 {
255 }
256
257 EPConfig(LibXR::RawData buffer_in, LibXR::RawData buffer_out,
258 size_t hw_buffer_size_in, size_t hw_buffer_size_out)
259 : buffer1(buffer_in),
260 buffer2(buffer_out),
261 hw_buffer_size1(hw_buffer_size_in),
262 hw_buffer_size2(hw_buffer_size_out)
263 {
264 }
265
266 EPConfig() = delete;
267 };
268
272 STM32USBDeviceDevFs(
273 PCD_HandleTypeDef* hpcd, const std::initializer_list<EPConfig> EP_CFGS,
274 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
275 uint16_t bcd,
276 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
277 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
278 CONFIGS,
279 ConstRawData uid = {nullptr, 0});
280
281 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override;
282};
283#endif
284
285} // namespace LibXR
286#endif
只读原始数据视图 / 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,...
Definition dev_core.hpp:22
virtual void Deinit(bool in_isr)
反初始化 / Deinitialize
Definition dev_core.cpp:139
virtual void Init(bool in_isr)
初始化 / Initialize
Definition dev_core.cpp:122
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
Definition dev_core.cpp:12
Speed speed
设备速度 / Device speed
Definition dev_core.hpp:200
PacketSize0
控制端点0最大包长度枚举 Packet size for endpoint 0 (bMaxPacketSize0)
Definition desc_dev.hpp:75
USB端点池类 / USB endpoint pool class.
Definition ep_pool.hpp:23
EndpointPool(size_t endpoint_num)
构造函数 / Constructor
Definition ep_pool.cpp:5
LibXR 命名空间
Definition ch32_can.hpp:14
ErrorCode
定义错误码枚举