libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
LibXR::USB::DeviceComposition Class Reference

USB 组合管理器:class 列表、字符串、BOS、配置切换 USB composition manager: class list, strings, BOS, and configuration switching. More...

#include <device_composition.hpp>

Collaboration diagram for LibXR::USB::DeviceComposition:
[legend]

Data Structures

struct  ConfigItems
 单个 configuration 的扁平 item 表 Flattened item table for one configuration. More...
 

Public Member Functions

 DeviceComposition (EndpointPool &endpoint_pool, const std::initializer_list< const DescriptorStrings::LanguagePack * > &lang_list, const std::initializer_list< const std::initializer_list< ConfigDescriptorItem * > > &configs, ConstRawData uid={nullptr, 0}, uint8_t bmAttributes=CFG_BUS_POWERED, uint8_t bMaxPower=50)
 构造 USB 组合管理器 Construct the USB composition manager.
 
 DeviceComposition (const DeviceComposition &)=delete
 
DeviceCompositionoperator= (const DeviceComposition &)=delete
 
 DeviceComposition (DeviceComposition &&)=delete
 
DeviceCompositionoperator= (DeviceComposition &&)=delete
 
void Init (bool in_isr)
 初始化当前 configuration 的运行态资源 Initialize runtime resources for the active configuration.
 
void Deinit (bool in_isr)
 释放当前 configuration 的运行态资源 Release runtime resources for the active configuration.
 
ErrorCode SwitchConfig (size_t index, bool in_isr)
 切换到指定 configuration value Switch to the given configuration value.
 
ErrorCode BuildConfigDescriptor ()
 生成当前 configuration 描述符缓存 Build the current configuration descriptor cache.
 
RawData GetConfigDescriptor () const
 获取当前 configuration 描述符缓存 Get the current configuration descriptor cache.
 
ConstRawData GetBosDescriptor ()
 获取当前 BOS 描述符缓存 / Get the current BOS descriptor cache
 
ErrorCode ProcessBosVendorRequest (bool in_isr, const SetupPacket *setup, BosVendorResult &result)
 分发 BOS vendor request / Dispatch BOS vendor requests
 
ErrorCode GetStringDescriptor (uint8_t string_index, uint16_t lang, ConstRawData &data)
 获取字符串描述符(含 interface string) Get a string descriptor, including runtime-generated interface strings.
 
bool IsComposite () const
 是否为复合设备 / Whether this is a composite device
 
ErrorCode TryOverrideDeviceDescriptor (DeviceDescriptor &descriptor)
 用当前配置覆盖 device descriptor 的类字段 Try to override device-descriptor class fields from the current configuration.
 
size_t GetConfigNum () const
 配置数量 / Number of configurations
 
size_t GetCurrentConfig () const
 当前 configuration value / Current configuration value
 
uint16_t GetDeviceStatus () const
 设备 GET_STATUS 返回值 / Device-level GET_STATUS value
 
DeviceClassFindClassByInterfaceNumber (size_t index) const
 按接口号查找所属 class Find the owning class by interface number.
 
DeviceClassFindClassByEndpointAddress (uint8_t addr) const
 按端点地址查找所属 class Find the owning class by endpoint address.
 

Private Member Functions

const ConfigItemsCurrentConfigItems () const
 获取当前激活 configuration 的扁平 item 表 Get the flattened item table of the active configuration.
 
void BindEndpoints (bool in_isr)
 绑定当前配置的全部端点 / Bind all endpoints for the active configuration
 
void UnbindEndpoints (bool in_isr)
 解绑当前配置的全部端点 / Unbind all endpoints for the active configuration
 
void RebuildBosCache ()
 按当前配置重建 BOS capability 缓存 Rebuild the BOS capability cache from the active configuration.
 
void RegisterInterfaceStrings ()
 为所有 class 分配并登记 interface string 索引 Allocate and register interface-string indices for all classes.
 
ErrorCode GenerateInterfaceString (uint8_t string_index, ConstRawData &data)
 运行时生成 interface string 描述符 Generate one interface-string descriptor at runtime.
 

