libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
desc_cfg.hpp
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <functional>
6
7#include "core.hpp"
8#include "desc_dev.hpp"
9#include "ep_pool.hpp"
10#include "lockfree_list.hpp"
11#include "lockfree_pool.hpp"
12
13namespace LibXR::USB
14{
15// USB 配置描述符属性标志(bmAttributes 位定义)
16// USB configuration descriptor attribute bits (bmAttributes)
17constexpr uint8_t CFG_BUS_POWERED = 0x80;
18constexpr uint8_t CFG_SELF_POWERED = 0x40;
19constexpr uint8_t CFG_REMOTE_WAKEUP = 0x20;
20
21class ConfigDescriptor;
22class DeviceCore;
23
30{
31 public:
32#pragma pack(push, 1)
38 struct Header
39 {
40 uint8_t bLength = 9;
42 uint16_t wTotalLength;
47 uint8_t bmAttributes;
48 uint8_t bMaxPower;
49 };
50
58 {
59 uint8_t bLength = 8;
60 uint8_t bDescriptorType = 0x0B;
66 uint8_t iFunction;
67 };
68
74 {
75 uint8_t bLength = 9;
77 0x04;
80 uint8_t bNumEndpoints;
84 uint8_t iInterface;
85 };
86
92 {
93 uint8_t bLength = 7;
95 0x05;
97 uint8_t bmAttributes;
98 uint16_t wMaxPacketSize;
99 uint8_t bInterval;
100 };
101#pragma pack(pop)
102
107 virtual void Init(EndpointPool& endpoint_pool, uint8_t start_itf_num) = 0;
108
113 virtual void Deinit(EndpointPool& endpoint_pool) = 0;
114
121 virtual ErrorCode WriteDeviceDescriptor(DeviceDescriptor& header)
122 {
123 UNUSED(header);
124 return ErrorCode::NOT_SUPPORT;
125 }
126
135 virtual ErrorCode SetAltSetting(uint8_t itf, uint8_t alt)
136 {
137 UNUSED(itf);
138 if (alt == 0)
139 {
140 return ErrorCode::OK;
141 }
142 return ErrorCode::NOT_SUPPORT;
143 }
144
153 virtual ErrorCode GetAltSetting(uint8_t itf, uint8_t& alt)
154 {
155 UNUSED(itf);
156 UNUSED(alt);
157 return ErrorCode::NOT_SUPPORT;
158 }
159
168 virtual bool OwnsEndpoint(uint8_t ep_addr) const
169 {
170 UNUSED(ep_addr);
171 return false;
172 }
173
180 virtual size_t GetMaxConfigSize() = 0;
181
187 virtual size_t GetInterfaceNum() = 0;
188
196 virtual bool HasIAD() = 0;
197
198 protected:
205
212 void SetData(RawData data) { data_ = data; }
213
214 friend class ConfigDescriptor;
215
216 private:
219};
220
227{
229
230 struct Config
231 {
232 ConfigDescriptorItem** items;
233 size_t item_num;
234 };
235
236 static bool IsCompositeConfig(
237 const std::initializer_list<const std::initializer_list<ConfigDescriptorItem*>>&
238 configs);
239
240 public:
252 EndpointPool& endpoint_pool,
253 const std::initializer_list<const std::initializer_list<ConfigDescriptorItem*>>&
254 configs,
255 uint8_t bmAttributes = CFG_BUS_POWERED, uint8_t bMaxPower = 50);
256
257 ErrorCode SwitchConfig(size_t index);
258
263 void AssignEndpoints();
264
269 void ReleaseEndpoints();
270
276 ErrorCode Generate();
277
283 bool IsComposite() const;
284
292 ErrorCode OverrideDeviceDescriptor(DeviceDescriptor& descriptor);
293
299 RawData GetData() const;
300
306 size_t GetConfigNum() const;
307
313 size_t GetCurrentConfig() const;
314
320 uint16_t GetDeviceStatus() const;
321
328 ConfigDescriptorItem* GetItemByInterfaceNum(size_t index) const;
329
336 ConfigDescriptorItem* GetItemByEndpointAddr(uint8_t addr) const;
337
338 private:
339 bool ep_assigned_ = false;
340
342 uint8_t current_cfg_ = 0;
343 uint8_t i_configuration_ = 0;
344 uint8_t bm_attributes_ = 0x80;
345 uint8_t b_max_power_ = 50;
346
347 const bool COMPOSITE = false;
348 const size_t CFG_NUM = 0;
349 Config* items_ = nullptr;
350 RawData buffer_ = {nullptr, 0};
351 size_t buffer_index_ = 0;
352};
353
354} // namespace LibXR::USB
原始数据封装类。 A class for encapsulating raw data.
USB 配置描述符生成器 USB configuration descriptor generator.
Definition desc_cfg.hpp:227
bool IsComposite() const
判断是否为复合设备(composite device) Check if this is a composite device
Definition desc_cfg.cpp:159
RawData GetData() const
获取拼接好的配置描述符数据 Get the generated configuration descriptor data
Definition desc_cfg.cpp:178
uint8_t i_configuration_
配置字符串索引 / String descriptor index
Definition desc_cfg.hpp:343
uint8_t bm_attributes_
配置属性 / bmAttributes
Definition desc_cfg.hpp:344
uint16_t GetDeviceStatus() const
获取当前设备状态 / Get the current device status
Definition desc_cfg.cpp:184
void AssignEndpoints()
分配端点并分配总缓冲区 Assign endpoints and allocate the total config descriptor buffer
Definition desc_cfg.cpp:87
ErrorCode OverrideDeviceDescriptor(DeviceDescriptor &descriptor)
覆盖设备描述符(非IAD时可用) Override the device descriptor (can be used when not using IAD)
Definition desc_cfg.cpp:161
uint8_t current_cfg_
配置值 / Configuration value
Definition desc_cfg.hpp:342
size_t GetConfigNum() const
获取配置项数量 / Get the number of configuration items
Definition desc_cfg.cpp:180
bool ep_assigned_
端点是否已分配 / Is endpoint assigned
Definition desc_cfg.hpp:339
const bool COMPOSITE
是否为复合设备 / Is composite device
Definition desc_cfg.hpp:347
size_t buffer_index_
数据写入索引 / Write index (for internal use)
Definition desc_cfg.hpp:351
ConfigDescriptorItem * GetItemByEndpointAddr(uint8_t addr) const
获取指定端点的配置项 / Get the configuration item by endpoint address
Definition desc_cfg.cpp:205
void ReleaseEndpoints()
释放所有功能项占用的端点资源 Release all endpoints/resources allocated by function blocks
Definition desc_cfg.cpp:106
EndpointPool & endpoint_pool_
端点资源池 / Endpoint pool
Definition desc_cfg.hpp:341
uint8_t b_max_power_
最大电流(2mA 单位)/ Max power (2mA unit)
Definition desc_cfg.hpp:345
const size_t CFG_NUM
当前功能项数 / Current item count
Definition desc_cfg.hpp:348
ErrorCode Generate()
生成完整的配置描述符(自动拼接 header 和所有功能项数据) Generate and assemble the full configuration descriptor (header + al...
Definition desc_cfg.cpp:122
ConfigDescriptor(EndpointPool &endpoint_pool, const std::initializer_list< const std::initializer_list< ConfigDescriptorItem * > > &configs, uint8_t bmAttributes=CFG_BUS_POWERED, uint8_t bMaxPower=50)
构造函数,初始化配置项存储和属性 Constructor: setup item list and descriptor attributes
Definition desc_cfg.cpp:34
Config * items_
功能项数组 / Item array
Definition desc_cfg.hpp:349
RawData buffer_
拼接后的描述符缓冲区 / Assembled descriptor buffer
Definition desc_cfg.hpp:350
size_t GetCurrentConfig() const
获取当前配置值 / Get the current configuration value
Definition desc_cfg.cpp:182
ConfigDescriptorItem * GetItemByInterfaceNum(size_t index) const
获取指定接口的配置项 / Get the configuration item by interface number
Definition desc_cfg.cpp:190
USB 配置项接口类 USB configuration item base class.
Definition desc_cfg.hpp:30
virtual void Deinit(EndpointPool &endpoint_pool)=0
USB配置描述符反初始化,派生类在此处释放端点
RawData GetData()
获取本配置项描述符的二进制数据 Get the binary data of this configuration item
Definition desc_cfg.cpp:5
virtual bool HasIAD()=0
判断是否包含IAD Check if this configuration item contains IAD
virtual ErrorCode WriteDeviceDescriptor(DeviceDescriptor &header)
写入/补全设备描述符(非IAD情况下会被调用) Write device descriptor (non-IAD case will be called)
Definition desc_cfg.hpp:121
virtual size_t GetInterfaceNum()=0
获取该配置项包含的接口数 Get the number of interfaces included in this configuration item
virtual bool OwnsEndpoint(uint8_t ep_addr) const
判断是否拥有该端点 Check if this configuration item owns this endpoint
Definition desc_cfg.hpp:168
virtual ErrorCode GetAltSetting(uint8_t itf, uint8_t &alt)
获取接口的备用设置 Get the alternate setting of an interface
Definition desc_cfg.hpp:153
void SetData(RawData data)
设置配置项数据 Set configuration item data
Definition desc_cfg.hpp:212
virtual void Init(EndpointPool &endpoint_pool, uint8_t start_itf_num)=0
USB配置描述符初始化,派生类在此处申请端点
virtual ErrorCode SetAltSetting(uint8_t itf, uint8_t alt)
设置接口的备用设置 Set the alternate setting of an interface
Definition desc_cfg.hpp:135
virtual size_t GetMaxConfigSize()=0
获取该配置项的最大描述符长度 Get the maximum descriptor length of this configuration item
USB描述符基类 USB descriptor base class.
Definition desc_dev.hpp:37
USB端点池类 / USB endpoint pool class.
Definition ep_pool.hpp:23
端点描述符结构体 Endpoint descriptor structure (USB 2.0 Spec 9.6.6)
Definition desc_cfg.hpp:92
uint8_t bmAttributes
属性位 / Attributes (transfer type, sync, usage)
Definition desc_cfg.hpp:97
uint8_t bDescriptorType
描述符类型(0x05)/ Descriptor type (endpoint, 0x05)
Definition desc_cfg.hpp:94
uint8_t bLength
结构体长度 / Descriptor length (always 7)
Definition desc_cfg.hpp:93
uint16_t wMaxPacketSize
最大包长 / Max packet size
Definition desc_cfg.hpp:98
uint8_t bEndpointAddress
端点地址 / Endpoint address (IN/OUT & index)
Definition desc_cfg.hpp:96
uint8_t bInterval
轮询间隔 / Polling interval (ms/frames, per endpoint type)
Definition desc_cfg.hpp:99
配置描述符头部结构体 Configuration descriptor header (USB 2.0 Spec 9.6.3)
Definition desc_cfg.hpp:39
uint8_t bLength
结构体长度 / Descriptor length (always 9)
Definition desc_cfg.hpp:40
uint8_t bmAttributes
属性位 / Attributes bitmap
Definition desc_cfg.hpp:47
uint8_t bNumInterfaces
接口数量 / Number of interfaces
Definition desc_cfg.hpp:44
uint8_t bMaxPower
最大电流(单位2mA)/ Max power (in units of 2mA)
Definition desc_cfg.hpp:48
uint8_t bConfigurationValue
配置值 / Configuration value
Definition desc_cfg.hpp:45
uint8_t iConfiguration
字符串描述符索引 / String descriptor index
Definition desc_cfg.hpp:46
uint8_t bDescriptorType
描述符类型(0x02)/ Descriptor type (0x02)
Definition desc_cfg.hpp:41
接口关联描述符(IAD,Interface Association Descriptor) IAD descriptor structure (用于复合设备多接口归组 / used for groupi...
Definition desc_cfg.hpp:58
uint8_t bInterfaceCount
包含接口数 / Number of interfaces in this function
Definition desc_cfg.hpp:62
uint8_t bDescriptorType
描述符类型(0x0B)/ Descriptor type (IAD, 0x0B)
Definition desc_cfg.hpp:60
uint8_t bFirstInterface
第一个接口号 / First interface number
Definition desc_cfg.hpp:61
uint8_t iFunction
字符串描述符索引 / String descriptor index
Definition desc_cfg.hpp:66
uint8_t bLength
结构体长度 / Descriptor length (always 8)
Definition desc_cfg.hpp:59
uint8_t bFunctionClass
功能类代码 / Function class
Definition desc_cfg.hpp:63
uint8_t bFunctionSubClass
功能子类代码 / Function subclass
Definition desc_cfg.hpp:64
uint8_t bFunctionProtocol
功能协议代码 / Function protocol
Definition desc_cfg.hpp:65
接口描述符结构体 Interface descriptor structure (USB 2.0 Spec 9.6.5)
Definition desc_cfg.hpp:74
uint8_t bInterfaceProtocol
协议代码 / Protocol code
Definition desc_cfg.hpp:83
uint8_t bDescriptorType
描述符类型(0x04)/ Descriptor type (interface, 0x04)
Definition desc_cfg.hpp:76
uint8_t iInterface
字符串描述符索引 / String descriptor index
Definition desc_cfg.hpp:84
uint8_t bLength
结构体长度 / Descriptor length (always 9)
Definition desc_cfg.hpp:75
uint8_t bNumEndpoints
端点数量 / Number of endpoints (excluding endpoint 0)
Definition desc_cfg.hpp:80
uint8_t bAlternateSetting
备用设置号 / Alternate setting number
Definition desc_cfg.hpp:79
uint8_t bInterfaceClass
接口类 / Interface class code
Definition desc_cfg.hpp:81
uint8_t bInterfaceSubClass
接口子类 / Interface subclass code
Definition desc_cfg.hpp:82
uint8_t bInterfaceNumber
接口号 / Interface number
Definition desc_cfg.hpp:78