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 <initializer_list>
6
7#include "bos.hpp"
8#include "core.hpp"
9#include "desc_dev.hpp"
10#include "ep_pool.hpp"
11#include "libxr_type.hpp"
12
13namespace LibXR::USB
14{
19constexpr uint8_t CFG_BUS_POWERED = 0x80;
20constexpr uint8_t CFG_SELF_POWERED = 0x40;
21constexpr uint8_t CFG_REMOTE_WAKEUP = 0x20;
22
23class ConfigDescriptor;
24class DeviceCore;
25
37{
38 public:
39 virtual ~ConfigDescriptorItem() = default;
40
41#pragma pack(push, 1)
45 struct Header
46 {
47 uint8_t bLength = 9;
49 uint16_t wTotalLength;
53 uint8_t bmAttributes;
54 uint8_t bMaxPower;
55 };
56
61 {
62 uint8_t bLength = 8;
63 uint8_t bDescriptorType = 0x0B;
69 uint8_t iFunction;
70 };
71
76 {
77 uint8_t bLength = 9;
78 uint8_t bDescriptorType = 0x04;
81 uint8_t bNumEndpoints;
85 uint8_t iInterface;
86 };
87
92 {
93 uint8_t bLength = 7;
94 uint8_t bDescriptorType = 0x05;
96 uint8_t bmAttributes;
97 uint16_t wMaxPacketSize;
98 uint8_t bInterval;
99 };
100#pragma pack(pop)
101
108 virtual void BindEndpoints(EndpointPool& endpoint_pool, uint8_t start_itf_num,
109 bool in_isr) = 0;
110
116 virtual void UnbindEndpoints(EndpointPool& endpoint_pool, bool in_isr) = 0;
117
123 virtual ErrorCode WriteDeviceDescriptor(DeviceDescriptor& header)
124 {
125 UNUSED(header);
126 return ErrorCode::NOT_SUPPORT;
127 }
128
135 virtual ErrorCode SetAltSetting(uint8_t itf, uint8_t alt)
136 {
137 UNUSED(itf);
138 return (alt == 0) ? ErrorCode::OK : ErrorCode::NOT_SUPPORT;
139 }
140
147 virtual ErrorCode GetAltSetting(uint8_t itf, uint8_t& alt)
148 {
149 UNUSED(itf);
150 UNUSED(alt);
151 return ErrorCode::NOT_SUPPORT;
152 }
153
159 virtual bool OwnsEndpoint(uint8_t ep_addr) const
160 {
161 UNUSED(ep_addr);
162 return false;
163 }
164
169 virtual size_t GetMaxConfigSize() = 0;
170
175 virtual size_t GetInterfaceCount() = 0;
176
181 virtual bool HasIAD() = 0;
182
183 protected:
189
194 void SetData(RawData data) { data_ = data; }
195
196 friend class ConfigDescriptor;
197
198 private:
199 RawData data_{nullptr, 0};
200};
201
207{
209
213 struct Config
214 {
216 size_t item_num = 0;
217 };
218
219 static bool IsCompositeConfig(
220 const std::initializer_list<const std::initializer_list<ConfigDescriptorItem*>>&
221 configs);
222
223 public:
234 EndpointPool& endpoint_pool,
235 const std::initializer_list<const std::initializer_list<ConfigDescriptorItem*>>&
236 configs,
237 uint8_t bmAttributes = CFG_BUS_POWERED, uint8_t bMaxPower = 50);
238
245 ErrorCode SwitchConfig(size_t index, bool in_isr);
246
251 void BindEndpoints(bool in_isr);
252
257 void UnbindEndpoints(bool in_isr);
258
263 ErrorCode BuildConfigDescriptor();
264
269 [[nodiscard]] bool IsComposite() const;
270
274 void RebuildBosCache();
275
280 [[nodiscard]] bool CanOverrideDeviceDescriptor() const;
281
287 ErrorCode OverrideDeviceDescriptor(DeviceDescriptor& descriptor);
288
293 [[nodiscard]] RawData GetData() const;
294
299 [[nodiscard]] size_t GetConfigNum() const;
300
305 [[nodiscard]] size_t GetCurrentConfig() const;
306
311 [[nodiscard]] uint16_t GetDeviceStatus() const;
312
318 [[nodiscard]] ConfigDescriptorItem* FindItemByInterfaceNumber(size_t index) const;
319
325 [[nodiscard]] ConfigDescriptorItem* FindItemByEndpointAddress(uint8_t addr) const;
326
327 private:
328 bool ep_assigned_ = false;
329
331 uint8_t current_cfg_ = 0;
332 uint8_t i_configuration_ = 0;
333 uint8_t bm_attributes_ = CFG_BUS_POWERED;
334 uint8_t b_max_power_ = 50;
335
336 const bool COMPOSITE = false;
337 const size_t CFG_NUM = 0;
338 Config* items_ = nullptr;
339
340 RawData buffer_{nullptr, 0};
341 size_t buffer_index_ = 0;
342};
343
344} // namespace LibXR::USB
原始数据封装类。 A class for encapsulating raw data.
BOS 能力提供者接口 / BOS capability provider interface.
Definition bos.hpp:87
BOS 管理器:能力收集、BOS 描述符拼装、Vendor 请求链式分发 BOS manager: capability collection, descriptor building,...
Definition bos.hpp:116
配置描述符管理与构建器,并聚合 BOS 能力 Configuration descriptor builder with BOS aggregation.
Definition desc_cfg.hpp:207
bool IsComposite() const
是否为复合设备 / Whether composite device
Definition desc_cfg.cpp:363
RawData GetData() const
获取配置描述符数据 / Get configuration descriptor data
Definition desc_cfg.cpp:381
ConfigDescriptorItem * FindItemByInterfaceNumber(size_t index) const
按接口号查找配置项 / Find item by interface number
Definition desc_cfg.cpp:393
uint8_t i_configuration_
配置字符串索引 / Configuration string index
Definition desc_cfg.hpp:332
uint8_t bm_attributes_
配置属性 / bmAttributes
Definition desc_cfg.hpp:333
bool CanOverrideDeviceDescriptor() const
是否允许覆盖设备描述符 / Whether device descriptor override is allowed
Definition desc_cfg.cpp:147
uint16_t GetDeviceStatus() const
设备状态(GET_STATUS)/ Device status (GET_STATUS)
Definition desc_cfg.cpp:387
ErrorCode OverrideDeviceDescriptor(DeviceDescriptor &descriptor)
覆盖设备描述符 / Override device descriptor
Definition desc_cfg.cpp:365
uint8_t current_cfg_
当前配置索引 / Current configuration index
Definition desc_cfg.hpp:331
void BindEndpoints(bool in_isr)
绑定当前配置端点 / Bind endpoints for current configuration
Definition desc_cfg.cpp:275
size_t GetConfigNum() const
配置数量 / Number of configurations
Definition desc_cfg.cpp:383
bool ep_assigned_
端点是否已绑定 / Whether endpoints are assigned
Definition desc_cfg.hpp:328
ConfigDescriptorItem * FindItemByEndpointAddress(uint8_t addr) const
按端点地址查找配置项 / Find item by endpoint address
Definition desc_cfg.cpp:416
const bool COMPOSITE
是否为复合设备 / Whether composite device
Definition desc_cfg.hpp:336
size_t buffer_index_
缓冲区写入位置 / Buffer write index
Definition desc_cfg.hpp:341
ErrorCode BuildConfigDescriptor()
构建当前配置描述符 / Build current configuration descriptor
Definition desc_cfg.cpp:320
EndpointPool & endpoint_pool_
端点池引用 / Endpoint pool reference
Definition desc_cfg.hpp:330
static bool IsCompositeConfig(const std::initializer_list< const std::initializer_list< ConfigDescriptorItem * > > &configs)
Definition desc_cfg.cpp:160
uint8_t b_max_power_
最大电流(2mA 单位)/ Max power (2mA units)
Definition desc_cfg.hpp:334
const size_t CFG_NUM
配置数量 / Configuration count
Definition desc_cfg.hpp:337
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
Definition desc_cfg.cpp:212
void RebuildBosCache()
重建 BOS 缓存 / Rebuild BOS cache
Definition desc_cfg.cpp:178
Config * items_
配置项集合 / Configuration item set
Definition desc_cfg.hpp:338
RawData buffer_
配置描述符缓冲区 / Configuration descriptor buffer
Definition desc_cfg.hpp:340
size_t GetCurrentConfig() const
当前配置索引 / Current configuration index
Definition desc_cfg.cpp:385
ErrorCode SwitchConfig(size_t index, bool in_isr)
切换当前 configuration / Switch current configuration
Definition desc_cfg.cpp:260
void UnbindEndpoints(bool in_isr)
解绑当前配置端点 / Unbind endpoints for current configuration
Definition desc_cfg.cpp:299
USB 配置项基类(功能块)/ USB configuration item base (functional block)
Definition desc_cfg.hpp:37
virtual size_t GetInterfaceCount()=0
接口数量 / Number of interfaces contributed
virtual void BindEndpoints(EndpointPool &endpoint_pool, uint8_t start_itf_num, bool in_isr)=0
绑定端点资源 / Bind endpoint resources
RawData GetData()
获取内部数据缓存 / Get internal data cache
Definition desc_cfg.cpp:176
RawData data_
内部数据缓存 / Internal data cache
Definition desc_cfg.hpp:199
virtual bool HasIAD()=0
是否包含 IAD / Whether an IAD is used
virtual ErrorCode WriteDeviceDescriptor(DeviceDescriptor &header)
可选:覆盖设备描述符字段 / Optional: override device descriptor fields
Definition desc_cfg.hpp:123
virtual void UnbindEndpoints(EndpointPool &endpoint_pool, bool in_isr)=0
解绑端点资源 / Unbind endpoint resources
virtual bool OwnsEndpoint(uint8_t ep_addr) const
可选:端点归属判定 / Optional: endpoint ownership
Definition desc_cfg.hpp:159
virtual ErrorCode GetAltSetting(uint8_t itf, uint8_t &alt)
可选:获取接口备用设置 / Optional: get interface alternate setting
Definition desc_cfg.hpp:147
void SetData(RawData data)
设置内部数据缓存 / Set internal data cache
Definition desc_cfg.hpp:194
virtual ErrorCode SetAltSetting(uint8_t itf, uint8_t alt)
可选:设置接口备用设置 / Optional: set interface alternate setting
Definition desc_cfg.hpp:135
virtual size_t GetMaxConfigSize()=0
最大配置描述符占用 / Maximum bytes required in configuration descriptor
USB描述符基类 USB descriptor base class.
Definition desc_dev.hpp:40
USB端点池类 / USB endpoint pool class.
Definition ep_pool.hpp:23
单个 configuration 的配置项集合 / Item set for one configuration
Definition desc_cfg.hpp:214
size_t item_num
配置项数量 / Item count
Definition desc_cfg.hpp:216
ConfigDescriptorItem ** items
配置项指针表 / Item pointer table
Definition desc_cfg.hpp:215
端点描述符(7 字节)/ Endpoint descriptor (7 bytes)
Definition desc_cfg.hpp:92
uint8_t bmAttributes
端点属性 / Endpoint attributes
Definition desc_cfg.hpp:96
uint8_t bDescriptorType
描述符类型 / Descriptor type
Definition desc_cfg.hpp:94
uint8_t bLength
描述符长度 / Descriptor length
Definition desc_cfg.hpp:93
uint16_t wMaxPacketSize
最大包长 / Maximum packet size
Definition desc_cfg.hpp:97
uint8_t bEndpointAddress
端点地址 / Endpoint address
Definition desc_cfg.hpp:95
uint8_t bInterval
轮询间隔 / Polling interval
Definition desc_cfg.hpp:98
配置描述符头(9 字节)/ Configuration descriptor header (9 bytes)
Definition desc_cfg.hpp:46
uint8_t bLength
描述符长度 / Descriptor length
Definition desc_cfg.hpp:47
uint8_t bmAttributes
属性位 / Attributes
Definition desc_cfg.hpp:53
uint8_t bNumInterfaces
接口数量 / Number of interfaces
Definition desc_cfg.hpp:50
uint8_t bMaxPower
最大电流(2mA 单位)/ Max power (2mA units)
Definition desc_cfg.hpp:54
uint8_t bConfigurationValue
配置值 / Configuration value
Definition desc_cfg.hpp:51
uint8_t iConfiguration
配置字符串索引 / Configuration string index
Definition desc_cfg.hpp:52
uint16_t wTotalLength
配置总长度 / Total configuration length
Definition desc_cfg.hpp:49
uint8_t bDescriptorType
描述符类型(0x02)/ Descriptor type (0x02)
Definition desc_cfg.hpp:48
IAD(8 字节)/ Interface Association Descriptor (8 bytes)
Definition desc_cfg.hpp:61
uint8_t bInterfaceCount
接口数量 / Interface count
Definition desc_cfg.hpp:65
uint8_t bDescriptorType
描述符类型 / Descriptor type
Definition desc_cfg.hpp:63
uint8_t bFirstInterface
首接口号 / First interface number
Definition desc_cfg.hpp:64
uint8_t iFunction
功能字符串索引 / Function string index
Definition desc_cfg.hpp:69
uint8_t bLength
描述符长度 / Descriptor length
Definition desc_cfg.hpp:62
uint8_t bFunctionClass
功能类 / Function class
Definition desc_cfg.hpp:66
uint8_t bFunctionSubClass
功能子类 / Function subclass
Definition desc_cfg.hpp:67
uint8_t bFunctionProtocol
功能协议 / Function protocol
Definition desc_cfg.hpp:68
接口描述符(9 字节)/ Interface descriptor (9 bytes)
Definition desc_cfg.hpp:76
uint8_t bInterfaceProtocol
接口协议 / Interface protocol
Definition desc_cfg.hpp:84
uint8_t bDescriptorType
描述符类型 / Descriptor type
Definition desc_cfg.hpp:78
uint8_t iInterface
接口字符串索引 / Interface string index
Definition desc_cfg.hpp:85
uint8_t bLength
描述符长度 / Descriptor length
Definition desc_cfg.hpp:77
uint8_t bNumEndpoints
端点数量 / Number of endpoints
Definition desc_cfg.hpp:81
uint8_t bAlternateSetting
备用设置号 / Alternate setting
Definition desc_cfg.hpp:80
uint8_t bInterfaceClass
接口类 / Interface class
Definition desc_cfg.hpp:82
uint8_t bInterfaceSubClass
接口子类 / Interface subclass
Definition desc_cfg.hpp:83
uint8_t bInterfaceNumber
接口号 / Interface number
Definition desc_cfg.hpp:79