Private Attributes

bool configured_ = false
 是否已进入非 0 配置态 / Whether a non-zero config is active
 
bool ep_assigned_ = false
 端点是否已绑定 / Whether endpoints are assigned
 
EndpointPoolendpoint_pool_
 端点池引用 / Endpoint pool reference
 
uint8_t current_cfg_ = 0
 当前配置索引 / Current configuration index
 
uint8_t i_configuration_ = 0
 配置字符串索引 / Configuration string index
 
uint8_t bm_attributes_ = CFG_BUS_POWERED
 配置属性 / bmAttributes
 
const bool composite_ = false
 是否为复合设备 / Whether composite device
 
const size_t config_num_ = 0
 配置数量 / Configuration count
 
ConfigItemsitems_ = nullptr
 配置项集合 / Configuration item set
 
DeviceClass ** classes_ = nullptr
 唯一 class 表 / Unique class table
 
size_t class_count_ = 0
 唯一 class 数量 / Unique class count
 
DescriptorStrings strings_
 字符串描述符管理 / String descriptor manager
 
const char ** interface_strings_
 接口字符串源表 / Interface string source table
 
size_t interface_string_count_
 接口字符串总数量 / Total interface string count
 
RawData interface_string_buffer_
 临时字符串描述符缓冲区 / Temp interface string descriptor buffer
 
BosManager bos_
 BOS 聚合管理 / BOS aggregation manager.
 
ConfigDescriptor config_desc_
 配置描述符构造器 / Configuration descriptor builder
 

Detailed Description

USB 组合管理器:class 列表、字符串、BOS、配置切换 USB composition manager: class list, strings, BOS, and configuration switching.

Definition at line 20 of file device_composition.hpp.

Constructor & Destructor Documentation

◆ DeviceComposition()

DeviceComposition::DeviceComposition ( EndpointPool & endpoint_pool,
const std::initializer_list< const DescriptorStrings::LanguagePack * > & lang_list,
const std::initializer_list< const std::initializer_list< ConfigDescriptorItem * > > & configs,
ConstRawData uid = {nullptr, 0},
uint8_t bmAttributes = CFG_BUS_POWERED,
uint8_t bMaxPower = 50 )

构造 USB 组合管理器 Construct the USB composition manager.

负责把 class/config/string/BOS 相关静态信息整理成 DeviceCore 可直接使用的形态。 This flattens class/config/string/BOS metadata into the shape consumed by DeviceCore.

Definition at line 345 of file device_composition.cpp.

