libxr
Embedded C++ framework for bare-metal, RTOS and Linux
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;
24
36{
37 public:
38 virtual ~ConfigDescriptorItem() = default;
39
40 LIBXR_PACKED_BEGIN
44 struct Header
45 {
46 uint8_t bLength = 9;
48 uint16_t wTotalLength;
52 uint8_t bmAttributes;
53 uint8_t bMaxPower;
54 };
55
60 {
61 uint8_t bLength = 8;
62 uint8_t bDescriptorType = 0x0B;
68 uint8_t iFunction;
69 };
70
75 {
76 uint8_t bLength = 9;
77 uint8_t bDescriptorType = 0x04;
80 uint8_t bNumEndpoints;
84 uint8_t iInterface;
85 };
86
91 {
92 uint8_t bLength = 7;
93 uint8_t bDescriptorType = 0x05;
95 uint8_t bmAttributes;
96 uint16_t wMaxPacketSize;
97 uint8_t bInterval;
98 };
99 LIBXR_PACKED_END
100
107 virtual void BindEndpoints(EndpointPool& endpoint_pool, uint8_t start_itf_num,
108 bool in_isr) = 0;
109
115 virtual void UnbindEndpoints(EndpointPool& endpoint_pool, bool in_isr) = 0;
116
123 {
124 UNUSED(header);
126 }
127
143 virtual ErrorCode SetAltSetting(uint8_t itf, uint8_t alt)
144 {
145 UNUSED(itf);
146 return (alt == 0) ? ErrorCode::OK : ErrorCode::NOT_SUPPORT;
147 }
148
160 virtual ErrorCode GetAltSetting(uint8_t itf, uint8_t& alt)
161 {
162 UNUSED(itf);
163 UNUSED(alt);
165 }
166
172 virtual bool OwnsEndpoint(uint8_t ep_addr) const
173 {
174 UNUSED(ep_addr);
175 return false;
176 }
177
182 virtual size_t GetMaxConfigSize() = 0;
183
188 virtual size_t GetInterfaceCount() = 0;
189
194 virtual bool HasIAD() = 0;
195
196 protected:
202
207 void SetData(RawData data) { data_ = data; }
208
209 friend class ConfigDescriptor;
210
211 private:
212 RawData data_{nullptr, 0};
213};
214
223{
225
226 public:
234 explicit ConfigDescriptor(size_t buffer_size, uint8_t bmAttributes = CFG_BUS_POWERED,
235 uint8_t bMaxPower = 50);
236
237 ConfigDescriptor(const ConfigDescriptor&) = delete;
238 ConfigDescriptor& operator=(const ConfigDescriptor&) = delete;
239
244 static size_t CalcMaxConfigSize(
245 const std::initializer_list<const std::initializer_list<ConfigDescriptorItem*>>&
246 configs);
247
258 ErrorCode BuildConfigDescriptor(ConfigDescriptorItem* const* items, size_t item_num,
259 uint8_t configuration_value,
260 uint8_t i_configuration = 0);
261
266 [[nodiscard]] RawData GetData() const;
267
268 private:
269 uint8_t bm_attributes_ = CFG_BUS_POWERED;
270 uint8_t b_max_power_ = 50;
271
272 RawData buffer_{nullptr, 0};
273 size_t buffer_index_ = 0;
274};
275
276} // namespace LibXR::USB
可写原始数据视图 / Mutable raw data view
BOS 能力提供者接口 / BOS capability provider interface.
Definition bos.hpp:86
配置描述符字节构造器 Configuration descriptor byte builder.
Definition desc_cfg.hpp:223
RawData GetData() const
获取配置描述符数据 / Get configuration descriptor data
Definition desc_cfg.cpp:111
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
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
ConfigDescriptor(size_t buffer_size, uint8_t bmAttributes=CFG_BUS_POWERED, uint8_t bMaxPower=50)
构造函数 / Constructor
Definition desc_cfg.cpp:46
USB 配置项基类(功能块)/ USB configuration item base (functional block)
Definition desc_cfg.hpp:36
virtual size_t GetInterfaceCount()=0
接口数量 / Number of interfaces contributed
RawData GetData()
获取内部数据缓存 / Get internal data cache
Definition desc_cfg.cpp:44
virtual bool HasIAD()=0
是否包含 IAD / Whether an IAD is used
virtual ErrorCode WriteDeviceDescriptor(DeviceDescriptor &header)
可选:覆盖设备描述符字段 / Optional: override device descriptor fields
Definition desc_cfg.hpp:122
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:172
virtual ErrorCode GetAltSetting(uint8_t itf, uint8_t &alt)
可选:获取接口备用设置 / Optional: get interface alternate setting
Definition desc_cfg.hpp:160
void SetData(RawData data)
设置内部数据缓存 / Set internal data cache
Definition desc_cfg.hpp:207
virtual ErrorCode SetAltSetting(uint8_t itf, uint8_t alt)
可选:设置接口备用设置 / Optional: set interface alternate setting
Definition desc_cfg.hpp:143
virtual LIBXR_PACKED_END void BindEndpoints(EndpointPool &endpoint_pool, uint8_t start_itf_num, bool in_isr)=0
绑定端点资源 / Bind endpoint resources
virtual size_t GetMaxConfigSize()=0
最大配置描述符占用 / Maximum bytes required in configuration descriptor
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
@ NOT_SUPPORT
不支持 / Not supported
@ OK
操作成功 / Operation successful
端点描述符(7 字节)/ Endpoint descriptor (7 bytes)
Definition desc_cfg.hpp:91
uint8_t bmAttributes
端点属性 / Endpoint attributes
Definition desc_cfg.hpp:95
uint8_t bDescriptorType
描述符类型 / Descriptor type
Definition desc_cfg.hpp:93
uint8_t bLength
描述符长度 / Descriptor length
Definition desc_cfg.hpp:92
uint16_t wMaxPacketSize
最大包长 / Maximum packet size
Definition desc_cfg.hpp:96
uint8_t bEndpointAddress
端点地址 / Endpoint address
Definition desc_cfg.hpp:94
uint8_t bInterval
轮询间隔 / Polling interval
Definition desc_cfg.hpp:97
配置描述符头(9 字节)/ Configuration descriptor header (9 bytes)
Definition desc_cfg.hpp:45
uint8_t bLength
描述符长度 / Descriptor length
Definition desc_cfg.hpp:46
uint8_t bmAttributes
属性位 / Attributes
Definition desc_cfg.hpp:52
uint8_t bNumInterfaces
接口数量 / Number of interfaces
Definition desc_cfg.hpp:49
uint8_t bMaxPower
最大电流(2mA 单位)/ Max power (2mA units)
Definition desc_cfg.hpp:53
uint8_t bConfigurationValue
配置值 / Configuration value
Definition desc_cfg.hpp:50
uint8_t iConfiguration
配置字符串索引 / Configuration string index
Definition desc_cfg.hpp:51
uint16_t wTotalLength
配置总长度 / Total configuration length
Definition desc_cfg.hpp:48
uint8_t bDescriptorType
描述符类型(0x02)/ Descriptor type (0x02)
Definition desc_cfg.hpp:47
IAD(8 字节)/ Interface Association Descriptor (8 bytes)
Definition desc_cfg.hpp:60
uint8_t bInterfaceCount
接口数量 / Interface count
Definition desc_cfg.hpp:64
uint8_t bDescriptorType
描述符类型 / Descriptor type
Definition desc_cfg.hpp:62
uint8_t bFirstInterface
首接口号 / First interface number
Definition desc_cfg.hpp:63
uint8_t iFunction
功能字符串索引 / Function string index
Definition desc_cfg.hpp:68
uint8_t bLength
描述符长度 / Descriptor length
Definition desc_cfg.hpp:61
uint8_t bFunctionClass
功能类 / Function class
Definition desc_cfg.hpp:65
uint8_t bFunctionSubClass
功能子类 / Function subclass
Definition desc_cfg.hpp:66
uint8_t bFunctionProtocol
功能协议 / Function protocol
Definition desc_cfg.hpp:67
接口描述符(9 字节)/ Interface descriptor (9 bytes)
Definition desc_cfg.hpp:75
uint8_t bInterfaceProtocol
接口协议 / Interface protocol
Definition desc_cfg.hpp:83
uint8_t bDescriptorType
描述符类型 / Descriptor type
Definition desc_cfg.hpp:77
uint8_t iInterface
接口字符串索引 / Interface string index
Definition desc_cfg.hpp:84
uint8_t bLength
描述符长度 / Descriptor length
Definition desc_cfg.hpp:76
uint8_t bNumEndpoints
端点数量 / Number of endpoints
Definition desc_cfg.hpp:80
uint8_t bAlternateSetting
备用设置号 / Alternate setting
Definition desc_cfg.hpp:79
uint8_t bInterfaceClass
接口类 / Interface class
Definition desc_cfg.hpp:81
uint8_t bInterfaceSubClass
接口子类 / Interface subclass
Definition desc_cfg.hpp:82
uint8_t bInterfaceNumber
接口号 / Interface number
Definition desc_cfg.hpp:78