libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
device_composition.hpp
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <initializer_list>
6
7#include "device_class.hpp"
8#include "libxr_type.hpp"
9#include "usb/core/bos.hpp"
10#include "usb/core/desc_cfg.hpp"
11#include "usb/core/desc_str.hpp"
12#include "usb/core/ep_pool.hpp"
13
14namespace LibXR::USB
15{
21{
27 {
29 size_t item_num = 0;
30 };
31
32 public:
41 EndpointPool& endpoint_pool,
42 const std::initializer_list<const DescriptorStrings::LanguagePack*>& lang_list,
43 const std::initializer_list<const std::initializer_list<ConfigDescriptorItem*>>&
44 configs,
45 ConstRawData uid = {nullptr, 0}, uint8_t bmAttributes = CFG_BUS_POWERED,
46 uint8_t bMaxPower = 50);
47
48 DeviceComposition(const DeviceComposition&) = delete;
49 DeviceComposition& operator=(const DeviceComposition&) = delete;
51 DeviceComposition& operator=(DeviceComposition&&) = delete;
52
57 void Init(bool in_isr);
58
63 void Deinit(bool in_isr);
64
69 ErrorCode SwitchConfig(size_t index, bool in_isr);
70
76
81 [[nodiscard]] RawData GetConfigDescriptor() const;
82
86 [[nodiscard]] ConstRawData GetBosDescriptor();
87
91 ErrorCode ProcessBosVendorRequest(bool in_isr, const SetupPacket* setup,
92 BosVendorResult& result);
93
98 ErrorCode GetStringDescriptor(uint8_t string_index, uint16_t lang, ConstRawData& data);
99
103 [[nodiscard]] bool IsComposite() const;
104
110
114 [[nodiscard]] size_t GetConfigNum() const;
115
119 [[nodiscard]] size_t GetCurrentConfig() const;
120
124 [[nodiscard]] uint16_t GetDeviceStatus() const;
125
130 [[nodiscard]] DeviceClass* FindClassByInterfaceNumber(size_t index) const;
131
136 [[nodiscard]] DeviceClass* FindClassByEndpointAddress(uint8_t addr) const;
137
138 private:
143 [[nodiscard]] const ConfigItems& CurrentConfigItems() const;
144
148 void BindEndpoints(bool in_isr);
149
153 void UnbindEndpoints(bool in_isr);
154
159 void RebuildBosCache();
160
166
171 ErrorCode GenerateInterfaceString(uint8_t string_index, ConstRawData& data);
172
173 bool configured_ = false;
174 bool ep_assigned_ = false;
175
177 uint8_t current_cfg_ = 0;
178 uint8_t i_configuration_ = 0;
179 uint8_t bm_attributes_ = CFG_BUS_POWERED;
180
181 const bool composite_ = false;
182 const size_t config_num_ = 0;
183 ConfigItems* items_ = nullptr;
184 DeviceClass** classes_ = nullptr;
185 size_t class_count_ = 0;
186
188 const char** interface_strings_ =
189 nullptr;
191 0;
196};
197
198} // namespace LibXR::USB
常量原始数据封装类。 A class for encapsulating constant raw data.
原始数据封装类。 A class for encapsulating raw data.
BOS 管理器:能力收集、BOS 描述符拼装、Vendor 请求链式分发 BOS manager: capability collection, descriptor building,...
Definition bos.hpp:113
配置描述符字节构造器 Configuration descriptor byte builder.
Definition desc_cfg.hpp:209
USB 配置项基类(功能块)/ USB configuration item base (functional block)
Definition desc_cfg.hpp:36
字符串描述符管理器 / USB string descriptor manager
Definition desc_str.hpp:15
USB 设备类接口基类 / USB device class interface base.
USB 组合管理器:class 列表、字符串、BOS、配置切换 USB composition manager: class list, strings, BOS,...
size_t class_count_
唯一 class 数量 / Unique class count
void Deinit(bool in_isr)
释放当前 configuration 的运行态资源 Release runtime resources for the active configuration.
const ConfigItems & CurrentConfigItems() const
获取当前激活 configuration 的扁平 item 表 Get the flattened item table of the active configuration.
void RegisterInterfaceStrings()
为所有 class 分配并登记 interface string 索引 Allocate and register interface-string indices for all classes.
bool ep_assigned_
端点是否已绑定 / Whether endpoints are assigned
ConfigItems * items_
配置项集合 / Configuration item set
DeviceClass ** classes_
唯一 class 表 / Unique class table
ErrorCode TryOverrideDeviceDescriptor(DeviceDescriptor &descriptor)
用当前配置覆盖 device descriptor 的类字段 Try to override device-descriptor class fields from the current config...
uint8_t i_configuration_
配置字符串索引 / Configuration string index
const bool composite_
是否为复合设备 / Whether composite device
RawData GetConfigDescriptor() const
获取当前 configuration 描述符缓存 Get the current configuration descriptor cache.
bool configured_
是否已进入非 0 配置态 / Whether a non-zero config is active
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
ErrorCode SwitchConfig(size_t index, bool in_isr)
切换到指定 configuration value Switch to the given configuration value.
void BindEndpoints(bool in_isr)
绑定当前配置的全部端点 / Bind all endpoints for the active configuration
uint8_t current_cfg_
当前配置索引 / Current configuration index
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.
DeviceClass * FindClassByInterfaceNumber(size_t index) const
按接口号查找所属 class Find the owning class by interface number.
uint16_t GetDeviceStatus() const
设备 GET_STATUS 返回值 / Device-level GET_STATUS value
ErrorCode GetStringDescriptor(uint8_t string_index, uint16_t lang, ConstRawData &data)
获取字符串描述符(含 interface string) Get a string descriptor, including runtime-generated interface strings.
DeviceClass * FindClassByEndpointAddress(uint8_t addr) const
按端点地址查找所属 class Find the owning class by endpoint address.
void RebuildBosCache()
按当前配置重建 BOS capability 缓存 Rebuild the BOS capability cache from the active configuration.
size_t GetConfigNum() const
配置数量 / Number of configurations
void UnbindEndpoints(bool in_isr)
解绑当前配置的全部端点 / Unbind all endpoints for the active configuration
void Init(bool in_isr)
初始化当前 configuration 的运行态资源 Initialize runtime resources for the active configuration.
ErrorCode ProcessBosVendorRequest(bool in_isr, const SetupPacket *setup, BosVendorResult &result)
分发 BOS vendor request / Dispatch BOS vendor requests
ConstRawData GetBosDescriptor()
获取当前 BOS 描述符缓存 / Get the current BOS descriptor cache
bool IsComposite() const
是否为复合设备 / Whether this is a composite device
size_t interface_string_count_
接口字符串总数量 / Total interface string count
size_t GetCurrentConfig() const
当前 configuration value / Current configuration value
ErrorCode BuildConfigDescriptor()
生成当前 configuration 描述符缓存 Build the current configuration descriptor cache.
ConfigDescriptor config_desc_
配置描述符构造器 / Configuration descriptor builder
ErrorCode GenerateInterfaceString(uint8_t string_index, ConstRawData &data)
运行时生成 interface string 描述符 Generate one interface-string descriptor at runtime.
USB描述符基类 USB descriptor base class.
Definition desc_dev.hpp:40
USB端点池类 / USB endpoint pool class.
Definition ep_pool.hpp:23
ErrorCode
定义错误码枚举
Vendor 请求处理结果(EP0 控制传输) Vendor request handling result for EP0 control transfers.
Definition bos.hpp:45
单个 configuration 的扁平 item 表 Flattened item table for one configuration.
ConfigDescriptorItem ** items
配置项指针表 / Item pointer table
size_t item_num
配置项数量 / Item count
USB 标准请求 SETUP 包(固定8字节) Standard USB setup packet (8 bytes)
Definition core.hpp:57