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, RequestResult &result)
69 {
70 UNUSED(in_isr);
71 UNUSED(bRequest);
72 UNUSED(wValue);
73 UNUSED(wLength);
74 UNUSED(result);
75 return ErrorCode::NOT_SUPPORT;
76 }
77
86 virtual ErrorCode OnClassData(bool in_isr, uint8_t bRequest, LibXR::ConstRawData &data)
87 {
88 UNUSED(in_isr);
89 UNUSED(bRequest);
90 UNUSED(data);
91 return ErrorCode::NOT_SUPPORT;
92 }
93
94 friend class DeviceCore;
95};
96
108{
109 public:
123
137 EndpointPool &ep_pool, USBSpec spec, Speed speed,
138 DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid, uint16_t bcd,
139 const std::initializer_list<const DescriptorStrings::LanguagePack *> &lang_list,
140 const std::initializer_list<const std::initializer_list<ConfigDescriptorItem *>>
141 &configs);
142
147 virtual void Init();
148
153 virtual void Deinit();
154
159 virtual void Start() = 0;
160
165 virtual void Stop() = 0;
166
174 void OnSetupPacket(bool in_isr, const SetupPacket *setup);
175
176 private:
181 static void OnEP0OutCompleteStatic(bool in_isr, DeviceCore *self,
182 LibXR::ConstRawData &data);
183
188 static void OnEP0InCompleteStatic(bool in_isr, DeviceCore *self,
189 LibXR::ConstRawData &data);
190
194 static bool IsValidUSBCombination(USBSpec spec, Speed speed,
196
200 void OnEP0OutComplete(bool in_isr, LibXR::ConstRawData &data);
201
205 void OnEP0InComplete(bool in_isr, LibXR::ConstRawData &data);
206
211 void ReadZLP(Context context = Context::ZLP);
212
217 void WriteZLP(Context context = Context::ZLP);
218
226 void DevWriteEP0Data(LibXR::ConstRawData data, size_t packet_max_length,
227 size_t request_size = 0);
228
235 void DevReadEP0Data(LibXR::RawData data, size_t packet_max_length);
236
241 ErrorCode ProcessStandardRequest(bool in_isr, const SetupPacket *&setup,
242 RequestDirection direction, Recipient recipient);
243
247 ErrorCode RespondWithStatus(const SetupPacket *setup, Recipient recipient);
248
252 ErrorCode ClearFeature(const SetupPacket *setup, Recipient recipient);
253
257 ErrorCode ApplyFeature(const SetupPacket *setup, Recipient recipient);
258
262 ErrorCode SendDescriptor(bool in_isr, const SetupPacket *setup, Recipient recipient);
263
267 ErrorCode PrepareAddressChange(uint16_t address);
268
272 ErrorCode SwitchConfiguration(uint16_t value);
273
277 ErrorCode SendConfiguration();
278
283
288
292 ErrorCode ProcessClassRequest(bool in_isr, const SetupPacket *setup,
293 RequestDirection direction, Recipient recipient);
294
298 ErrorCode ProcessVendorRequest(bool in_isr, const SetupPacket *&setup,
299 RequestDirection direction, Recipient recipient);
300
308 virtual ErrorCode SetAddress(uint8_t address, Context state) = 0;
309
314 virtual void EnableRemoteWakeup() {}
315
320 virtual void DisableRemoteWakeup() {}
321
326 virtual bool IsRemoteWakeupEnabled() const { return false; }
327
332 Speed GetSpeed() const;
333
334 private:
338
339 struct
340 {
342 Endpoint *in0 = nullptr;
343 Endpoint *out0 = nullptr;
346 } endpoint_;
347
348 struct
349 {
350 bool inited = false;
351 Speed speed = Speed::FULL;
356 uint8_t pending_addr = 0xFF;
357 uint8_t *out0_buffer = nullptr;
358 bool need_write_zlp = false;
359 } state_;
360
361 struct
362 {
363 bool write = false;
364 bool read = false;
366 uint8_t b_request = 0;
367 } class_req_;
368};
369} // 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:212
USB 配置项接口类 USB configuration item base class.
Definition desc_cfg.hpp:29
字符串描述符管理器 / 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:86
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, 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:108
ErrorCode SwitchConfiguration(uint16_t value)
切换配置 / Switch USB configuration
Definition dev_core.cpp:648
virtual void EnableRemoteWakeup()
启用远程唤醒功能(SetFeature: DEVICE_REMOTE_WAKEUP) Enable remote wakeup (via SetFeature)
Definition dev_core.hpp:314
ConfigDescriptor config_desc_
配置描述符 / Config descriptor
Definition dev_core.hpp:335
Endpoint * out0
控制 OUT 端点指针 / Control OUT endpoint
Definition dev_core.hpp:343
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:640
bool need_write_zlp
是否需要写 ZLP / Need to write ZLP
Definition dev_core.hpp:358
Endpoint * in0
控制 IN 端点指针 / Control IN endpoint
Definition dev_core.hpp:342
ErrorCode RespondWithStatus(const SetupPacket *setup, Recipient recipient)
返回状态响应 / Respond with status stage
Definition dev_core.cpp:426
Context in0
IN0 状态 / IN0 context.
Definition dev_core.hpp:352
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:345
EndpointPool & pool
端点池 / Endpoint pool
Definition dev_core.hpp:341
Context
控制传输状态枚举 / Control transfer context enum
Definition dev_core.hpp:114
@ SETUP
SETUP 阶段 / Setup stage.
Definition dev_core.hpp:116
@ UNKNOW
未知 / Unknown
Definition dev_core.hpp:115
@ STATUS_IN
状态 IN 阶段 / Status in stage
Definition dev_core.hpp:120
@ DATA_OUT
数据 OUT 阶段 / Data out stage
Definition dev_core.hpp:117
@ STATUS_OUT
状态 OUT 阶段 / Status out stage
Definition dev_core.hpp:118
@ DATA_IN
数据 IN 阶段 / Data in stage
Definition dev_core.hpp:119
@ ZLP
0 长度包 / Zero-length packet
Definition dev_core.hpp:121
DeviceClass * class_ptr
当前类指针 / Current device class pointer
Definition dev_core.hpp:365
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:355
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:364
ErrorCode ProcessVendorRequest(bool in_isr, const SetupPacket *&setup, RequestDirection direction, Recipient recipient)
处理厂商请求 / Process vendor-specific request
Definition dev_core.cpp:742
DeviceDescriptor device_desc_
设备描述符 / Device descriptor
Definition dev_core.hpp:336
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:755
bool inited
是否初始化 / Initialized
Definition dev_core.hpp:350
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:320
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:469
uint8_t pending_addr
待设置的新地址 / Pending device address
Definition dev_core.hpp:356
ErrorCode SendDescriptor(bool in_isr, const SetupPacket *setup, Recipient recipient)
发送描述符 / Send USB descriptor
Definition dev_core.cpp:565
ErrorCode ApplyFeature(const SetupPacket *setup, Recipient recipient)
启用功能特性 / Apply USB feature
Definition dev_core.cpp:518
Speed speed
当前速度 / Current speed
Definition dev_core.hpp:351
LibXR::Callback< LibXR::ConstRawData & > ep0_in_cb
EP0 IN 回调 / EP0 IN callback.
Definition dev_core.hpp:344
DescriptorStrings strings_
字符串描述符管理 / String descriptors
Definition dev_core.hpp:337
uint8_t b_request
当前请求码 / Current request code
Definition dev_core.hpp:366
ErrorCode ProcessClassRequest(bool in_isr, const SetupPacket *setup, RequestDirection direction, Recipient recipient)
处理类请求 / Process class-specific request
Definition dev_core.cpp:687
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:666
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:326
void StallControlEndpoint()
设置控制端点为 STALL / Stall control endpoint
Definition dev_core.cpp:675
void ClearControlEndpointStall()
清除控制端点 STALL / Clear control endpoint stall
Definition dev_core.cpp:681
uint8_t * out0_buffer
OUT0 缓冲区 / OUT0 buffer.
Definition dev_core.hpp:357
bool write
是否写操作 / Write operation
Definition dev_core.hpp:363
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:354
Context out0
OUT0 状态 / OUT0 context.
Definition dev_core.hpp:353
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