351 : endpoint_pool_(endpoint_pool),
352 bm_attributes_(bmAttributes),
353 composite_(is_composite_device(configs)),
354 config_num_(configs.size()),
355 items_(new ConfigItems[config_num_]),
356 classes_(new DeviceClass*[calc_total_item_num(configs)]),
357 strings_(lang_list, reinterpret_cast<const uint8_t*>(uid.addr_), uid.size_),
358 bos_(calc_bos_descriptor_size_max(configs), calc_bos_capability_num_max(configs)),
359 config_desc_(ConfigDescriptor::CalcMaxConfigSize(configs), bmAttributes, bMaxPower)
360{
361 ASSERT(config_num_ > 0);
362
363 // 将所有配置项整理成:
364 // 1) 每个 configuration 自己的 item 表
365 // 2) 一份用于字符串注册的唯一 class 表
366 // Flatten every configuration item into:
367 // 1) per-config item tables for descriptor building / binding
368 // 2) one unique class table for string registration
369 size_t config_index = 0;
370 for (const auto& cfg_group : configs)
371 {
372 items_[config_index].item_num = cfg_group.size();
373 items_[config_index].items = new ConfigDescriptorItem*[cfg_group.size()];
374
375 size_t item_index = 0;
376 for (auto* item : cfg_group)
377 {
378 items_[config_index].items[item_index++] = item;
379 auto* device_class = static_cast<DeviceClass*>(item);
380 if (device_class != nullptr &&
381 !contains_class(classes_, class_count_, device_class))
382 {
383 classes_[class_count_++] = device_class;
384 }
385 }
386
387 ++config_index;
388 }
389
390 // 初始化阶段一次性算出接口字符串容量和最大描述符空间。
391 // Pre-compute interface-string storage once during initialization.
392 const auto interface_string_layout =
393 calc_interface_string_layout(classes_, class_count_);
394 interface_string_count_ = interface_string_layout.count;
396 {
398 interface_string_buffer_.addr_ = new uint8_t[interface_string_layout.max_len + 2];
399 interface_string_buffer_.size_ = interface_string_layout.max_len + 2;
400 }
401
403}
size_t size_
数据大小(字节)。 The size of the data (in bytes).
const void * addr_
数据存储地址(常量)。 The storage address of the data (constant).
size_t size_
数据大小(字节)。 The size of the data (in bytes).
void * addr_
数据存储地址。 The storage address of the data.
static size_t CalcMaxConfigSize(const std::initializer_list< const std::initializer_list< ConfigDescriptorItem * > > &configs)
计算所有 configuration 中需要的最大缓冲区大小 Calculate the maximum buffer size required across all configurations.
Definition desc_cfg.cpp:55
USB 配置项基类(功能块)/ USB configuration item base (functional block)
Definition desc_cfg.hpp:36
USB 设备类接口基类 / USB device class interface base.
size_t class_count_
唯一 class 数量 / Unique class count
void RegisterInterfaceStrings()
为所有 class 分配并登记 interface string 索引 Allocate and register interface-string indices for all classes.
ConfigItems * items_
配置项集合 / Configuration item set
DeviceClass ** classes_
唯一 class 表 / Unique class table
const bool composite_
是否为复合设备 / Whether composite device
const size_t config_num_
配置数量 / Configuration count
uint8_t bm_attributes_
配置属性 / bmAttributes
const char ** interface_strings_
接口字符串源表 / Interface string source table
EndpointPool & endpoint_pool_
端点池引用 / Endpoint pool reference
DescriptorStrings strings_
字符串描述符管理 / String descriptor manager
BosManager bos_
BOS 聚合管理 / BOS aggregation manager.
RawData interface_string_buffer_
临时字符串描述符缓冲区 / Temp interface string descriptor buffer
size_t interface_string_count_
接口字符串总数量 / Total interface string count
ConfigDescriptor config_desc_
配置描述符构造器 / Configuration descriptor builder
ConfigDescriptorItem ** items
配置项指针表 / Item pointer table
size_t item_num
配置项数量 / Item count

Member Function Documentation

◆ BindEndpoints()

void DeviceComposition::BindEndpoints ( bool in_isr)
private

绑定当前配置的全部端点 / Bind all endpoints for the active configuration

Definition at line 599 of file device_composition.cpp.

600{
601 if (ep_assigned_)
602 {
603 return;
604 }
605 ep_assigned_ = true;
606
607 const auto& config = CurrentConfigItems();
608
609 // start_itf tracks the configuration-global interface number assigned to each class.
610 // start_itf 记录 configuration 级别的全局接口号分配游标。
611 size_t start_itf = 0;
612 for (size_t i = 0; i < config.item_num; ++i)
613 {
614 auto* item = config.items[i];
615 if (item == nullptr)
616 {
617 continue;
618 }
619
620 item->BindEndpoints(endpoint_pool_, static_cast<uint8_t>(start_itf), in_isr);
621 start_itf += item->GetInterfaceCount();
622 }
623}
const ConfigItems & CurrentConfigItems() const
获取当前激活 configuration 的扁平 item 表 Get the flattened item table of the active configuration.
bool ep_assigned_
端点是否已绑定 / Whether endpoints are assigned

◆ BuildConfigDescriptor()

LibXR::ErrorCode DeviceComposition::BuildConfigDescriptor ( )

生成当前 configuration 描述符缓存 Build the current configuration descriptor cache.

Definition at line 454 of file device_composition.cpp.

