libxr  1.0
Want to be the best embedded framework
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#pragma pack(push, 1)
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#pragma pack(pop)
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
134 virtual ErrorCode SetAltSetting(uint8_t itf, uint8_t alt)
135 {
136 UNUSED(itf);
137 return (alt == 0) ? ErrorCode::OK : ErrorCode::NOT_SUPPORT;
138 }
139
146 virtual ErrorCode GetAltSetting(uint8_t itf, uint8_t& alt)
147 {
148 UNUSED(itf);
149 UNUSED(alt);
151 }
152
158 virtual bool OwnsEndpoint(uint8_t ep_addr) const
159 {
160 UNUSED(ep_addr);
161 return false;
162 }
163
168 virtual size_t GetMaxConfigSize() = 0;
169
174 virtual size_t GetInterfaceCount() = 0;
175
180 virtual bool HasIAD() = 0;
181
182 protected:
188
193 void SetData(RawData data) { data_ = data; }
194
195 friend class ConfigDescriptor;
196
197 private:
198 RawData data_{nullptr, 0};
199};
200
209{
211
212 public:
220 explicit ConfigDescriptor(size_t buffer_size, uint8_t bmAttributes = CFG_BUS_POWERED,
221 uint8_t bMaxPower = 50);
222
223 ConfigDescriptor(const ConfigDescriptor&) = delete;
224 ConfigDescriptor& operator=(const ConfigDescriptor&) = delete;
225
230 static size_t CalcMaxConfigSize(
231 const std::initializer_list<const std::initializer_list<ConfigDescriptorItem*>>&
232 configs);
233
244 ErrorCode BuildConfigDescriptor(ConfigDescriptorItem* const* items, size_t item_num,
245 uint8_t configuration_value,
246 uint8_t i_configuration = 0);
247
252 [[nodiscard]] RawData GetData() const;
253
254 private:
255 uint8_t bm_attributes_ = CFG_BUS_POWERED;
256 uint8_t b_max_power_ = 50;
257
258 RawData buffer_{nullptr, 0};
259 size_t buffer_index_ = 0;
260};
261
262} // namespace LibXR::USB
原始数据封装类。 A class for encapsulating raw data.
BOS 能力提供者接口 / BOS capability provider interface.
Definition bos.hpp:86
配置描述符字节构造器 Configuration descriptor byte builder.
Definition desc_cfg.hpp:209
RawData GetData() const
获取配置描述符数据 / Get configuration descriptor data
Definition desc_cfg.cpp:111
uint8_t bm_attributes_
配置属性 / bmAttributes
Definition desc_cfg.hpp:255
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
size_t buffer_index_
当前有效字节数 / Current valid byte count
Definition desc_cfg.hpp:259
uint8_t b_max_power_
最大电流(2mA 单位)/ Max power (2mA units)
Definition desc_cfg.hpp:256
RawData buffer_
配置描述符缓冲区 / Configuration descriptor buffer
Definition desc_cfg.hpp:258
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
virtual void BindEndpoints(EndpointPool &endpoint_pool, uint8_t start_itf_num, bool in_isr)=0
绑定端点资源 / Bind endpoint resources
RawData GetData()
获取内部数据缓存 / Get internal data cache
Definition desc_cfg.cpp:44
RawData data_
内部数据缓存 / Internal data cache
Definition desc_cfg.hpp:198
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:158
virtual ErrorCode GetAltSetting(uint8_t itf, uint8_t &alt)
可选:获取接口备用设置 / Optional: get interface alternate setting
Definition desc_cfg.hpp:146
void SetData(RawData data)
设置内部数据缓存 / Set internal data cache
Definition desc_cfg.hpp:193
virtual ErrorCode SetAltSetting(uint8_t itf, uint8_t alt)
可选:设置接口备用设置 / Optional: set interface alternate setting
Definition desc_cfg.hpp:134
virtual size_t GetMaxConfigSize()=0
最大配置描述符占用 / Maximum bytes required in configuration descriptor
USB描述符基类 USB descriptor base class.
Definition desc_dev.hpp:40
USB端点池类 / USB endpoint pool class.
Definition ep_pool.hpp:23
ErrorCode
定义错误码枚举
@ 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