libxr
Embedded C++ framework for bare-metal, RTOS and Linux
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{
26 struct ConfigItems
27 {
28 ConfigDescriptorItem** items = nullptr;
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
165 void RegisterInterfaceStrings();
166
171 ErrorCode GenerateInterfaceString(uint8_t string_index, ConstRawData& data);
172
173 bool configured_ =
174 false;
175 bool ep_assigned_ = false;
176
177 EndpointPool& endpoint_pool_;
178 uint8_t current_cfg_ = 0;
179 uint8_t i_configuration_ = 0;
180 uint8_t bm_attributes_ = CFG_BUS_POWERED;
181
182 const bool composite_ = false;
183 const size_t config_num_ = 0;
184 ConfigItems* items_ = nullptr;
185 DeviceClass** classes_ = nullptr;
186 size_t class_count_ = 0;
187
188 DescriptorStrings strings_;
189 const char** interface_strings_ =
190 nullptr;
191 size_t interface_string_count_ =
192 0;
193 RawData interface_string_buffer_{
194 nullptr, 0};
195 BosManager bos_;
196 ConfigDescriptor config_desc_;
197};
198
199} // namespace LibXR::USB
只读原始数据视图 / Immutable raw data view
可写原始数据视图 / Mutable raw data view
BOS 管理器:能力收集、BOS 描述符拼装、Vendor 请求链式分发 BOS manager: capability collection, descriptor building,...
Definition bos.hpp:113
配置描述符字节构造器 Configuration descriptor byte builder.
Definition desc_cfg.hpp:223
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,...
void Deinit(bool in_isr)
释放当前 configuration 的运行态资源 Release runtime resources for the active configuration.
ErrorCode TryOverrideDeviceDescriptor(DeviceDescriptor &descriptor)
用当前配置覆盖 device descriptor 的类字段 Try to override device-descriptor class fields from the current config...
RawData GetConfigDescriptor() const
获取当前 configuration 描述符缓存 Get the current configuration descriptor cache.
ErrorCode SwitchConfig(size_t index, bool in_isr)
切换到指定 configuration value Switch to the given configuration value.
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.
size_t GetConfigNum() const
配置数量 / Number of configurations
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 GetCurrentConfig() const
当前 configuration value / Current configuration value
ErrorCode BuildConfigDescriptor()
生成当前 configuration 描述符缓存 Build the current configuration descriptor cache.
USB描述符基类 USB descriptor base class.
Definition desc_dev.hpp:39
USB端点池类 / USB endpoint pool class.
Definition ep_pool.hpp:29
ErrorCode
定义错误码枚举 / Defines an enumeration for error codes
Vendor 请求处理结果(EP0 控制传输) Vendor request handling result for EP0 control transfers.
Definition bos.hpp:45
USB 标准请求 SETUP 包(固定8字节) Standard USB setup packet (8 bytes)
Definition core.hpp:59