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;
22
29{
30 public:
31#pragma pack(push, 1)
37 struct Header
38 {
39 uint8_t bLength = 9;
41 uint16_t wTotalLength;
46 uint8_t bmAttributes;
47 uint8_t bMaxPower;
48 };
49
57 {
58 uint8_t bLength = 8;
59 uint8_t bDescriptorType = 0x0B;
65 uint8_t iFunction;
66 };
67
73 {
74 uint8_t bLength = 9;
76 0x04;
79 uint8_t bNumEndpoints;
83 uint8_t iInterface;
84 };
85
91 {
92 uint8_t bLength = 7;
94 0x05;
96 uint8_t bmAttributes;
97 uint16_t wMaxPacketSize;
98 uint8_t bInterval;
99 };
100#pragma pack(pop)
101
106 virtual void Init(EndpointPool& endpoint_pool, uint8_t start_itf_num) = 0;
107
112 virtual void Deinit(EndpointPool& endpoint_pool) = 0;
113
120 virtual ErrorCode WriteDeviceDescriptor(DeviceDescriptor& header)
121 {
122 UNUSED(header);
123 return ErrorCode::NOT_SUPPORT;
124 }
125
134 virtual ErrorCode SetAltSetting(uint8_t itf, uint8_t alt)
135 {
136 UNUSED(itf);
137 if (alt == 0)
138 {
139 return ErrorCode::OK;
140 }
141 return ErrorCode::NOT_SUPPORT;
142 }
143
152 virtual ErrorCode GetAltSetting(uint8_t itf, uint8_t& alt)
153 {
154 UNUSED(itf);
155 UNUSED(alt);
156 return ErrorCode::NOT_SUPPORT;
157 }
158
165 virtual size_t GetMaxConfigSize() = 0;
166
172 virtual size_t GetInterfaceNum() = 0;
173
181 virtual bool HasIAD() = 0;
182
183 protected:
190
197 void SetData(RawData data) { data_ = data; }
198
199 friend class ConfigDescriptor;
200
201 private:
204};
205
212{
214
215 struct Config
216 {
217 ConfigDescriptorItem** items;
218 size_t item_num;
219 };
220
221 static bool IsCompositeConfig(
222 const std::initializer_list<const std::initializer_list<ConfigDescriptorItem*>>&
223 configs);
224
225 public:
237 EndpointPool& endpoint_pool,
238 const std::initializer_list<const std::initializer_list<ConfigDescriptorItem*>>&
239 configs,
240 uint8_t bmAttributes = CFG_BUS_POWERED, uint8_t bMaxPower = 50);
241
242 ErrorCode SwitchConfig(size_t index);
243
248 void AssignEndpoints();
249
254 void ReleaseEndpoints();
255
261 ErrorCode Generate();
262
268 bool IsComposite() const;
269
277 ErrorCode OverrideDeviceDescriptor(DeviceDescriptor& descriptor);
278
284 RawData GetData() const;
285
291 size_t GetConfigNum() const;
292
298 size_t GetCurrentConfig() const;
299
305 uint16_t GetDeviceStatus() const;
306
313 ConfigDescriptorItem* GetItemByInterfaceNum(size_t index) const;
314
315 private:
316 bool ep_assigned_ = false;
317
319 uint8_t current_cfg_ = 0;
320 uint8_t i_configuration_ = 0;
321 uint8_t bm_attributes_ = 0x80;
322 uint8_t b_max_power_ = 50;
323
324 const bool COMPOSITE = false;
325 const size_t CFG_NUM = 0;
326 Config* items_ = nullptr;
327 RawData buffer_ = {nullptr, 0};
328 size_t buffer_index_ = 0;
329};
330
331} // namespace LibXR::USB
原始数据封装类。 A class for encapsulating raw data.
USB 配置描述符生成器 USB configuration descriptor generator.
Definition desc_cfg.hpp:212
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:320
uint8_t bm_attributes_
配置属性 / bmAttributes
Definition desc_cfg.hpp:321
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:319
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:316
const bool COMPOSITE
是否为复合设备 / Is composite device
Definition desc_cfg.hpp:324
size_t buffer_index_
数据写入索引 / Write index (for internal use)
Definition desc_cfg.hpp:328
void ReleaseEndpoints()
释放所有功能项占用的端点资源 Release all endpoints/resources allocated by function blocks
Definition desc_cfg.cpp:106
EndpointPool & endpoint_pool_
端点资源池 / Endpoint pool
Definition desc_cfg.hpp:318
uint8_t b_max_power_
最大电流(2mA 单位)/ Max power (2mA unit)
Definition desc_cfg.hpp:322
const size_t CFG_NUM
当前功能项数 / Current item count
Definition desc_cfg.hpp:325
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:326
RawData buffer_
拼接后的描述符缓冲区 / Assembled descriptor buffer
Definition desc_cfg.hpp:327
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:29
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:120
virtual size_t GetInterfaceNum()=0
获取该配置项包含的接口数 Get the number of interfaces included in this configuration item
virtual ErrorCode GetAltSetting(uint8_t itf, uint8_t &alt)
获取接口的备用设置 Get the alternate setting of an interface
Definition desc_cfg.hpp:152
void SetData(RawData data)
设置配置项数据 Set configuration item data
Definition desc_cfg.hpp:197
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:134
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:91
uint8_t bmAttributes
属性位 / Attributes (transfer type, sync, usage)
Definition desc_cfg.hpp:96
uint8_t bDescriptorType
描述符类型(0x05)/ Descriptor type (endpoint, 0x05)
Definition desc_cfg.hpp:93
uint8_t bLength
结构体长度 / Descriptor length (always 7)
Definition desc_cfg.hpp:92
uint16_t wMaxPacketSize
最大包长 / Max packet size
Definition desc_cfg.hpp:97
uint8_t bEndpointAddress
端点地址 / Endpoint address (IN/OUT & index)
Definition desc_cfg.hpp:95
uint8_t bInterval
轮询间隔 / Polling interval (ms/frames, per endpoint type)
Definition desc_cfg.hpp:98
配置描述符头部结构体 Configuration descriptor header (USB 2.0 Spec 9.6.3)
Definition desc_cfg.hpp:38
uint8_t bLength
结构体长度 / Descriptor length (always 9)
Definition desc_cfg.hpp:39
uint8_t bmAttributes
属性位 / Attributes bitmap
Definition desc_cfg.hpp:46
uint8_t bNumInterfaces
接口数量 / Number of interfaces
Definition desc_cfg.hpp:43
uint8_t bMaxPower
最大电流(单位2mA)/ Max power (in units of 2mA)
Definition desc_cfg.hpp:47
uint8_t bConfigurationValue
配置值 / Configuration value
Definition desc_cfg.hpp:44
uint8_t iConfiguration
字符串描述符索引 / String descriptor index
Definition desc_cfg.hpp:45
uint8_t bDescriptorType
描述符类型(0x02)/ Descriptor type (0x02)
Definition desc_cfg.hpp:40
接口关联描述符(IAD,Interface Association Descriptor) IAD descriptor structure (用于复合设备多接口归组 / used for groupi...
Definition desc_cfg.hpp:57
uint8_t bInterfaceCount
包含接口数 / Number of interfaces in this function
Definition desc_cfg.hpp:61
uint8_t bDescriptorType
描述符类型(0x0B)/ Descriptor type (IAD, 0x0B)
Definition desc_cfg.hpp:59
uint8_t bFirstInterface
第一个接口号 / First interface number
Definition desc_cfg.hpp:60
uint8_t iFunction
字符串描述符索引 / String descriptor index
Definition desc_cfg.hpp:65
uint8_t bLength
结构体长度 / Descriptor length (always 8)
Definition desc_cfg.hpp:58
uint8_t bFunctionClass
功能类代码 / Function class
Definition desc_cfg.hpp:62
uint8_t bFunctionSubClass
功能子类代码 / Function subclass
Definition desc_cfg.hpp:63
uint8_t bFunctionProtocol
功能协议代码 / Function protocol
Definition desc_cfg.hpp:64
接口描述符结构体 Interface descriptor structure (USB 2.0 Spec 9.6.5)
Definition desc_cfg.hpp:73
uint8_t bInterfaceProtocol
协议代码 / Protocol code
Definition desc_cfg.hpp:82
uint8_t bDescriptorType
描述符类型(0x04)/ Descriptor type (interface, 0x04)
Definition desc_cfg.hpp:75
uint8_t iInterface
字符串描述符索引 / String descriptor index
Definition desc_cfg.hpp:83
uint8_t bLength
结构体长度 / Descriptor length (always 9)
Definition desc_cfg.hpp:74
uint8_t bNumEndpoints
端点数量 / Number of endpoints (excluding endpoint 0)
Definition desc_cfg.hpp:79
uint8_t bAlternateSetting
备用设置号 / Alternate setting number
Definition desc_cfg.hpp:78
uint8_t bInterfaceClass
接口类 / Interface class code
Definition desc_cfg.hpp:80
uint8_t bInterfaceSubClass
接口子类 / Interface subclass code
Definition desc_cfg.hpp:81
uint8_t bInterfaceNumber
接口号 / Interface number
Definition desc_cfg.hpp:77