libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
dev_core.hpp
1#pragma once
2#include <cstring>
3
4#include "usb/core/core.hpp"
5#include "usb/core/desc_cfg.hpp"
6#include "usb/core/ep_pool.hpp"
7
8namespace LibXR::USB
9{
10class DeviceCore;
22{
23 protected:
28 {
29 RawData read_data{nullptr, 0};
31 0};
32 bool read_zlp = false;
33 bool write_zlp = false;
34 };
35
46 virtual ErrorCode OnGetDescriptor(bool in_isr, uint8_t bRequest, uint16_t wValue,
47 uint16_t wLength, ConstRawData &need_write)
48 {
49 UNUSED(in_isr);
50 UNUSED(bRequest);
51 UNUSED(wValue);
52 UNUSED(wLength);
53 UNUSED(need_write);
54 return ErrorCode::NOT_SUPPORT;
55 }
56
67 virtual ErrorCode OnClassRequest(bool in_isr, uint8_t bRequest, uint16_t wValue,
68 uint16_t wLength, uint16_t wIndex,
69 RequestResult &result)
70 {
71 UNUSED(in_isr);
72 UNUSED(bRequest);
73 UNUSED(wValue);
74 UNUSED(wLength);
75 UNUSED(wIndex);
76 UNUSED(result);
77 return ErrorCode::NOT_SUPPORT;
78 }
79
88 virtual ErrorCode OnClassData(bool in_isr, uint8_t bRequest, LibXR::ConstRawData &data)
89 {
90 UNUSED(in_isr);
91 UNUSED(bRequest);
92 UNUSED(data);
93 return ErrorCode::NOT_SUPPORT;
94 }
95
96 friend class DeviceCore;
97};
98
110{
111 public:
125
139 EndpointPool &ep_pool, USBSpec spec, Speed speed,
140 DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid, uint16_t bcd,
141 const std::initializer_list<const DescriptorStrings::LanguagePack *> &lang_list,
142 const std::initializer_list<const std::initializer_list<ConfigDescriptorItem *>>
143 &configs);
144
149 virtual void Init();
150
155 virtual void Deinit();
156
161 virtual void Start() = 0;
162
167 virtual void Stop() = 0;
168
176 void OnSetupPacket(bool in_isr, const SetupPacket *setup);
177
178 private:
183 static void OnEP0OutCompleteStatic(bool in_isr, DeviceCore *self,
184 LibXR::ConstRawData &data);
185
190 static void OnEP0InCompleteStatic(bool in_isr, DeviceCore *self,
191 LibXR::ConstRawData &data);
192
196 static bool IsValidUSBCombination(USBSpec spec, Speed speed,
198
202 void OnEP0OutComplete(bool in_isr, LibXR::ConstRawData &data);
203
207 void OnEP0InComplete(bool in_isr, LibXR::ConstRawData &data);
208
213 void ReadZLP(Context context = Context::ZLP);
214
219 void WriteZLP(Context context = Context::ZLP);
220
228 void DevWriteEP0Data(LibXR::ConstRawData data, size_t packet_max_length,
229 size_t request_size = 0);
230
237 void DevReadEP0Data(LibXR::RawData data, size_t packet_max_length);
238
243 ErrorCode ProcessStandardRequest(bool in_isr, const SetupPacket *&setup,
244 RequestDirection direction, Recipient recipient);
245
249 ErrorCode RespondWithStatus(const SetupPacket *setup, Recipient recipient);
250
254 ErrorCode ClearFeature(const SetupPacket *setup, Recipient recipient);
255
259 ErrorCode ApplyFeature(const SetupPacket *setup, Recipient recipient);
260
264 ErrorCode SendDescriptor(bool in_isr, const SetupPacket *setup, Recipient recipient);
265
269 ErrorCode PrepareAddressChange(uint16_t address);
270
274 ErrorCode SwitchConfiguration(uint16_t value);
275
279 ErrorCode SendConfiguration();
280
285
290
294 ErrorCode ProcessClassRequest(bool in_isr, const SetupPacket *setup,
295 RequestDirection direction, Recipient recipient);
296
300 ErrorCode ProcessVendorRequest(bool in_isr, const SetupPacket *&setup,
301 RequestDirection direction, Recipient recipient);
302
310 virtual ErrorCode SetAddress(uint8_t address, Context state) = 0;
311
316 virtual void EnableRemoteWakeup() {}
317
322 virtual void DisableRemoteWakeup() {}
323
328 virtual bool IsRemoteWakeupEnabled() const { return false; }
329
334 Speed GetSpeed() const;
335
336 private:
340
341 struct
342 {
344 Endpoint *in0 = nullptr;
345 Endpoint *out0 = nullptr;
349 } endpoint_;
350
351 struct
352 {
353 bool inited = false;
354 Speed speed = Speed::FULL;
359 uint8_t pending_addr = 0xFF;
360 uint8_t *out0_buffer = nullptr;
361 bool need_write_zlp = false;
362 } state_;
363
364 struct
365 {
366 bool write = false;
367 bool read = false;
369 uint8_t b_request = 0;
370 } class_req_;
371};
372} // namespace LibXR::USB
提供一个通用的回调包装,支持动态参数传递。 Provides a generic callback wrapper, supporting dynamic argument passing.
Definition libxr_cb.hpp:124
常量原始数据封装类。 A class for encapsulating constant raw data.
原始数据封装类。 A class for encapsulating raw data.
USB 配置描述符生成器 USB configuration descriptor generator.
Definition desc_cfg.hpp:227
USB 配置项接口类 USB configuration item base class.
Definition desc_cfg.hpp:30
字符串描述符管理器 / USB string descriptor manager
Definition desc_str.hpp:19
USB 设备类接口基类,所有自定义 USB 类(如 HID、CDC、MSC)都需派生自本类。 USB device class base interface, all custom device cla...
Definition dev_core.hpp:22
virtual ErrorCode OnClassData(bool in_isr, uint8_t bRequest, LibXR::ConstRawData &data)
处理类请求的数据阶段 Handle data stage for class request
Definition dev_core.hpp:88
virtual ErrorCode OnGetDescriptor(bool in_isr, uint8_t bRequest, uint16_t wValue, uint16_t wLength, ConstRawData &need_write)
处理标准请求 GET_DESCRIPTOR Handle standard request GET_DESCRIPTOR
Definition dev_core.hpp:46
virtual ErrorCode OnClassRequest(bool in_isr, uint8_t bRequest, uint16_t wValue, uint16_t wLength, uint16_t wIndex, RequestResult &result)
处理类特定请求(Class-specific Request) Handle class-specific request
Definition dev_core.hpp:67
USB 设备协议栈核心类,负责端点 0 控制传输及配置、描述符、标准请求处理等。 USB device protocol stack core class. Handles EP0 control tr...
Definition dev_core.hpp:110
ErrorCode SwitchConfiguration(uint16_t value)
切换配置 / Switch USB configuration
Definition dev_core.cpp:652
virtual void EnableRemoteWakeup()
启用远程唤醒功能(SetFeature: DEVICE_REMOTE_WAKEUP) Enable remote wakeup (via SetFeature)
Definition dev_core.hpp:316
ConfigDescriptor config_desc_
配置描述符 / Config descriptor
Definition dev_core.hpp:337
Endpoint * out0
控制 OUT 端点指针 / Control OUT endpoint
Definition dev_core.hpp:345
static void OnEP0OutCompleteStatic(bool in_isr, DeviceCore *self, LibXR::ConstRawData &data)
EP0 OUT 端点传输完成回调(静态) EP0 OUT endpoint transfer complete (static)
Definition dev_core.cpp:26
ErrorCode PrepareAddressChange(uint16_t address)
预设地址变更 / Prepare address change
Definition dev_core.cpp:644
bool need_write_zlp
是否需要写 ZLP / Need to write ZLP
Definition dev_core.hpp:361
Endpoint * in0
控制 IN 端点指针 / Control IN endpoint
Definition dev_core.hpp:344
ErrorCode RespondWithStatus(const SetupPacket *setup, Recipient recipient)
返回状态响应 / Respond with status stage
Definition dev_core.cpp:430
Context in0
IN0 状态 / IN0 context.
Definition dev_core.hpp:355
ErrorCode ProcessStandardRequest(bool in_isr, const SetupPacket *&setup, RequestDirection direction, Recipient recipient)
处理标准请求 Process standard USB requests
Definition dev_core.cpp:321
static bool IsValidUSBCombination(USBSpec spec, Speed speed, DeviceDescriptor::PacketSize0 packet_size)
检查 USB 组合是否合法 / Check if USB combination is valid
Definition dev_core.cpp:38
LibXR::Callback< LibXR::ConstRawData & > ep0_out_cb
EP0 OUT 回调 / EP0 OUT callback.
Definition dev_core.hpp:348
EndpointPool & pool
端点池 / Endpoint pool
Definition dev_core.hpp:343
Context
控制传输状态枚举 / Control transfer context enum
Definition dev_core.hpp:116
@ SETUP
SETUP 阶段 / Setup stage.
Definition dev_core.hpp:118
@ UNKNOW
未知 / Unknown
Definition dev_core.hpp:117
@ STATUS_IN
状态 IN 阶段 / Status in stage
Definition dev_core.hpp:122
@ DATA_OUT
数据 OUT 阶段 / Data out stage
Definition dev_core.hpp:119
@ STATUS_OUT
状态 OUT 阶段 / Status out stage
Definition dev_core.hpp:120
@ DATA_IN
数据 IN 阶段 / Data in stage
Definition dev_core.hpp:121
@ ZLP
0 长度包 / Zero-length packet
Definition dev_core.hpp:123
DeviceClass * class_ptr
当前类指针 / Current device class pointer
Definition dev_core.hpp:368
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)
构造函数 / Constructor
Definition dev_core.cpp:5
virtual void Start()=0
启动 USB 设备 / Start USB device
RawData read_remain
剩余读数据 / Remaining read data
Definition dev_core.hpp:358
void ReadZLP(Context context=Context::ZLP)
接收 0 长度包 / Receive zero-length packet (ZLP)
Definition dev_core.cpp:74
bool read
是否读操作 / Read operation
Definition dev_core.hpp:367
ErrorCode ProcessVendorRequest(bool in_isr, const SetupPacket *&setup, RequestDirection direction, Recipient recipient)
处理厂商请求 / Process vendor-specific request
Definition dev_core.cpp:792
DeviceDescriptor device_desc_
设备描述符 / Device descriptor
Definition dev_core.hpp:338
virtual void Deinit()
反初始化 USB 设备 / Deinitialize USB device
Definition dev_core.cpp:102
void OnEP0InComplete(bool in_isr, LibXR::ConstRawData &data)
EP0 IN 端点传输完成回调 / EP0 IN endpoint transfer complete.
Definition dev_core.cpp:152
Speed GetSpeed() const
获取当前 USB 速度 / Get current USB speed
Definition dev_core.cpp:805
bool inited
是否初始化 / Initialized
Definition dev_core.hpp:353
void WriteZLP(Context context=Context::ZLP)
发送 0 长度包 / Send zero-length packet (ZLP)
Definition dev_core.cpp:80
void OnEP0OutComplete(bool in_isr, LibXR::ConstRawData &data)
EP0 OUT 端点传输完成回调 / EP0 OUT endpoint transfer complete.
Definition dev_core.cpp:110
virtual void Stop()=0
停止 USB 设备 / Stop USB device
void DevReadEP0Data(LibXR::RawData data, size_t packet_max_length)
接收主机发送的 EP0 数据包 Receive data packet from host via EP0
Definition dev_core.cpp:248
virtual void DisableRemoteWakeup()
禁用远程唤醒功能(ClearFeature: DEVICE_REMOTE_WAKEUP) Disable remote wakeup (via ClearFeature)
Definition dev_core.hpp:322
static void OnEP0InCompleteStatic(bool in_isr, DeviceCore *self, LibXR::ConstRawData &data)
EP0 IN 端点传输完成回调(静态) EP0 IN endpoint transfer complete (static)
Definition dev_core.cpp:32
ErrorCode ClearFeature(const SetupPacket *setup, Recipient recipient)
清除功能特性 / Clear USB feature
Definition dev_core.cpp:473
uint8_t pending_addr
待设置的新地址 / Pending device address
Definition dev_core.hpp:359
ErrorCode SendDescriptor(bool in_isr, const SetupPacket *setup, Recipient recipient)
发送描述符 / Send USB descriptor
Definition dev_core.cpp:569
ErrorCode ApplyFeature(const SetupPacket *setup, Recipient recipient)
启用功能特性 / Apply USB feature
Definition dev_core.cpp:522
Speed speed
当前速度 / Current speed
Definition dev_core.hpp:354
LibXR::Callback< LibXR::ConstRawData & > ep0_in_cb
EP0 IN 回调 / EP0 IN callback.
Definition dev_core.hpp:346
DescriptorStrings strings_
字符串描述符管理 / String descriptors
Definition dev_core.hpp:339
uint8_t b_request
当前请求码 / Current request code
Definition dev_core.hpp:369
ErrorCode ProcessClassRequest(bool in_isr, const SetupPacket *setup, RequestDirection direction, Recipient recipient)
处理类请求 / Process class-specific request
Definition dev_core.cpp:691
void OnSetupPacket(bool in_isr, const SetupPacket *setup)
处理主机发送的 SETUP 包 Handle USB setup packet from host
Definition dev_core.cpp:276
ErrorCode SendConfiguration()
发送配置响应 / Send configuration
Definition dev_core.cpp:670
virtual void Init()
初始化 USB 设备 / Initialize USB device
Definition dev_core.cpp:86
virtual bool IsRemoteWakeupEnabled() const
判断当前是否允许远程唤醒 Query if remote wakeup is enabled
Definition dev_core.hpp:328
void StallControlEndpoint()
设置控制端点为 STALL / Stall control endpoint
Definition dev_core.cpp:679
void ClearControlEndpointStall()
清除控制端点 STALL / Clear control endpoint stall
Definition dev_core.cpp:685
uint8_t * out0_buffer
OUT0 缓冲区 / OUT0 buffer.
Definition dev_core.hpp:360
bool write
是否写操作 / Write operation
Definition dev_core.hpp:366
virtual ErrorCode SetAddress(uint8_t address, Context state)=0
设置设备地址(必须由子类实现) Set device address (must be implemented by subclass)
ConstRawData write_remain
剩余写数据 / Remaining write data
Definition dev_core.hpp:357
Context out0
OUT0 状态 / OUT0 context.
Definition dev_core.hpp:356
void DevWriteEP0Data(LibXR::ConstRawData data, size_t packet_max_length, size_t request_size=0)
向主机发送 EP0 数据包 Send data packet to host via EP0
Definition dev_core.cpp:199
USB描述符基类 USB descriptor base class.
Definition desc_dev.hpp:37
PacketSize0
控制端点0最大包长度枚举 Packet size for endpoint 0 (bMaxPacketSize0)
Definition desc_dev.hpp:72
USB端点基类 / USB Endpoint base class.
Definition ep.hpp:22
USB端点池类 / USB endpoint pool class.
Definition ep_pool.hpp:23
控制请求结果结构体 / Structure for control transfer results
Definition dev_core.hpp:28
RawData read_data
设备返回给主机的数据 / Data to read (to host)
Definition dev_core.hpp:29
bool write_zlp
写操作是否需要发送 0 长度包 / Send ZLP after write
Definition dev_core.hpp:33
ConstRawData write_data
主机写入设备的数据 / Data to write (from host)
Definition dev_core.hpp:30
bool read_zlp
读操作是否需要发送 0 长度包 / Send ZLP after read
Definition dev_core.hpp:32
USB 标准请求 SETUP 包(固定8字节) Standard USB setup packet (8 bytes)
Definition core.hpp:57