7#include "libxr_def.hpp"
8#include "libxr_type.hpp"
9#include "usb/core/core.hpp"
18enum class DevCapabilityType : uint8_t
20 USB20_EXTENSION = 0x02,
23static constexpr uint8_t DESCRIPTOR_TYPE_BOS =
24 static_cast<uint8_t
>(DescriptorType::BOS);
26static constexpr uint8_t DESCRIPTOR_TYPE_DEVICE_CAPABILITY =
static_cast<uint8_t
>(
27 DescriptorType::DEVICE_CAPABILITY);
30static constexpr uint8_t DEV_CAPABILITY_TYPE_USB20EXT =
static_cast<uint8_t
>(
31 DevCapabilityType::USB20_EXTENSION);
34static constexpr size_t BOS_HEADER_SIZE =
36static constexpr size_t USB2_EXT_CAP_SIZE =
79 return ErrorCode::NOT_SUPPORT;
127 bos_buffer_({
new uint8_t[buffer_size], buffer_size})
168 ASSERT(cap !=
nullptr);
185 bool has_usb2_ext =
false;
186 for (
size_t i = 0; i <
count_; ++i)
189 ASSERT(blk.
addr_ !=
nullptr);
190 ASSERT(blk.
size_ >= 3);
192 const uint8_t* p =
reinterpret_cast<const uint8_t*
>(blk.
addr_);
193 if (p[1] == DESCRIPTOR_TYPE_DEVICE_CAPABILITY &&
194 p[2] == DEV_CAPABILITY_TYPE_USB20EXT)
200 static constexpr uint8_t USB2_EXT_CAP[USB2_EXT_CAP_SIZE] = {7, 0x10, 0x02, 0x00,
202 const bool NEED_AUTO_USB2_EXT = !has_usb2_ext;
204 size_t total = BOS_HEADER_SIZE;
205 for (
size_t i = 0; i <
count_; ++i)
208 ASSERT(blk.
addr_ !=
nullptr);
209 ASSERT(blk.
size_ >= 1);
212 if (NEED_AUTO_USB2_EXT)
214 total +=
sizeof(USB2_EXT_CAP);
218 ASSERT(total <= 0xFFFF);
222 buffer[0] =
static_cast<uint8_t
>(BOS_HEADER_SIZE);
223 buffer[1] = DESCRIPTOR_TYPE_BOS;
224 buffer[2] =
static_cast<uint8_t
>(total & 0xFF);
225 buffer[3] =
static_cast<uint8_t
>((total >> 8) & 0xFF);
226 buffer[4] =
static_cast<uint8_t
>(
count_ + (NEED_AUTO_USB2_EXT ? 1 : 0));
228 size_t offset = BOS_HEADER_SIZE;
230 for (
size_t i = 0; i <
count_; ++i)
239 if (NEED_AUTO_USB2_EXT)
243 offset +=
sizeof(USB2_EXT_CAP);
247 return {buffer, offset};
261 if (setup ==
nullptr)
263 return ErrorCode::ARG_ERR;
266 for (
size_t i = 0; i <
count_; ++i)
271 if (ec == ErrorCode::NOT_SUPPORT)
275 if (ec != ErrorCode::OK)
282 return ErrorCode::OK;
284 return ErrorCode::FAILED;
287 return ErrorCode::NOT_SUPPORT;
常量原始数据封装类。 A class for encapsulating constant raw data.
size_t size_
数据大小(字节)。 The size of the data (in bytes).
const void * addr_
数据存储地址(常量)。 The storage address of the data (constant).
static void FastCopy(void *dst, const void *src, size_t size)
快速内存拷贝 / Fast memory copy
原始数据封装类。 A class for encapsulating raw data.
size_t size_
数据大小(字节)。 The size of the data (in bytes).
void * addr_
数据存储地址。 The storage address of the data.
BOS 能力接口 / BOS capability interface.
virtual ErrorCode OnVendorRequest(bool, const SetupPacket *, BosVendorResult &)
处理该能力相关 Vendor 请求 / Handle vendor request for this capability
virtual ConstRawData GetCapabilityDescriptor() const =0
返回能力块(不含 BOS 头) Return capability block (without BOS header).
BOS 能力提供者接口 / BOS capability provider interface.
virtual size_t GetBosCapabilityCount()
获取 BOS 能力数量 / Get BOS capability count
virtual BosCapability * GetBosCapability(size_t index)
获取指定索引的 BOS 能力 / Get BOS capability at index
BOS 管理器:能力收集、BOS 描述符拼装、Vendor 请求链式分发 BOS manager: capability collection, descriptor building,...
size_t cap_capacity_
能力指针容量 / Capability pointer capacity
size_t count_
已注册能力数量 / Registered capability count
~BosManager()
析构函数 / Destructor
bool AddCapability(BosCapability *cap)
添加能力 / Add capability
ConstRawData GetBosDescriptor()
构建 BOS 描述符(BOS 头 + 能力块) Build BOS descriptor (header + blocks).
void ClearCapabilities()
清空已注册能力 / Clear registered capabilities
BosManager(size_t buffer_size, size_t cap_num)
构造函数 / Constructor
ErrorCode ProcessVendorRequest(bool in_isr, const SetupPacket *setup, BosVendorResult &result)
Vendor 请求分发 / Vendor request dispatch.
BosCapability ** caps_
能力指针表 / Capability pointer table
RawData bos_buffer_
BOS 缓冲区 / BOS buffer.
size_t bos_desc_size_
最近一次构建大小 / Last built size
Vendor 请求处理结果(EP0 控制传输) Vendor request handling result for EP0 control transfers.
bool handled
已处理该请求 / Request consumed by capability
ConstRawData in_data
IN 数据阶段返回数据 / IN data stage payload.
bool write_zlp
状态阶段发送 ZLP / Send ZLP at status stage
bool early_read_zlp
提前准备 OUT 以适配主机短读 / Arm OUT early for short-read tolerance
USB 标准请求 SETUP 包(固定8字节) Standard USB setup packet (8 bytes)