libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
ch32_usb_dev.hpp
1#pragma once
2
3#include "ch32_usb.hpp"
4#include "ch32_usb_endpoint.hpp"
5#include "libxr_def.hpp"
6#include "libxr_type.hpp"
7#include "usb/core/ep_pool.hpp"
8#include "usb/device/dev_core.hpp"
9
10namespace LibXR
11{
12
14{
15 public:
20 ch32_usb_dev_id_t id, size_t max_ep_num,
21 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
22 uint16_t bcd,
23 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
24 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
25 CONFIGS,
26 USB::Speed speed = USB::Speed::FULL, USB::USBSpec spec = USB::USBSpec::USB_2_1)
27 : USB::EndpointPool(max_ep_num),
28 USB::DeviceCore(*this, spec, speed, packet_size, vid, pid, bcd, LANG_LIST,
29 CONFIGS),
30 id_(id)
31 {
32 }
33
34 void Init(bool in_isr) override { USB::DeviceCore::Init(in_isr); }
35 void Deinit(bool in_isr) override { USB::DeviceCore::Deinit(in_isr); }
36
37 uint8_t id_;
38};
39
40#if defined(RCC_APB1Periph_USB)
41
45class CH32USBDeviceFS : public USB::EndpointPool, public USB::DeviceCore
46{
47 public:
51 struct EPConfig
52 {
53 LibXR::RawData buffer;
54 int8_t is_in;
55
56 EPConfig(LibXR::RawData buffer) : buffer(buffer), is_in(-1) {}
57
58 EPConfig(LibXR::RawData buffer, bool is_in) : buffer(buffer), is_in(is_in ? 1 : 0) {}
59 };
60
64 CH32USBDeviceFS(
65 const std::initializer_list<EPConfig> EP_CFGS,
66 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
67 uint16_t bcd,
68 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
69 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
70 CONFIGS,
71 ConstRawData uid = {nullptr, 0});
72
73 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override;
74
75 void Start(bool in_isr) override;
76 void Stop(bool in_isr) override;
77
78 static inline CH32USBDeviceFS* self_ = nullptr;
79};
80
81#endif // defined(RCC_APB1Periph_USB)
82
83#if defined(USBFSD)
84
88class CH32USBOtgFS : public USB::EndpointPool, public USB::DeviceCore
89{
90 public:
94 struct EPConfig
95 {
96 LibXR::RawData buffer;
97 int8_t is_in;
98
99 EPConfig(LibXR::RawData buffer) : buffer(buffer), is_in(-1) {}
100 EPConfig(LibXR::RawData buffer, bool is_in) : buffer(buffer), is_in(is_in ? 1 : 0) {}
101 };
102
106 CH32USBOtgFS(
107 const std::initializer_list<EPConfig> EP_CFGS,
108 USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid,
109 uint16_t bcd,
110 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
111 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
112 CONFIGS,
113 ConstRawData uid = {nullptr, 0});
114
115 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override;
116
117 void Start(bool in_isr) override;
118 void Stop(bool in_isr) override;
119
120 static inline CH32USBOtgFS* self_ = nullptr;
121};
122
123#endif // defined(USBFSD)
124
125#if defined(USBHSD)
126
130class CH32USBOtgHS : public USB::EndpointPool, public USB::DeviceCore
131{
132 public:
136 struct EPConfig
137 {
138 RawData buffer_tx;
139 RawData buffer_rx;
140 bool double_buffer;
141 bool is_in;
142
143 EPConfig(RawData buffer)
144 : buffer_tx(buffer), buffer_rx(buffer), double_buffer(false), is_in(false)
145 {
146 }
147
148 EPConfig(RawData buffer, bool is_in)
149 : buffer_tx(buffer), buffer_rx(buffer), double_buffer(true), is_in(is_in)
150 {
151 }
152
153 EPConfig(RawData buffer_tx, RawData buffer_rx)
154 : buffer_tx(buffer_tx), buffer_rx(buffer_rx), double_buffer(false), is_in(false)
155 {
156 }
157 };
158
162 CH32USBOtgHS(
163 const std::initializer_list<EPConfig> EP_CFGS, uint16_t vid, uint16_t pid,
164 uint16_t bcd,
165 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
166 const std::initializer_list<const std::initializer_list<USB::ConfigDescriptorItem*>>
167 CONFIGS,
168 ConstRawData uid = {nullptr, 0});
169
170 ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override;
171
172 void Start(bool in_isr) override;
173 void Stop(bool in_isr) override;
174
175 static inline CH32USBOtgHS* self_ = nullptr;
176};
177
178#endif // defined(USBHSD)
179
180} // namespace LibXR
CH32USBDevice(ch32_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, USB::Speed speed=USB::Speed::FULL, USB::USBSpec spec=USB::USBSpec::USB_2_1)
构造 CH32 USB 设备核心对象 / Construct CH32 USB device core
void Init(bool in_isr) override
初始化 / Initialize
void Deinit(bool in_isr) override
反初始化 / Deinitialize
原始数据封装类。 A class for encapsulating raw data.
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
ch32_usb_dev_id_t
CH32 USB 控制器编号 / CH32 USB controller identifiers.
Definition ch32_usb.hpp:13