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 "libxr_type.hpp"
5#include "usb/core/core.hpp"
6#include "usb/core/desc_cfg.hpp"
7#include "usb/core/ep_pool.hpp"
8
9namespace LibXR::USB
10{
11class DeviceCore;
23{
24 protected:
29 {
30 RawData read_data{nullptr, 0};
32 0};
33 bool read_zlp = false;
34 bool write_zlp = false;
35 };
36
47 virtual ErrorCode OnGetDescriptor(bool in_isr, uint8_t bRequest, uint16_t wValue,
48 uint16_t wLength, ConstRawData &need_write)
49 {
50 UNUSED(in_isr);
51 UNUSED(bRequest);
52 UNUSED(wValue);
53 UNUSED(wLength);
54 UNUSED(need_write);
55 return ErrorCode::NOT_SUPPORT;
56 }
57
69 virtual ErrorCode OnClassRequest(bool in_isr, uint8_t bRequest, uint16_t wValue,
70 uint16_t wLength, uint16_t wIndex,
71 RequestResult &result)
72 {
73 UNUSED(in_isr);
74 UNUSED(bRequest);
75 UNUSED(wValue);
76 UNUSED(wLength);
77 UNUSED(wIndex);
78 UNUSED(result);
79 return ErrorCode::NOT_SUPPORT;
80 }
81
90 virtual ErrorCode OnClassData(bool in_isr, uint8_t bRequest, LibXR::ConstRawData &data)
91 {
92 UNUSED(in_isr);
93 UNUSED(bRequest);
94 UNUSED(data);
95 return ErrorCode::NOT_SUPPORT;
96 }
97
109 virtual ErrorCode OnVendorRequest(bool in_isr, uint8_t bRequest, uint16_t wValue,
110 uint16_t wLength, uint16_t wIndex,
111 RequestResult &result)
112 {
113 UNUSED(in_isr);
114 UNUSED(bRequest);
115 UNUSED(wValue);
116 UNUSED(wLength);
117 UNUSED(wIndex);
118 UNUSED(result);
119 return ErrorCode::NOT_SUPPORT;
120 }
121
122 friend class DeviceCore;
123};
124
136{
137 public:
151
166 EndpointPool &ep_pool, USBSpec spec, Speed speed,
167 DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid, uint16_t bcd,
168 const std::initializer_list<const DescriptorStrings::LanguagePack *> &lang_list,
169 const std::initializer_list<const std::initializer_list<ConfigDescriptorItem *>>
170 &configs,
171 ConstRawData uid = {nullptr, 0});
172
177 virtual void Init();
178
183 virtual void Deinit();
184
189 virtual void Start() = 0;
190
195 virtual void Stop() = 0;
196
204 void OnSetupPacket(bool in_isr, const SetupPacket *setup);
205
206 private:
211 static void OnEP0OutCompleteStatic(bool in_isr, DeviceCore *self,
213
218 static void OnEP0InCompleteStatic(bool in_isr, DeviceCore *self,
220
224 static bool IsValidUSBCombination(USBSpec spec, Speed speed,
226
230 void OnEP0OutComplete(bool in_isr, LibXR::ConstRawData &data);
231
235 void OnEP0InComplete(bool in_isr, LibXR::ConstRawData &data);
236
241 void ReadZLP(Context context = Context::ZLP);
242
247 void WriteZLP(Context context = Context::ZLP);
248
257 void DevWriteEP0Data(LibXR::ConstRawData data, size_t packet_max_length,
258 size_t request_size = 0, bool early_read_zlp = false);
259
266 void DevReadEP0Data(LibXR::RawData data, size_t packet_max_length);
267
272 ErrorCode ProcessStandardRequest(bool in_isr, const SetupPacket *&setup,
273 RequestDirection direction, Recipient recipient);
274
278 ErrorCode RespondWithStatus(const SetupPacket *setup, Recipient recipient);
279
283 ErrorCode ClearFeature(const SetupPacket *setup, Recipient recipient);
284
288 ErrorCode ApplyFeature(const SetupPacket *setup, Recipient recipient);
289
293 ErrorCode SendDescriptor(bool in_isr, const SetupPacket *setup, Recipient recipient);
294
298 ErrorCode PrepareAddressChange(uint16_t address);
299
303 ErrorCode SwitchConfiguration(uint16_t value);
304
308 ErrorCode SendConfiguration();
309
314
319
323 ErrorCode ProcessClassRequest(bool in_isr, const SetupPacket *setup,
324 RequestDirection direction, Recipient recipient);
325
329 ErrorCode ProcessVendorRequest(bool in_isr, const SetupPacket *&setup,
330 RequestDirection direction, Recipient recipient);
331
339 virtual ErrorCode SetAddress(uint8_t address, Context state) = 0;
340
345 virtual void EnableRemoteWakeup() {}
346
351 virtual void DisableRemoteWakeup() {}
352
357 virtual bool IsRemoteWakeupEnabled() const { return false; }
358
363 Speed GetSpeed() const;
364
365 private:
369
370 struct
371 {
373 Endpoint *in0 = nullptr;
374 Endpoint *out0 = nullptr;
378 } endpoint_;
379
380 struct
381 {
382 bool inited = false;
383 Speed speed = Speed::FULL;
388 uint8_t pending_addr = 0xFF;
389 uint8_t *out0_buffer = nullptr;
390 bool need_write_zlp = false;
391 } state_;
392
393 struct
394 {
395 bool write = false;
396 bool read = false;
398 uint8_t b_request = 0;
400 } class_req_;
401};
402} // 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:23
virtual ErrorCode OnClassData(bool in_isr, uint8_t bRequest, LibXR::ConstRawData &data)
处理类请求的数据阶段 Handle data stage for class request
Definition dev_core.hpp:90
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:47
virtual ErrorCode OnVendorRequest(bool in_isr, uint8_t bRequest, uint16_t wValue, uint16_t wLength, uint16_t wIndex, RequestResult &result)
处理厂商自定义请求 / Handle vendor request
Definition dev_core.hpp:109
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:69
USB 设备协议栈核心类,负责端点 0 控制传输及配置、描述符、标准请求处理等。 USB device protocol stack core class. Handles EP0 control tr...
Definition dev_core.hpp:136
ErrorCode SwitchConfiguration(uint16_t value)
切换配置 / Switch USB configuration
Definition dev_core.cpp:673
virtual void EnableRemoteWakeup()
启用远程唤醒功能(SetFeature: DEVICE_REMOTE_WAKEUP) Enable remote wakeup (via SetFeature)
Definition dev_core.hpp:345
ConfigDescriptor config_desc_
配置描述符 / Config descriptor
Definition dev_core.hpp:366
Endpoint * out0
控制 OUT 端点指针 / Control OUT endpoint
Definition dev_core.hpp:374
static void OnEP0OutCompleteStatic(bool in_isr, DeviceCore *self, LibXR::ConstRawData &data)
EP0 OUT 端点传输完成回调(静态) EP0 OUT endpoint transfer complete (static)
Definition dev_core.cpp:35
ErrorCode PrepareAddressChange(uint16_t address)
预设地址变更 / Prepare address change
Definition dev_core.cpp:665
bool need_write_zlp
是否需要写 ZLP / Need to write ZLP
Definition dev_core.hpp:390
Endpoint * in0
控制 IN 端点指针 / Control IN endpoint
Definition dev_core.hpp:373
ErrorCode RespondWithStatus(const SetupPacket *setup, Recipient recipient)
返回状态响应 / Respond with status stage
Definition dev_core.cpp:447
void DevWriteEP0Data(LibXR::ConstRawData data, size_t packet_max_length, size_t request_size=0, bool early_read_zlp=false)
向主机发送 EP0 数据包 Send data packet to host via EP0
Definition dev_core.cpp:216
ConstRawData data
当前数据 / Current data
Definition dev_core.hpp:399
Context in0
IN0 状态 / IN0 context.
Definition dev_core.hpp:384
ErrorCode ProcessStandardRequest(bool in_isr, const SetupPacket *&setup, RequestDirection direction, Recipient recipient)
处理标准请求 Process standard USB requests
Definition dev_core.cpp:338
static bool IsValidUSBCombination(USBSpec spec, Speed speed, DeviceDescriptor::PacketSize0 packet_size)
检查 USB 组合是否合法 / Check if USB combination is valid
Definition dev_core.cpp:47
LibXR::Callback< LibXR::ConstRawData & > ep0_out_cb
EP0 OUT 回调 / EP0 OUT callback.
Definition dev_core.hpp:377
EndpointPool & pool
端点池 / Endpoint pool
Definition dev_core.hpp:372
Context
控制传输状态枚举 / Control transfer context enum
Definition dev_core.hpp:142
@ SETUP
SETUP 阶段 / Setup stage.
Definition dev_core.hpp:144
@ UNKNOW
未知 / Unknown
Definition dev_core.hpp:143
@ STATUS_IN
状态 IN 阶段 / Status in stage
Definition dev_core.hpp:148
@ DATA_OUT
数据 OUT 阶段 / Data out stage
Definition dev_core.hpp:145
@ STATUS_OUT
状态 OUT 阶段 / Status out stage
Definition dev_core.hpp:146
@ DATA_IN
数据 IN 阶段 / Data in stage
Definition dev_core.hpp:147
@ ZLP
0 长度包 / Zero-length packet
Definition dev_core.hpp:149
DeviceClass * class_ptr
当前类指针 / Current device class pointer
Definition dev_core.hpp:397
virtual void Start()=0
启动 USB 设备 / Start USB device
RawData read_remain
剩余读数据 / Remaining read data
Definition dev_core.hpp:387
void ReadZLP(Context context=Context::ZLP)
接收 0 长度包 / Receive zero-length packet (ZLP)
Definition dev_core.cpp:83
bool read
是否读操作 / Read operation
Definition dev_core.hpp:396
ErrorCode ProcessVendorRequest(bool in_isr, const SetupPacket *&setup, RequestDirection direction, Recipient recipient)
处理厂商请求 / Process vendor-specific request
Definition dev_core.cpp:815
DeviceDescriptor device_desc_
设备描述符 / Device descriptor
Definition dev_core.hpp:367
virtual void Deinit()
反初始化 USB 设备 / Deinitialize USB device
Definition dev_core.cpp:111
void OnEP0InComplete(bool in_isr, LibXR::ConstRawData &data)
EP0 IN 端点传输完成回调 / EP0 IN endpoint transfer complete.
Definition dev_core.cpp:169
Speed GetSpeed() const
获取当前 USB 速度 / Get current USB speed
Definition dev_core.cpp:924
bool inited
是否初始化 / Initialized
Definition dev_core.hpp:382
void WriteZLP(Context context=Context::ZLP)
发送 0 长度包 / Send zero-length packet (ZLP)
Definition dev_core.cpp:89
void OnEP0OutComplete(bool in_isr, LibXR::ConstRawData &data)
EP0 OUT 端点传输完成回调 / EP0 OUT endpoint transfer complete.
Definition dev_core.cpp:119
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:265
virtual void DisableRemoteWakeup()
禁用远程唤醒功能(ClearFeature: DEVICE_REMOTE_WAKEUP) Disable remote wakeup (via ClearFeature)
Definition dev_core.hpp:351
static void OnEP0InCompleteStatic(bool in_isr, DeviceCore *self, LibXR::ConstRawData &data)
EP0 IN 端点传输完成回调(静态) EP0 IN endpoint transfer complete (static)
Definition dev_core.cpp:41
ErrorCode ClearFeature(const SetupPacket *setup, Recipient recipient)
清除功能特性 / Clear USB feature
Definition dev_core.cpp:490
uint8_t pending_addr
待设置的新地址 / Pending device address
Definition dev_core.hpp:388
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:5
ErrorCode SendDescriptor(bool in_isr, const SetupPacket *setup, Recipient recipient)
发送描述符 / Send USB descriptor
Definition dev_core.cpp:586
ErrorCode ApplyFeature(const SetupPacket *setup, Recipient recipient)
启用功能特性 / Apply USB feature
Definition dev_core.cpp:539
Speed speed
当前速度 / Current speed
Definition dev_core.hpp:383
LibXR::Callback< LibXR::ConstRawData & > ep0_in_cb
EP0 IN 回调 / EP0 IN callback.
Definition dev_core.hpp:375
DescriptorStrings strings_
字符串描述符管理 / String descriptors
Definition dev_core.hpp:368
uint8_t b_request
当前请求码 / Current request code
Definition dev_core.hpp:398
ErrorCode ProcessClassRequest(bool in_isr, const SetupPacket *setup, RequestDirection direction, Recipient recipient)
处理类请求 / Process class-specific request
Definition dev_core.cpp:712
void OnSetupPacket(bool in_isr, const SetupPacket *setup)
处理主机发送的 SETUP 包 Handle USB setup packet from host
Definition dev_core.cpp:293
ErrorCode SendConfiguration()
发送配置响应 / Send configuration
Definition dev_core.cpp:691
virtual void Init()
初始化 USB 设备 / Initialize USB device
Definition dev_core.cpp:95
virtual bool IsRemoteWakeupEnabled() const
判断当前是否允许远程唤醒 Query if remote wakeup is enabled
Definition dev_core.hpp:357
void StallControlEndpoint()
设置控制端点为 STALL / Stall control endpoint
Definition dev_core.cpp:700
void ClearControlEndpointStall()
清除控制端点 STALL / Clear control endpoint stall
Definition dev_core.cpp:706
uint8_t * out0_buffer
OUT0 缓冲区 / OUT0 buffer.
Definition dev_core.hpp:389
bool write
是否写操作 / Write operation
Definition dev_core.hpp:395
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:386
Context out0
OUT0 状态 / OUT0 context.
Definition dev_core.hpp:385
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:23
USB端点池类 / USB endpoint pool class.
Definition ep_pool.hpp:23
控制请求结果结构体 / Structure for control transfer results
Definition dev_core.hpp:29
RawData read_data
设备返回给主机的数据 / Data to read (to host)
Definition dev_core.hpp:30
bool write_zlp
写操作是否需要发送 0 长度包 / Send ZLP after write
Definition dev_core.hpp:34
ConstRawData write_data
主机写入设备的数据 / Data to write (from host)
Definition dev_core.hpp:31
bool read_zlp
读操作是否需要发送 0 长度包 / Send ZLP after read
Definition dev_core.hpp:33
USB 标准请求 SETUP 包(固定8字节) Standard USB setup packet (8 bytes)
Definition core.hpp:57