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 USB::Speed speed = USB::Speed::FULL, USB::USBSpec spec = USB::USBSpec::USB_2_0)
29 : LibXR::USB::EndpointPool(max_ep_num),
30 LibXR::USB::DeviceCore(*this, spec, speed, packet_size, vid, pid, bcd, LANG_LIST,
31 CONFIGS),
32 hpcd_(hpcd),
33 id_(id)
34 {
35 map_[id] = this;
36 }
37
38 void Init() override { LibXR::USB::DeviceCore::Init(); }
39
41
42 void Start() override { HAL_PCD_Start(hpcd_); }
43 void Stop() override { HAL_PCD_Stop(hpcd_); }
44
45 PCD_HandleTypeDef* hpcd_;
46 stm32_usb_dev_id_t id_;
47 static inline STM32USBDevice* map_[STM32_USB_DEV_ID_NUM] = {};
48};
49
50#if defined(USB_OTG_FS)
51#if !defined(USB_OTG_FS_TOTAL_FIFO_SIZE)
52#if defined(STM32H7) || defined(STM32N6)
53#define USB_OTG_FS_TOTAL_FIFO_SIZE 4096
54#else
55#define USB_OTG_FS_TOTAL_FIFO_SIZE 1280
56#endif
57#endif
58class STM32USBDeviceOtgFS : public STM32USBDevice
59{
60 public:
61 struct EPInConfig
62 {
63 LibXR::RawData buffer;
64 size_t fifo_size;
65 };
66
67 STM32USBDeviceOtgFS(
68 PCD_HandleTypeDef* hpcd, size_t rx_fifo_size,
69 const std::initializer_list<LibXR::RawData> RX_EP_CFGS,
70 const std::initializer_list<EPInConfig> TX_EP_CFGS,
71 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
72 uint16_t bcd,
73 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
74 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
75 CONFIGS);
76
77 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override;
78};
79
80#endif
81
82#if defined(USB_OTG_HS)
83#if !defined(USB_OTG_HS_TOTAL_FIFO_SIZE)
84#define USB_OTG_HS_TOTAL_FIFO_SIZE 4096
85#endif
86class STM32USBDeviceOtgHS : public STM32USBDevice
87{
88 public:
89 struct EPInConfig
90 {
91 LibXR::RawData buffer;
92 size_t fifo_size;
93 };
94
95 STM32USBDeviceOtgHS(
96 PCD_HandleTypeDef* hpcd, size_t rx_fifo_size,
97 const std::initializer_list<LibXR::RawData> RX_EP_CFGS,
98 const std::initializer_list<EPInConfig> TX_EP_CFGS,
99 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
100 uint16_t bcd,
101 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
102 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
103 CONFIGS);
104
105 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override;
106};
107#endif
108
109#if defined(USB_BASE)
110class STM32USBDeviceDevFs : public STM32USBDevice
111{
112 public:
113 struct EPConfig
114 {
115 LibXR::RawData buffer1, buffer2;
116 size_t hw_buffer_size1, hw_buffer_size2;
117 bool double_buffer = false;
118 bool double_buffer_is_in = false;
119
120 EPConfig(LibXR::RawData buffer, size_t hw_buffer_size, bool is_in)
121 : buffer1(buffer),
122 buffer2(nullptr, 0),
123 hw_buffer_size1(hw_buffer_size),
124 hw_buffer_size2(0),
125 double_buffer(true),
126 double_buffer_is_in(is_in)
127 {
128 }
129
130 EPConfig(LibXR::RawData buffer_in, LibXR::RawData buffer_out,
131 size_t hw_buffer_size_in, size_t hw_buffer_size_out)
132 : buffer1(buffer_in),
133 buffer2(buffer_out),
134 hw_buffer_size1(hw_buffer_size_in),
135 hw_buffer_size2(hw_buffer_size_out)
136 {
137 }
138
139 EPConfig() = delete;
140 };
141
142 STM32USBDeviceDevFs(
143 PCD_HandleTypeDef* hpcd, const std::initializer_list<EPConfig> EP_CFGS,
144 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
145 uint16_t bcd,
146 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
147 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
148 CONFIGS);
149
150 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override;
151};
152#endif
153
154} // namespace LibXR
155#endif
原始数据封装类。 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:108
virtual void Deinit()
反初始化 USB 设备 / Deinitialize USB device
Definition dev_core.cpp:102
Speed speed
当前速度 / Current speed
Definition dev_core.hpp:351
virtual void Init()
初始化 USB 设备 / Initialize USB device
Definition dev_core.cpp:86
PacketSize0
控制端点0最大包长度枚举 Packet size for endpoint 0 (bMaxPacketSize0)
Definition desc_dev.hpp:72
USB端点池类 / USB endpoint pool class.
Definition ep_pool.hpp:23
LibXR 命名空间
Definition ch32_gpio.hpp:9