455{
456 // ConfigDescriptor 只构建当前激活的 configuration;
457 // current_cfg_ 同时决定 item 表和对外可见的 bConfigurationValue。
458 // ConfigDescriptor builds the active configuration only;
459 // current_cfg_ supplies both the item table and the externally visible
460 // bConfigurationValue.
461 const auto& config = CurrentConfigItems();
462 return config_desc_.BuildConfigDescriptor(config.items, config.item_num,
463 static_cast<uint8_t>(current_cfg_ + 1),
465}
ErrorCode BuildConfigDescriptor(ConfigDescriptorItem *const *items, size_t item_num, uint8_t configuration_value, uint8_t i_configuration=0)
构建指定 configuration 的描述符 Build the descriptor for the specified configuration.
Definition desc_cfg.cpp:62
uint8_t i_configuration_
配置字符串索引 / Configuration string index
uint8_t current_cfg_
当前配置索引 / Current configuration index

◆ CurrentConfigItems()

const DeviceComposition::ConfigItems & DeviceComposition::CurrentConfigItems ( ) const
nodiscardprivate

获取当前激活 configuration 的扁平 item 表 Get the flattened item table of the active configuration.

Definition at line 405 of file device_composition.cpp.

406{
407 ASSERT(config_num_ > 0);
408 ASSERT(current_cfg_ < config_num_);
409 return items_[current_cfg_];
410}

◆ Deinit()

void DeviceComposition::Deinit ( bool in_isr)

释放当前 configuration 的运行态资源 Release runtime resources for the active configuration.

Definition at line 421 of file device_composition.cpp.

422{
423 UnbindEndpoints(in_isr);
424 configured_ = false;
425 current_cfg_ = 0;
426}
bool configured_
是否已进入非 0 配置态 / Whether a non-zero config is active
void UnbindEndpoints(bool in_isr)
解绑当前配置的全部端点 / Unbind all endpoints for the active configuration

◆ FindClassByEndpointAddress()

DeviceClass * DeviceComposition::FindClassByEndpointAddress ( uint8_t addr) const
nodiscard

按端点地址查找所属 class Find the owning class by endpoint address.

Definition at line 573 of file device_composition.cpp.

574{
575 if (!configured_)
576 {
577 return nullptr;
578 }
579
580 const auto& config = CurrentConfigItems();
581
582 for (size_t i = 0; i < config.item_num; ++i)
583 {
584 auto* item = config.items[i];
585 if (item == nullptr)
586 {
587 continue;
588 }
589
590 if (item->OwnsEndpoint(addr))
591 {
592 return static_cast<DeviceClass*>(item);
593 }
594 }
595
596 return nullptr;
597}

◆ FindClassByInterfaceNumber()

DeviceClass * DeviceComposition::FindClassByInterfaceNumber ( size_t index) const
nodiscard

按接口号查找所属 class Find the owning class by interface number.

Definition at line 541 of file device_composition.cpp.

542{
543 if (!configured_)
544 {
545 return nullptr;
546 }
547
548 const auto& config = CurrentConfigItems();
549
550 // 每个 item 都声明自己占用的接口数量;
551 // 沿扁平表前进,直到目标接口落入某个 item 的区间。
552 // Each item reports how many interfaces it occupies; walk the flattened list
553 // until the requested interface falls into one item's local range.
554 int interface_index = -1;
555 for (size_t i = 0; i < config.item_num; ++i)
556 {
557 auto* item = config.items[i];
558 if (item == nullptr)
559 {
560 continue;
561 }
562
563 interface_index += static_cast<int>(item->GetInterfaceCount());
564 if (interface_index >= static_cast<int>(index))
565 {
566 return static_cast<DeviceClass*>(item);
567 }
568 }
569
570 return nullptr;
571}

◆ GenerateInterfaceString()

LibXR::ErrorCode DeviceComposition::GenerateInterfaceString ( uint8_t string_index,
ConstRawData & data )
private

运行时生成 interface string 描述符 Generate one interface-string descriptor at runtime.

Definition at line 676 of file device_composition.cpp.

678{
679 // 接口字符串位于内建 manufacturer/product/serial 之后的索引区间。
680 // Interface strings live after the built-in manufacturer/product/serial range.
681 const size_t base_index =
683 if (string_index <= base_index)
684 {
686 }
687
688 const size_t extra_index = static_cast<size_t>(string_index - base_index - 1u);
689 if (extra_index >= interface_string_count_ || interface_string_buffer_.addr_ == nullptr)
690 {
692 }
693
694 uint8_t* buffer = reinterpret_cast<uint8_t*>(interface_string_buffer_.addr_);
695 const char* str = interface_strings_[extra_index];
696 const size_t utf16_len = calc_utf16le_len_runtime(str);
697 ASSERT(utf16_len + 2 <= 255);
698
699 // USB 字符串描述符格式:[bLength][bDescriptorType=0x03][UTF-16LE payload...]
700 // USB string descriptor layout: [bLength][bDescriptorType=0x03][UTF-16LE payload...]
701 buffer[1] = 0x03;
702 buffer[0] = static_cast<uint8_t>(utf16_len + 2);
703 to_utf16le(str, buffer + 2);
706}
常量原始数据封装类。 A class for encapsulating constant raw data.
@ SERIAL_NUMBER_STRING
序列号字符串索引 / Serial number string
@ NOT_FOUND
未找到 | Not found
@ OK
操作成功 | Operation successful

◆ GetBosDescriptor()

ConstRawData DeviceComposition::GetBosDescriptor ( )
nodiscard

获取当前 BOS 描述符缓存 / Get the current BOS descriptor cache

Definition at line 469 of file device_composition.cpp.

469{ return bos_.GetBosDescriptor(); }
ConstRawData GetBosDescriptor()
构建 BOS 描述符(BOS 头 + 能力块) Build BOS descriptor (header + blocks).
Definition bos.hpp:158

◆ GetConfigDescriptor()

RawData DeviceComposition::GetConfigDescriptor ( ) const
nodiscard

获取当前 configuration 描述符缓存 Get the current configuration descriptor cache.

Definition at line 467 of file device_composition.cpp.

467{ return config_desc_.GetData(); }
RawData GetData() const
获取配置描述符数据 / Get configuration descriptor data
Definition desc_cfg.cpp:111

◆ GetConfigNum()

size_t DeviceComposition::GetConfigNum ( ) const
nodiscard

配置数量 / Number of configurations

Definition at line 528 of file device_composition.cpp.

528{ return config_num_; }

◆ GetCurrentConfig()

size_t DeviceComposition::GetCurrentConfig ( ) const
nodiscard

当前 configuration value / Current configuration value

Definition at line 530 of file device_composition.cpp.

531{
532 return configured_ ? static_cast<size_t>(current_cfg_ + 1u) : 0u;
533}

◆ GetDeviceStatus()

uint16_t DeviceComposition::GetDeviceStatus ( ) const
nodiscard

设备 GET_STATUS 返回值 / Device-level GET_STATUS value

Definition at line 535 of file device_composition.cpp.

536{
537 return ((bm_attributes_ & CFG_SELF_POWERED) ? 0x01 : 0x00) |
538 ((bm_attributes_ & CFG_REMOTE_WAKEUP) ? 0x02 : 0x00);
539}

◆ GetStringDescriptor()

LibXR::ErrorCode DeviceComposition::GetStringDescriptor ( uint8_t string_index,
uint16_t lang,
ConstRawData & data )

获取字符串描述符(含 interface string) Get a string descriptor, including runtime-generated interface strings.

Definition at line 478 of file device_composition.cpp.

480{
481 if (string_index == 0)
482 {
485 }
486
487 if (string_index > static_cast<uint8_t>(DescriptorStrings::Index::SERIAL_NUMBER_STRING))
488 {
489 // 接口字符串与内建字符串集合共用同一套语言号校验。
490 // Interface strings share the same language gate as the built-in string set.
491 if (!strings_.HasLanguage(lang))
492 {
494 }
495 return GenerateInterfaceString(string_index, data);
496 }
497
498 auto ec =
499 strings_.GenerateString(static_cast<DescriptorStrings::Index>(string_index), lang);
500 if (ec != LibXR::ErrorCode::OK)
501 {
502 return ec;
503 }
504
505 data = ConstRawData(strings_.GetData());
507}
bool HasLanguage(uint16_t lang) const
检查是否注册了指定语言 / Check whether the given language is registered
Definition desc_str.cpp:151
RawData GetData()
获取当前构建好的字符串描述符数据 Get the descriptor buffer
Definition desc_str.cpp:139
RawData GetLangIDData()
获取语言ID描述符内容 Get LangID descriptor data
Definition desc_str.cpp:146
Index
描述符字符串索引 / USB descriptor string index
Definition desc_str.hpp:21
ErrorCode GenerateString(Index index, uint16_t lang)
生成指定语言和索引的字符串描述符 Generate USB string descriptor for given language and string index
Definition desc_str.cpp:58
ErrorCode GenerateInterfaceString(uint8_t string_index, ConstRawData &data)
运行时生成 interface string 描述符 Generate one interface-string descriptor at runtime.

◆ Init()

void DeviceComposition::Init ( bool in_isr)

初始化当前 configuration 的运行态资源 Initialize runtime resources for the active configuration.

Definition at line 412 of file device_composition.cpp.

413{
414 // Init 先绑定端点,再按当前激活配置重建 BOS 视图。
415 // Init binds endpoints first, then rebuilds the BOS view for the active configuration.
416 configured_ = false;
417 BindEndpoints(in_isr);
419}
void BindEndpoints(bool in_isr)
绑定当前配置的全部端点 / Bind all endpoints for the active configuration
void RebuildBosCache()
按当前配置重建 BOS capability 缓存 Rebuild the BOS capability cache from the active configuration.

◆ IsComposite()

bool DeviceComposition::IsComposite ( ) const
nodiscard

是否为复合设备 / Whether this is a composite device

Definition at line 509 of file device_composition.cpp.

509{ return composite_; }

◆ ProcessBosVendorRequest()

LibXR::ErrorCode DeviceComposition::ProcessBosVendorRequest ( bool in_isr,
const SetupPacket * setup,
BosVendorResult & result )

分发 BOS vendor request / Dispatch BOS vendor requests

Definition at line 471 of file device_composition.cpp.

474{
475 return bos_.ProcessVendorRequest(in_isr, setup, result);
476}
ErrorCode ProcessVendorRequest(bool in_isr, const SetupPacket *setup, BosVendorResult &result)
Vendor 请求分发 / Vendor request dispatch.
Definition bos.hpp:234

◆ RebuildBosCache()

void DeviceComposition::RebuildBosCache ( )
private

按当前配置重建 BOS capability 缓存 Rebuild the BOS capability cache from the active configuration.

Definition at line 648 of file device_composition.cpp.

649{
650 // BOS capability 只从当前激活的 configuration 收集。
651 // BOS capabilities are collected from the active configuration only.
653 const auto& config = CurrentConfigItems();
654 for (size_t i = 0; i < config.item_num; ++i)
655 {
656 auto* item = config.items[i];
657 if (item == nullptr)
658 {
659 continue;
660 }
661
662 const size_t capability_num = item->GetBosCapabilityCount();
663 for (size_t j = 0; j < capability_num; ++j)
664 {
665 auto* cap = item->GetBosCapability(j);
666 if (cap != nullptr)
667 {
668 bos_.AddCapability(cap);
669 }
670 }
671 }
672
673 (void)bos_.GetBosDescriptor();
674}
bool AddCapability(BosCapability *cap)
添加能力 / Add capability
Definition bos.hpp:142
void ClearCapabilities()
清空已注册能力 / Clear registered capabilities
Definition bos.hpp:134

◆ RegisterInterfaceStrings()

void DeviceComposition::RegisterInterfaceStrings ( )
private

为所有 class 分配并登记 interface string 索引 Allocate and register interface-string indices for all classes.

Definition at line 708 of file device_composition.cpp.

709{
711 {
712 return;
713 }
714
715 // USB 字符串索引 1..3 保留给厂商/产品/序列号。
716 // USB string indices 1..3 are reserved for manufacturer/product/serial.
717 uint8_t next_index =
718 static_cast<uint8_t>(DescriptorStrings::Index::SERIAL_NUMBER_STRING) + 1u;
719 size_t registered_count = 0u;
720
721 for (size_t class_index = 0; class_index < class_count_; ++class_index)
722 {
723 auto* device_class = classes_[class_index];
724 if (device_class == nullptr)
725 {
726 continue;
727 }
728
729 const size_t interface_num = device_class->GetInterfaceCount();
730 device_class->SetInterfaceStringBaseIndex(0u);
731 bool class_has_string = false;
732
733 for (size_t i = 0; i < interface_num; ++i)
734 {
735 const char* str = device_class->GetInterfaceString(i);
736 if (str == nullptr || str[0] == '\0')
737 {
738 continue;
739 }
740
741 // 这里保留一张扁平源字符串表,
742 // 这样 DeviceCore 之后按索引取接口字符串时,不必再重新遍历全部 class。
743 // 保留一张扁平源字符串表,
744 // 这样 DeviceCore 之后可以按索引重新生成任意接口字符串,而不必重扫全部 class。
745 // Keep a flat source-string table so DeviceCore can later regenerate any
746 // interface string by index without re-scanning all classes.
747 ASSERT(registered_count < interface_string_count_);
748 if (!class_has_string)
749 {
750 device_class->SetInterfaceStringBaseIndex(next_index);
751 class_has_string = true;
752 }
753 interface_strings_[registered_count++] = str;
754 ++next_index;
755 }
756 }
757
758 ASSERT(registered_count == interface_string_count_);
759}
virtual size_t GetInterfaceCount()=0
接口数量 / Number of interfaces contributed

◆ SwitchConfig()

LibXR::ErrorCode DeviceComposition::SwitchConfig ( size_t index,
bool in_isr )

切换到指定 configuration value Switch to the given configuration value.

Definition at line 428 of file device_composition.cpp.

429{
430 if (index > config_num_)
431 {
433 }
434
435 if (index == 0)
436 {
437 UnbindEndpoints(in_isr);
438 configured_ = false;
439 current_cfg_ = 0;
442 }
443
444 // USB configuration value 从 1 开始,而 current_cfg_ 内部保存的是从 0 开始的槽位。
445 // USB configuration values are 1-based, while current_cfg_ stores a 0-based slot index.
446 UnbindEndpoints(in_isr);
447 current_cfg_ = static_cast<uint8_t>(index - 1);
448 configured_ = true;
449 BindEndpoints(in_isr);
452}

◆ TryOverrideDeviceDescriptor()

LibXR::ErrorCode DeviceComposition::TryOverrideDeviceDescriptor ( DeviceDescriptor & descriptor)

用当前配置覆盖 device descriptor 的类字段 Try to override device-descriptor class fields from the current configuration.

Definition at line 511 of file device_composition.cpp.

513{
514 if (config_num_ != 1)
515 {
517 }
518
519 const auto config = items_[0];
520 if (!is_device_descriptor_override_eligible(config.items, config.item_num))
521 {
523 }
524
525 return config.items[0]->WriteDeviceDescriptor(descriptor);
526}
virtual ErrorCode WriteDeviceDescriptor(DeviceDescriptor &header)
可选:覆盖设备描述符字段 / Optional: override device descriptor fields
Definition desc_cfg.hpp:122
@ NOT_SUPPORT
不支持 | Not supported

◆ UnbindEndpoints()

void DeviceComposition::UnbindEndpoints ( bool in_isr)
private

解绑当前配置的全部端点 / Unbind all endpoints for the active configuration

Definition at line 625 of file device_composition.cpp.

626{
627 if (!ep_assigned_)
628 {
629 return;
630 }
631 ep_assigned_ = false;
632
633 // Unbind 走的仍是当前激活 item 表,但这里不再需要重新分配接口号。
634 // Unbind walks the same active item table, but no interface renumbering is needed here.
635 const auto& config = CurrentConfigItems();
636 for (size_t i = 0; i < config.item_num; ++i)
637 {
638 auto* item = config.items[i];
639 if (item == nullptr)
640 {
641 continue;
642 }
643
644 item->UnbindEndpoints(endpoint_pool_, in_isr);
645 }
646}

Field Documentation

◆ bm_attributes_

uint8_t LibXR::USB::DeviceComposition::bm_attributes_ = CFG_BUS_POWERED
private

配置属性 / bmAttributes

Definition at line 179 of file device_composition.hpp.

◆ bos_

BosManager LibXR::USB::DeviceComposition::bos_
private

BOS 聚合管理 / BOS aggregation manager.

Definition at line 194 of file device_composition.hpp.

◆ class_count_

size_t LibXR::USB::DeviceComposition::class_count_ = 0
private

唯一 class 数量 / Unique class count

Definition at line 185 of file device_composition.hpp.

◆ classes_

DeviceClass** LibXR::USB::DeviceComposition::classes_ = nullptr
private

唯一 class 表 / Unique class table

Definition at line 184 of file device_composition.hpp.

◆ composite_

const bool LibXR::USB::DeviceComposition::composite_ = false
private

是否为复合设备 / Whether composite device

Definition at line 181 of file device_composition.hpp.

◆ config_desc_

ConfigDescriptor LibXR::USB::DeviceComposition::config_desc_
private

配置描述符构造器 / Configuration descriptor builder

Definition at line 195 of file device_composition.hpp.

◆ config_num_

const size_t LibXR::USB::DeviceComposition::config_num_ = 0
private

配置数量 / Configuration count

Definition at line 182 of file device_composition.hpp.

◆ configured_

bool LibXR::USB::DeviceComposition::configured_ = false
private

是否已进入非 0 配置态 / Whether a non-zero config is active

Definition at line 173 of file device_composition.hpp.

◆ current_cfg_

uint8_t LibXR::USB::DeviceComposition::current_cfg_ = 0
private

当前配置索引 / Current configuration index

Definition at line 177 of file device_composition.hpp.

◆ endpoint_pool_

EndpointPool& LibXR::USB::DeviceComposition::endpoint_pool_
private

端点池引用 / Endpoint pool reference

Definition at line 176 of file device_composition.hpp.

◆ ep_assigned_

bool LibXR::USB::DeviceComposition::ep_assigned_ = false
private

端点是否已绑定 / Whether endpoints are assigned

Definition at line 174 of file device_composition.hpp.

◆ i_configuration_

uint8_t LibXR::USB::DeviceComposition::i_configuration_ = 0
private

配置字符串索引 / Configuration string index

Definition at line 178 of file device_composition.hpp.

◆ interface_string_buffer_

RawData LibXR::USB::DeviceComposition::interface_string_buffer_
private
Initial value:
{
nullptr, 0}

临时字符串描述符缓冲区 / Temp interface string descriptor buffer

Definition at line 192 of file device_composition.hpp.

192 {
193 nullptr, 0};

◆ interface_string_count_

size_t LibXR::USB::DeviceComposition::interface_string_count_
private
Initial value:
=
0

接口字符串总数量 / Total interface string count

Definition at line 190 of file device_composition.hpp.

◆ interface_strings_

const char** LibXR::USB::DeviceComposition::interface_strings_
private
Initial value:
=
nullptr

接口字符串源表 / Interface string source table

Definition at line 188 of file device_composition.hpp.

◆ items_

ConfigItems* LibXR::USB::DeviceComposition::items_ = nullptr
private

配置项集合 / Configuration item set

Definition at line 183 of file device_composition.hpp.

◆ strings_

DescriptorStrings LibXR::USB::DeviceComposition::strings_
private

字符串描述符管理 / String descriptor manager

Definition at line 187 of file device_composition.hpp.


The documentation for this class was generated from the following files: