libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
dev_core.hpp
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <initializer_list>
6
7#include "libxr_type.hpp"
8#include "usb/core/core.hpp"
9#include "usb/core/desc_cfg.hpp"
10#include "usb/core/ep_pool.hpp"
11
12namespace LibXR::USB
13{
14class DeviceCore;
15
26{
27 public:
37 explicit DeviceClass(std::initializer_list<BosCapability*> bos_caps = {});
38
42 ~DeviceClass() override;
43
44 protected:
51 {
52 RawData read_data{nullptr, 0};
56 bool read_zlp = false;
58 bool write_zlp = false;
59
60 RawData& OutData() { return read_data; }
61 const RawData& OutData() const { return read_data; }
62
63 ConstRawData& InData() { return write_data; }
64 const ConstRawData& InData() const { return write_data; }
65
66 bool& ExpectStatusOutZLP() { return read_zlp; }
67 bool ExpectStatusOutZLP() const { return read_zlp; }
68
69 bool& SendStatusInZLP() { return write_zlp; }
70 bool SendStatusInZLP() const { return write_zlp; }
71 };
72
85 virtual ErrorCode OnGetDescriptor(bool in_isr, uint8_t bRequest, uint16_t wValue,
86 uint16_t wLength, ConstRawData& out_data)
87 {
88 UNUSED(in_isr);
89 UNUSED(bRequest);
90 UNUSED(wValue);
91 UNUSED(wLength);
92 UNUSED(out_data);
93 return ErrorCode::NOT_SUPPORT;
94 }
95
108 virtual ErrorCode OnClassRequest(bool in_isr, uint8_t bRequest, uint16_t wValue,
109 uint16_t wLength, uint16_t wIndex,
110 ControlTransferResult& result)
111 {
112 UNUSED(in_isr);
113 UNUSED(bRequest);
114 UNUSED(wValue);
115 UNUSED(wLength);
116 UNUSED(wIndex);
117 UNUSED(result);
118 return ErrorCode::NOT_SUPPORT;
119 }
120
133 virtual ErrorCode OnClassData(bool in_isr, uint8_t bRequest, LibXR::ConstRawData& data)
134 {
135 UNUSED(in_isr);
136 UNUSED(bRequest);
137 UNUSED(data);
138 return ErrorCode::NOT_SUPPORT;
139 }
140
152 virtual ErrorCode OnVendorRequest(bool in_isr, uint8_t bRequest, uint16_t wValue,
153 uint16_t wLength, uint16_t wIndex,
154 ControlTransferResult& result)
155 {
156 UNUSED(in_isr);
157 UNUSED(bRequest);
158 UNUSED(wValue);
159 UNUSED(wLength);
160 UNUSED(wIndex);
161 UNUSED(result);
162 return ErrorCode::NOT_SUPPORT;
163 }
164
165 friend class DeviceCore;
166
167 private:
169 nullptr;
170 size_t bos_cap_num_ = 0;
171};
172
179{
180 public:
197
214 EndpointPool& ep_pool, USBSpec spec, Speed speed,
215 DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid, uint16_t bcd,
216 const std::initializer_list<const DescriptorStrings::LanguagePack*>& lang_list,
217 const std::initializer_list<const std::initializer_list<ConfigDescriptorItem*>>&
218 configs,
219 ConstRawData uid = {nullptr, 0});
220
226 virtual void Init(bool in_isr);
227
233 virtual void Deinit(bool in_isr);
234
240 virtual void Start(bool in_isr) = 0;
241
247 virtual void Stop(bool in_isr) = 0;
248
254 void OnSetupPacket(bool in_isr, const SetupPacket* setup);
255
256 protected:
265 virtual ErrorCode SetAddress(uint8_t address, Context state) = 0;
266
270 virtual void EnableRemoteWakeup() {}
271
275 virtual void DisableRemoteWakeup() {}
276
281 virtual bool IsRemoteWakeupEnabled() const { return false; }
282
287 [[nodiscard]] Speed GetSpeed() const;
288
289 private:
290 static void OnEP0OutCompleteStatic(bool in_isr, DeviceCore* self,
292 static void OnEP0InCompleteStatic(bool in_isr, DeviceCore* self,
294
295 static bool IsValidUSBCombination(USBSpec spec, Speed speed,
297
298 void OnEP0OutComplete(bool in_isr, LibXR::ConstRawData& data);
299 void OnEP0InComplete(bool in_isr, LibXR::ConstRawData& data);
300
301 void ReadZLP(Context context = Context::ZLP);
302 void WriteZLP(Context context = Context::ZLP);
303
304 void DevWriteEP0Data(LibXR::ConstRawData data, size_t packet_max_length,
305 size_t request_size = 0, bool early_read_zlp = false);
306 void DevReadEP0Data(LibXR::RawData data, size_t packet_max_length);
307
308 ErrorCode ProcessStandardRequest(bool in_isr, const SetupPacket*& setup,
309 RequestDirection direction, Recipient recipient);
310
311 ErrorCode RespondWithStatus(const SetupPacket* setup, Recipient recipient);
312 ErrorCode ClearFeature(const SetupPacket* setup, Recipient recipient);
313 ErrorCode ApplyFeature(const SetupPacket* setup, Recipient recipient);
314 ErrorCode SendDescriptor(bool in_isr, const SetupPacket* setup, Recipient recipient);
315 ErrorCode PrepareAddressChange(uint16_t address);
316 ErrorCode SwitchConfiguration(uint16_t value, bool in_isr);
317 ErrorCode SendConfiguration();
318
319 void StallControlEndpoint();
320 void ClearControlEndpointStall();
321
322 ErrorCode ProcessClassRequest(bool in_isr, const SetupPacket* setup,
323 RequestDirection direction, Recipient recipient);
324
325 ErrorCode ProcessVendorRequest(bool in_isr, const SetupPacket*& setup,
326 RequestDirection direction, Recipient recipient);
327
328 private:
332
333 struct
334 {
336 Endpoint* in0 = nullptr;
337 Endpoint* out0 = nullptr;
341 } endpoint_;
342
343 struct
344 {
345 bool inited = false;
346 Speed speed = Speed::FULL;
350 RawData read_remain{nullptr, 0};
351 uint8_t pending_addr = 0xFF;
352 uint8_t* out0_buffer = nullptr;
353 bool need_write_zlp = false;
354 } state_;
355
356 struct
357 {
358 bool write = false;
359 bool read = false;
361 uint8_t b_request = 0;
362 ConstRawData data{nullptr, 0};
363 } class_req_;
364};
365
366} // namespace LibXR::USB
通用回调包装,支持动态参数传递 / Generic callback wrapper supporting dynamic argument passing
Definition libxr_cb.hpp:150
常量原始数据封装类。 A class for encapsulating constant raw data.
原始数据封装类。 A class for encapsulating raw data.
BOS 能力接口 / BOS capability interface.
Definition bos.hpp:56
配置描述符管理与构建器,并聚合 BOS 能力 Configuration descriptor builder with BOS aggregation.
Definition desc_cfg.hpp:207
USB 配置项基类(功能块)/ USB configuration item base (functional block)
Definition desc_cfg.hpp:37
字符串描述符管理器 / USB string descriptor manager
Definition desc_str.hpp:19
USB 设备类接口基类 / USB device class interface base.
Definition dev_core.hpp:26
virtual ErrorCode OnClassRequest(bool in_isr, uint8_t bRequest, uint16_t wValue, uint16_t wLength, uint16_t wIndex, ControlTransferResult &result)
处理 Class-specific 请求(Setup stage)/ Handle class-specific request (Setup stage)
Definition dev_core.hpp:108
virtual ErrorCode OnClassData(bool in_isr, uint8_t bRequest, LibXR::ConstRawData &data)
处理 Class request 数据阶段 / Handle class request data stage
Definition dev_core.hpp:133
virtual ErrorCode OnVendorRequest(bool in_isr, uint8_t bRequest, uint16_t wValue, uint16_t wLength, uint16_t wIndex, ControlTransferResult &result)
处理 Vendor request(Setup stage)/ Handle vendor request (Setup stage)
Definition dev_core.hpp:152
~DeviceClass() override
析构函数 / Destructor
Definition dev_core.cpp:26
size_t bos_cap_num_
BOS capability 数量 / BOS capability count.
Definition dev_core.hpp:170
BosCapability ** bos_caps_
BOS capability 指针表 / BOS capability pointer table.
Definition dev_core.hpp:168
virtual ErrorCode OnGetDescriptor(bool in_isr, uint8_t bRequest, uint16_t wValue, uint16_t wLength, ConstRawData &out_data)
处理标准请求 GET_DESCRIPTOR(类特定描述符) Handle standard GET_DESCRIPTOR request (class-specific descriptors).
Definition dev_core.hpp:85
DeviceClass(std::initializer_list< BosCapability * > bos_caps={})
构造:传入本类提供的 BOS capabilities(对象指针列表) Constructor: pass BOS capabilities provided by this class (pointe...
Definition dev_core.cpp:12
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 EnableRemoteWakeup()
启用远程唤醒 / Enable remote wakeup
Definition dev_core.hpp:270
ConfigDescriptor config_desc_
配置描述符管理器 / Configuration descriptor manager
Definition dev_core.hpp:329
Endpoint * out0
EP0 OUT 端点 / EP0 OUT endpoint.
Definition dev_core.hpp:337
bool need_write_zlp
是否需要发送 ZLP / Whether to send ZLP
Definition dev_core.hpp:353
Endpoint * in0
EP0 IN 端点 / EP0 IN endpoint.
Definition dev_core.hpp:336
ConstRawData data
数据阶段数据 / Data stage payload
Definition dev_core.hpp:362
LibXR::Callback< LibXR::ConstRawData & > ep0_in_cb
EP0 IN 回调 / EP0 IN callback.
Definition dev_core.hpp:338
virtual void Stop(bool in_isr)=0
停止设备(由子类实现)/ Stop device (implemented by derived class)
EndpointPool & pool
端点池引用 / Endpoint pool reference
Definition dev_core.hpp:335
Context
控制传输上下文 / Control transfer context
Definition dev_core.hpp:188
@ SETUP
Setup stage / Setup stage.
Definition dev_core.hpp:190
@ STATUS_IN
IN status stage / IN status stage.
Definition dev_core.hpp:194
@ DATA_OUT
OUT data stage / OUT data stage.
Definition dev_core.hpp:191
@ STATUS_OUT
OUT status stage / OUT status stage.
Definition dev_core.hpp:192
@ DATA_IN
IN data stage / IN data stage.
Definition dev_core.hpp:193
@ ZLP
ZLP stage marker / ZLP stage marker.
Definition dev_core.hpp:195
@ UNKNOWN
未知 / Unknown
Definition dev_core.hpp:189
DeviceClass * class_ptr
当前处理类 / Current class handler
Definition dev_core.hpp:360
virtual void Init(bool in_isr)
初始化 / Initialize
Definition dev_core.cpp:129
RawData read_remain
OUT 剩余待接收 / Remaining OUT buffer.
Definition dev_core.hpp:350
bool read
是否存在 OUT 数据阶段 / Whether OUT data stage exists
Definition dev_core.hpp:359
DeviceDescriptor device_desc_
设备描述符 / Device descriptor
Definition dev_core.hpp:330
Speed GetSpeed() const
获取设备速度 / Get device speed
bool inited
是否已初始化 / Whether initialized
Definition dev_core.hpp:345
virtual void Start(bool in_isr)=0
启动设备(由子类实现)/ Start device (implemented by derived class)
virtual void DisableRemoteWakeup()
禁用远程唤醒 / Disable remote wakeup
Definition dev_core.hpp:275
uint8_t pending_addr
待生效地址 / Pending address
Definition dev_core.hpp:351
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
DescriptorStrings strings_
字符串描述符管理器 / String descriptor manager
Definition dev_core.hpp:331
uint8_t b_request
当前请求码 / Current request code
Definition dev_core.hpp:361
void OnSetupPacket(bool in_isr, const SetupPacket *setup)
处理 Setup 包 / Handle Setup packet
Definition dev_core.cpp:349
virtual bool IsRemoteWakeupEnabled() const
远程唤醒是否启用 / Whether remote wakeup is enabled
Definition dev_core.hpp:281
uint8_t * out0_buffer
EP0 OUT 缓冲区 / EP0 OUT buffer.
Definition dev_core.hpp:352
bool write
是否存在 IN 数据阶段 / Whether IN data stage exists
Definition dev_core.hpp:358
virtual ErrorCode SetAddress(uint8_t address, Context state)=0
设置设备地址(由子类实现) Set device address (implemented by derived class).
ConstRawData write_remain
IN 剩余待发送 / Remaining IN payload.
Definition dev_core.hpp:349
LibXR::Callback< LibXR::ConstRawData & > ep0_out_cb
EP0 OUT 回调 / EP0 OUT callback.
Definition dev_core.hpp:340
USB描述符基类 USB descriptor base class.
Definition desc_dev.hpp:40
PacketSize0
控制端点0最大包长度枚举 Packet size for endpoint 0 (bMaxPacketSize0)
Definition desc_dev.hpp:75
USB 端点基类 / USB Endpoint base class.
Definition ep.hpp:23
USB端点池类 / USB endpoint pool class.
Definition ep_pool.hpp:23
控制请求(Class/Vendor)处理结果 / Control request (Class/Vendor) handling result
Definition dev_core.hpp:51
bool write_zlp
发送 STATUS IN(发送 ZLP)/ Send STATUS IN (send ZLP)
Definition dev_core.hpp:58
USB 标准请求 SETUP 包(固定8字节) Standard USB setup packet (8 bytes)
Definition core.hpp:57