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 map_[id] = this;
43 }
44
45 void Init(bool in_isr) override { LibXR::USB::DeviceCore::Init(in_isr); }
46
47 void Deinit(bool in_isr) override { LibXR::USB::DeviceCore::Deinit(in_isr); }
48
49 void Start(bool) override { HAL_PCD_Start(hpcd_); }
50 void Stop(bool) override { HAL_PCD_Stop(hpcd_); }
51
52 PCD_HandleTypeDef* hpcd_;
53 stm32_usb_dev_id_t id_;
54 static inline STM32USBDevice* map_[STM32_USB_DEV_ID_NUM] = {};
55};
56
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
61#else
62#define USB_OTG_FS_TOTAL_FIFO_SIZE 1280
63#endif
64#endif
68class STM32USBDeviceOtgFS : public STM32USBDevice
69{
70 public:
74 struct EPInConfig
75 {
76 LibXR::RawData buffer;
77 size_t fifo_size;
78 };
79
83 STM32USBDeviceOtgFS(
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,
88 uint16_t bcd,
89 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
90 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
91 CONFIGS,
92 ConstRawData uid = {nullptr, 0});
93
94 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override;
95};
96
97#endif
98
99#if defined(USB_OTG_HS)
100#if !defined(USB_OTG_HS_TOTAL_FIFO_SIZE)
101#define USB_OTG_HS_TOTAL_FIFO_SIZE 4096
102#endif
106class STM32USBDeviceOtgHS : public STM32USBDevice
107{
108 public:
112 struct EPInConfig
113 {
114 LibXR::RawData buffer;
115 size_t fifo_size;
116 };
117
121 STM32USBDeviceOtgHS(
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,
126 uint16_t bcd,
127 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
128 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
129 CONFIGS,
130 ConstRawData uid = {nullptr, 0});
131
132 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override;
133};
134#endif
135
136#if defined(USB_BASE)
137
138#if defined(PMA_END_ADDR)
139#define LIBXR_STM32_USB_PMA_SIZE PMA_END_ADDR
140// --- F0: USB FS Device, PMA = 1024B (dedicated) -------------------------
141#elif defined(STM32F0)
142#define LIBXR_STM32_USB_PMA_SIZE 1024u
143
144// --- F1: F102/F103 USB FS Device, PMA = 512B,与 CAN 共用,不能并行使用 ---
145#elif defined(STM32F102xB) || defined(STM32F102xC) || defined(STM32F103x6) || \
146 defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)
147#define LIBXR_STM32_USB_PMA_SIZE 512u
148
149#if defined(HAL_CAN_MODULE_ENABLED)
150#error "STM32F102/F103 cannot use CAN at the same time with USB."
151#endif
152
153// --- F3 小容量带 USB :PMA = 512B,专用给 USB --------------------
154#elif defined(STM32F302xB) || defined(STM32F302xC) || defined(STM32F303xB) || \
155 defined(STM32F303xC) || defined(STM32F373xC)
156#define LIBXR_STM32_USB_PMA_SIZE 512u
157
158// --- F3 大容量(和 CAN 共享 1KB)的几种:F302x6/8,D/E & F303xD/E -------
159// - 总共 1KB USB+CAN SRAM
160// - 若 CAN 在用:USB 只能用前 768B,最后 256B 给 CAN
161#elif defined(STM32F302x6) || defined(STM32F302x8) || defined(STM32F302xD) || \
162 defined(STM32F302xE) || defined(STM32F303xD) || defined(STM32F303xE)
163
164#if defined(HAL_CAN_MODULE_ENABLED)
165// 给 USB 768B
166#define LIBXR_STM32_USB_PMA_SIZE 768u
167#else
168// 整 1KB 给 USB
169#define LIBXR_STM32_USB_PMA_SIZE 1024u
170#endif
171
172// --- L0: USB FS Device, PMA = 1024B (dedicated) -------------------------
173#elif defined(STM32L0)
174#define LIBXR_STM32_USB_PMA_SIZE 1024u
175
176// --- L1: USB FS Device, PMA = 512B (dedicated) --------------------------
177#elif defined(STM32L1)
178#define LIBXR_STM32_USB_PMA_SIZE 512u
179
180// --- G4: USB FS Device (V1), PMA = 1024B (dedicated) --------------------
181#elif defined(STM32G4)
182#define LIBXR_STM32_USB_PMA_SIZE 1024u
183
184// --- G0: USB_DRD_FS (V2), PMA = 2048B (dedicated) -----------------------
185#elif defined(STM32G0)
186#define LIBXR_STM32_USB_PMA_SIZE 2048u
187
188// --- C0: USB_DRD_FS (V2), PMA = 2048B (dedicated) -----------------------
189#elif defined(STM32C0)
190#define LIBXR_STM32_USB_PMA_SIZE 2048u
191
192// --- H5(H503/563/573/562 DRD_FS),PMA = 2048B -------------------------
193#elif defined(STM32H503xx) || defined(STM32H563xx) || defined(STM32H573xx) || \
194 defined(STM32H562xx)
195#define LIBXR_STM32_USB_PMA_SIZE 2048u
196
197// --- WB55/35: USB FS Device, PMA = 1024B (专门给 USB) ------------------
198#elif defined(STM32WB)
199#define LIBXR_STM32_USB_PMA_SIZE 1024u
200
201// --- L4: USB FS Device (非 OTG),PMA = 1024B ----------------------------
202#elif defined(STM32L4)
203#define LIBXR_STM32_USB_PMA_SIZE 1024u
204
205// --- L5: USB FS Device/DRD,PMA = 1024B -------------------------------
206#elif defined(STM32L5)
207#define LIBXR_STM32_USB_PMA_SIZE 1024u
208
209// --- U5: USB_DRD_FS (V2),PMA = 2048B -----------------------------------
210#elif defined(STM32U5)
211#define LIBXR_STM32_USB_PMA_SIZE 2048u
212
213// --- U0: USB_DRD_FS (V2,1KB 专用) --------------------------------------
214#elif defined(STM32U0)
215#define LIBXR_STM32_USB_PMA_SIZE 1024u
216
217// --- U3: USB_DRD_FS (V2,2KB 专用) --------------------------------------
218#elif defined(STM32U3)
219#define LIBXR_STM32_USB_PMA_SIZE 2048u
220
221#else
222#error \
223 "Unknown STM32 USB FS/DRD with PMA. Please define LIBXR_STM32_USB_PMA_SIZE manually."
224#endif
225
226class STM32USBDeviceDevFs : public STM32USBDevice
227{
228 public:
232 struct EPConfig
233 {
234 LibXR::RawData buffer1, buffer2;
235 size_t hw_buffer_size1, hw_buffer_size2;
236 bool double_buffer_is_in = false;
237
238 EPConfig(LibXR::RawData buffer, size_t hw_buffer_size, bool is_in)
239 : buffer1(buffer),
240 buffer2(nullptr, 0),
241 hw_buffer_size1(hw_buffer_size),
242 hw_buffer_size2(0),
243 double_buffer_is_in(is_in)
244 {
245 }
246
247 EPConfig(LibXR::RawData buffer_in, LibXR::RawData buffer_out,
248 size_t hw_buffer_size_in, size_t hw_buffer_size_out)
249 : buffer1(buffer_in),
250 buffer2(buffer_out),
251 hw_buffer_size1(hw_buffer_size_in),
252 hw_buffer_size2(hw_buffer_size_out)
253 {
254 }
255
256 EPConfig() = delete;
257 };
258
262 STM32USBDeviceDevFs(
263 PCD_HandleTypeDef* hpcd, const std::initializer_list<EPConfig> EP_CFGS,
264 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
265 uint16_t bcd,
266 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
267 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
268 CONFIGS,
269 ConstRawData uid = {nullptr, 0});
270
271 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override;
272};
273#endif
274
275} // namespace LibXR
276#endif
常量原始数据封装类。 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,...
Definition dev_core.hpp:179
virtual void Deinit(bool in_isr)
反初始化 / Deinitialize
Definition dev_core.cpp:151
virtual void Init(bool in_isr)
初始化 / Initialize
Definition dev_core.cpp:129
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:36
Speed speed
设备速度 / Device speed
Definition dev_core.hpp:346
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