libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
desc_cfg.cpp
1#include "desc_cfg.hpp"
2
3#include <cstddef>
4#include <cstdint>
5
6#include "libxr_mem.hpp"
7
8using namespace LibXR::USB;
9
10namespace
11{
12using Header = ConfigDescriptorItem::Header;
13
14static size_t calc_max_config_size(
15 const std::initializer_list<const std::initializer_list<ConfigDescriptorItem*>>&
16 configs)
17{
18 // 初始化时一次性为最大的 configuration 预留缓冲区。
19 // Reserve enough space for the largest configuration during initialization.
20 size_t max_config_size = 0;
21
22 for (const auto& cfg_group : configs)
23 {
24 size_t config_size = sizeof(Header);
25 for (auto* item : cfg_group)
26 {
27 if (item != nullptr)
28 {
29 config_size += item->GetMaxConfigSize();
30 }
31 }
32
33 if (config_size > max_config_size)
34 {
35 max_config_size = config_size;
36 }
37 }
38
39 return max_config_size;
40}
41
42} // namespace
43
45
46ConfigDescriptor::ConfigDescriptor(size_t buffer_size, uint8_t bmAttributes,
47 uint8_t bMaxPower)
48 : bm_attributes_(bmAttributes), b_max_power_(bMaxPower)
49{
50 ASSERT(buffer_size > 0);
51 buffer_.addr_ = new uint8_t[buffer_size];
52 buffer_.size_ = buffer_size;
53}
54
56 const std::initializer_list<const std::initializer_list<ConfigDescriptorItem*>>&
57 configs)
58{
59 return calc_max_config_size(configs);
60}
61
63 ConfigDescriptorItem* const* items, size_t item_num, uint8_t configuration_value,
64 uint8_t i_configuration)
65{
66 if (items == nullptr || item_num == 0)
67 {
69 }
70
71 uint8_t* buffer = reinterpret_cast<uint8_t*>(buffer_.addr_);
72 Header* header = reinterpret_cast<Header*>(buffer);
73
74 // 先清空配置头,再按顺序拼接每个配置项的数据块。
75 // Start from a clean configuration header, then append each item block in order.
76 *header = Header{};
77 header->bLength = sizeof(Header);
78 header->bDescriptorType = 0x02;
79 header->bConfigurationValue = configuration_value;
80 header->iConfiguration = i_configuration;
82 header->bMaxPower = b_max_power_;
83
84 size_t offset = sizeof(Header);
85 uint8_t total_interfaces = 0;
86
87 for (size_t i = 0; i < item_num; ++i)
88 {
89 auto* item = items[i];
90 if (item == nullptr)
91 {
92 continue;
93 }
94
95 auto data = item->GetData();
96 ASSERT(offset + data.size_ <= buffer_.size_);
97 LibXR::Memory::FastCopy(&buffer[offset], data.addr_, data.size_);
98 offset += data.size_;
99
100 total_interfaces = static_cast<uint8_t>(total_interfaces + item->GetInterfaceCount());
101 }
102
103 ASSERT(offset <= 0xFFFF);
104 header->wTotalLength = static_cast<uint16_t>(offset);
105 header->bNumInterfaces = total_interfaces;
106
107 buffer_index_ = offset;
109}
110
static void FastCopy(void *dst, const void *src, size_t size)
快速内存拷贝 / Fast memory copy
Definition libxr_mem.cpp:5
原始数据封装类。 A class for encapsulating raw data.
size_t size_
数据大小(字节)。 The size of the data (in bytes).
void * addr_
数据存储地址。 The storage address of the data.
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
RawData GetData()
获取内部数据缓存 / Get internal data cache
Definition desc_cfg.cpp:44
RawData data_
内部数据缓存 / Internal data cache
Definition desc_cfg.hpp:198
ErrorCode
定义错误码枚举
@ OK
操作成功 | Operation successful
@ ARG_ERR
参数错误 | Argument error
配置描述符头(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