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
19{
20 public:
22 PCD_HandleTypeDef* hpcd, stm32_usb_dev_id_t id, size_t max_ep_num,
23 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
24 uint16_t bcd,
25 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
26 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
27 CONFIGS,
28 ConstRawData uid = {nullptr, 0}, USB::Speed speed = USB::Speed::FULL,
29 USB::USBSpec spec = USB::USBSpec::USB_2_0)
30 : LibXR::USB::EndpointPool(max_ep_num),
31 LibXR::USB::DeviceCore(*this, spec, speed, packet_size, vid, pid, bcd, LANG_LIST,
32 CONFIGS, uid),
33 hpcd_(hpcd),
34 id_(id)
35 {
36 map_[id] = this;
37 }
38
39 void Init() override { LibXR::USB::DeviceCore::Init(); }
40
42
43 void Start() override { HAL_PCD_Start(hpcd_); }
44 void Stop() override { HAL_PCD_Stop(hpcd_); }
45
46 PCD_HandleTypeDef* hpcd_;
47 stm32_usb_dev_id_t id_;
48 static inline STM32USBDevice* map_[STM32_USB_DEV_ID_NUM] = {};
49};
50
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
55#else
56#define USB_OTG_FS_TOTAL_FIFO_SIZE 1280
57#endif
58#endif
59class STM32USBDeviceOtgFS : public STM32USBDevice
60{
61 public:
62 struct EPInConfig
63 {
64 LibXR::RawData buffer;
65 size_t fifo_size;
66 };
67
68 STM32USBDeviceOtgFS(
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,
73 uint16_t bcd,
74 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
75 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
76 CONFIGS,
77 ConstRawData uid = {nullptr, 0});
78
79 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override;
80};
81
82#endif
83
84#if defined(USB_OTG_HS)
85#if !defined(USB_OTG_HS_TOTAL_FIFO_SIZE)
86#define USB_OTG_HS_TOTAL_FIFO_SIZE 4096
87#endif
88class STM32USBDeviceOtgHS : public STM32USBDevice
89{
90 public:
91 struct EPInConfig
92 {
93 LibXR::RawData buffer;
94 size_t fifo_size;
95 };
96
97 STM32USBDeviceOtgHS(
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,
102 uint16_t bcd,
103 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
104 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
105 CONFIGS,
106 ConstRawData uid = {nullptr, 0});
107
108 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override;
109};
110#endif
111
112#if defined(USB_BASE)
113
114#if defined (PMA_END_ADDR)
115#define LIBXR_STM32_USB_PMA_SIZE PMA_END_ADDR
116// --- F0: USB FS Device, PMA = 1024B (dedicated) -------------------------
117#elif defined(STM32F0)
118#define LIBXR_STM32_USB_PMA_SIZE 1024u
119
120// --- F1: F102/F103 USB FS Device, PMA = 512B,与 CAN 共用,不能并行使用 ---
121#elif defined(STM32F102xB) || defined(STM32F102xC) || defined(STM32F103x6) || \
122 defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)
123#define LIBXR_STM32_USB_PMA_SIZE 512u
124
125#if defined(HAL_CAN_MODULE_ENABLED)
126#error "STM32F102/F103 cannot use CAN at the same time with USB."
127#endif
128
129// --- F3 小容量带 USB :PMA = 512B,专用给 USB --------------------
130#elif defined(STM32F302xB) || defined(STM32F302xC) || defined(STM32F303xB) || \
131 defined(STM32F303xC) || defined(STM32F373xC)
132#define LIBXR_STM32_USB_PMA_SIZE 512u
133
134// --- F3 大容量(和 CAN 共享 1KB)的几种:F302x6/8,D/E & F303xD/E -------
135// - 总共 1KB USB+CAN SRAM
136// - 若 CAN 在用:USB 只能用前 768B,最后 256B 给 CAN
137#elif defined(STM32F302x6) || defined(STM32F302x8) || defined(STM32F302xD) || \
138 defined(STM32F302xE) || defined(STM32F303xD) || defined(STM32F303xE)
139
140#if defined(HAL_CAN_MODULE_ENABLED)
141// 给 USB 768B
142#define LIBXR_STM32_USB_PMA_SIZE 768u
143#else
144// 整 1KB 给 USB
145#define LIBXR_STM32_USB_PMA_SIZE 1024u
146#endif
147
148// --- L0: USB FS Device, PMA = 1024B (dedicated) -------------------------
149#elif defined(STM32L0)
150#define LIBXR_STM32_USB_PMA_SIZE 1024u
151
152// --- L1: USB FS Device, PMA = 512B (dedicated) --------------------------
153#elif defined(STM32L1)
154#define LIBXR_STM32_USB_PMA_SIZE 512u
155
156// --- G4: USB FS Device (V1), PMA = 1024B (dedicated) --------------------
157#elif defined(STM32G4)
158#define LIBXR_STM32_USB_PMA_SIZE 1024u
159
160// --- G0: USB_DRD_FS (V2), PMA = 2048B (dedicated) -----------------------
161#elif defined(STM32G0)
162#define LIBXR_STM32_USB_PMA_SIZE 2048u
163
164// --- C0: USB_DRD_FS (V2), PMA = 2048B (dedicated) -----------------------
165#elif defined(STM32C0)
166#define LIBXR_STM32_USB_PMA_SIZE 2048u
167
168// --- H5(H503/563/573/562 DRD_FS),PMA = 2048B -------------------------
169#elif defined(STM32H503xx) || defined(STM32H563xx) || defined(STM32H573xx) || \
170 defined(STM32H562xx)
171#define LIBXR_STM32_USB_PMA_SIZE 2048u
172
173// --- WB55/35: USB FS Device, PMA = 1024B (专门给 USB) ------------------
174#elif defined(STM32WB)
175#define LIBXR_STM32_USB_PMA_SIZE 1024u
176
177// --- L4: USB FS Device (非 OTG),PMA = 1024B ----------------------------
178#elif defined(STM32L4)
179#define LIBXR_STM32_USB_PMA_SIZE 1024u
180
181// --- L5: USB FS Device/DRD,PMA = 1024B -------------------------------
182#elif defined(STM32L5)
183#define LIBXR_STM32_USB_PMA_SIZE 1024u
184
185// --- U5: USB_DRD_FS (V2),PMA = 2048B -----------------------------------
186#elif defined(STM32U5)
187#define LIBXR_STM32_USB_PMA_SIZE 2048u
188
189// --- U0: USB_DRD_FS (V2,1KB 专用) --------------------------------------
190#elif defined(STM32U0)
191#define LIBXR_STM32_USB_PMA_SIZE 1024u
192
193// --- U3: USB_DRD_FS (V2,2KB 专用) --------------------------------------
194#elif defined(STM32U3)
195#define LIBXR_STM32_USB_PMA_SIZE 2048u
196
197#else
198#error \
199 "Unknown STM32 USB FS/DRD with PMA. Please define LIBXR_STM32_USB_PMA_SIZE manually."
200#endif
201
202class STM32USBDeviceDevFs : public STM32USBDevice
203{
204 public:
205 struct EPConfig
206 {
207 LibXR::RawData buffer1, buffer2;
208 size_t hw_buffer_size1, hw_buffer_size2;
209 bool double_buffer = false;
210 bool double_buffer_is_in = false;
211
212 EPConfig(LibXR::RawData buffer, size_t hw_buffer_size, bool is_in)
213 : buffer1(buffer),
214 buffer2(nullptr, 0),
215 hw_buffer_size1(hw_buffer_size),
216 hw_buffer_size2(0),
217 double_buffer_is_in(is_in)
218 {
219 }
220
221 EPConfig(LibXR::RawData buffer_in, LibXR::RawData buffer_out,
222 size_t hw_buffer_size_in, size_t hw_buffer_size_out)
223 : buffer1(buffer_in),
224 buffer2(buffer_out),
225 hw_buffer_size1(hw_buffer_size_in),
226 hw_buffer_size2(hw_buffer_size_out)
227 {
228 }
229
230 EPConfig() = delete;
231 };
232
233 STM32USBDeviceDevFs(
234 PCD_HandleTypeDef* hpcd, const std::initializer_list<EPConfig> EP_CFGS,
235 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
236 uint16_t bcd,
237 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
238 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
239 CONFIGS,
240 ConstRawData uid = {nullptr, 0});
241
242 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override;
243};
244#endif
245
246} // namespace LibXR
247#endif
常量原始数据封装类。 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...
Definition dev_core.hpp:136
virtual void Deinit()
反初始化 USB 设备 / Deinitialize USB device
Definition dev_core.cpp:111
Speed speed
当前速度 / Current speed
Definition dev_core.hpp:383
virtual void Init()
初始化 USB 设备 / Initialize USB device
Definition dev_core.cpp:95
PacketSize0
控制端点0最大包长度枚举 Packet size for endpoint 0 (bMaxPacketSize0)
Definition desc_dev.hpp:72
USB端点池类 / USB endpoint pool class.
Definition ep_pool.hpp:23
LibXR 命名空间