3using namespace LibXR::USB;
7bool ConfigDescriptor::IsCompositeConfig(
8 const std::initializer_list<
const std::initializer_list<ConfigDescriptorItem*>>&
13 if (configs.size() > 1)
17 for (
const auto& group : configs)
23 for (
const auto& item : group)
36 const std::initializer_list<
const std::initializer_list<ConfigDescriptorItem*>>&
38 uint8_t bmAttributes, uint8_t bMaxPower)
39 : endpoint_pool_(endpoint_pool),
40 bm_attributes_(bmAttributes),
41 b_max_power_(bMaxPower),
42 COMPOSITE(IsCompositeConfig(configs)),
43 CFG_NUM(configs.size()),
44 items_(new
Config[CFG_NUM])
48 size_t max_config_size = 0;
49 size_t config_index = 0;
50 for (
auto config : configs)
52 size_t config_size =
sizeof(
Header);
53 size_t item_index = 0;
54 items_[config_index].item_num = config.size();
56 for (
auto item : config)
58 config_size += item->GetMaxConfigSize();
59 items_[config_index].items[item_index] = item;
63 if (config_size > max_config_size)
65 max_config_size = config_size;
74ErrorCode ConfigDescriptor::SwitchConfig(
size_t index)
76 if (index == 0 || index >
CFG_NUM)
78 return ErrorCode::NOT_FOUND;
99 for (
size_t i = 0; i < config.item_num; ++i)
102 start_itf += config.items[i]->GetInterfaceNum();
116 for (
size_t i = 0; i < config.item_num; ++i)
124 uint8_t* buffer =
reinterpret_cast<uint8_t*
>(
buffer_.
addr_);
137 size_t offset =
sizeof(
Header);
138 uint8_t total_interfaces = 0;
142 for (
size_t i = 0; i < config.item_num; ++i)
144 auto data = config.items[i]->GetData();
147 offset += data.size_;
149 total_interfaces += config.items[i]->GetInterfaceNum();
156 return ErrorCode::OK;
165 return ErrorCode::NOT_SUPPORT;
170 if (config.item_num != 1 || config.items[0]->GetInterfaceNum() != 1)
172 return ErrorCode::NOT_SUPPORT;
193 int interface_index = -1;
194 for (
size_t i = 0; i < config.item_num; ++i)
196 interface_index += config.items[i]->GetInterfaceNum();
197 if (interface_index >=
static_cast<int>(index))
199 return config.items[i];
static void FastCopy(void *dst, const void *src, size_t size)
快速内存拷贝 / Fast memory copy
原始数据封装类。 A class for encapsulating raw data.
size_t size_
数据大小(字节)。 The size of the data (in bytes).
void * addr_
数据存储地址。 The storage address of the data.
bool IsComposite() const
判断是否为复合设备(composite device) Check if this is a composite device
RawData GetData() const
获取拼接好的配置描述符数据 Get the generated configuration descriptor data
uint8_t i_configuration_
配置字符串索引 / String descriptor index
uint8_t bm_attributes_
配置属性 / bmAttributes
uint16_t GetDeviceStatus() const
获取当前设备状态 / Get the current device status
void AssignEndpoints()
分配端点并分配总缓冲区 Assign endpoints and allocate the total config descriptor buffer
ErrorCode OverrideDeviceDescriptor(DeviceDescriptor &descriptor)
覆盖设备描述符(非IAD时可用) Override the device descriptor (can be used when not using IAD)
uint8_t current_cfg_
配置值 / Configuration value
size_t GetConfigNum() const
获取配置项数量 / Get the number of configuration items
bool ep_assigned_
端点是否已分配 / Is endpoint assigned
const bool COMPOSITE
是否为复合设备 / Is composite device
size_t buffer_index_
数据写入索引 / Write index (for internal use)
void ReleaseEndpoints()
释放所有功能项占用的端点资源 Release all endpoints/resources allocated by function blocks
EndpointPool & endpoint_pool_
端点资源池 / Endpoint pool
uint8_t b_max_power_
最大电流(2mA 单位)/ Max power (2mA unit)
const size_t CFG_NUM
当前功能项数 / Current item count
ErrorCode Generate()
生成完整的配置描述符(自动拼接 header 和所有功能项数据) Generate and assemble the full configuration descriptor (header + al...
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
Config * items_
功能项数组 / Item array
RawData buffer_
拼接后的描述符缓冲区 / Assembled descriptor buffer
size_t GetCurrentConfig() const
获取当前配置值 / Get the current configuration value
ConfigDescriptorItem * GetItemByInterfaceNum(size_t index) const
获取指定接口的配置项 / Get the configuration item by interface number
USB 配置项接口类 USB configuration item base class.
RawData GetData()
获取本配置项描述符的二进制数据 Get the binary data of this configuration item
virtual ErrorCode WriteDeviceDescriptor(DeviceDescriptor &header)
写入/补全设备描述符(非IAD情况下会被调用) Write device descriptor (non-IAD case will be called)
USB描述符基类 USB descriptor base class.
USB端点池类 / USB endpoint pool class.