5#include "usb/core/desc_cfg.hpp"
21template <
size_t REPORT_DESC_LEN,
size_t TX_REPORT_LEN,
size_t RX_REPORT_LEN = 0>
110 HID(
bool enable_out_endpoint =
false, uint8_t in_ep_interval = 10,
111 uint8_t out_ep_interval = 10,
138 ASSERT(ans == ErrorCode::OK);
145 ASSERT(ans == ErrorCode::OK);
153 static_cast<uint8_t
>(DescriptorType::INTERFACE),
175 static_cast<uint8_t
>(DescriptorType::ENDPOINT),
186 static_cast<uint8_t
>(DescriptorType::ENDPOINT),
216 self->OnDataOutComplete(in_isr, data);
222 self->OnDataInComplete(in_isr, data);
302 uint8_t desc_type = (wValue >> 8) & 0xFF;
313 return ErrorCode::OK;
321 return ErrorCode::OK;
326 return ErrorCode::NOT_SUPPORT;
346 uint8_t report_id = wValue & 0xFF;
372 return ErrorCode::ARG_ERR;
379 if (wLength != 1 || report_id != 0)
381 return ErrorCode::ARG_ERR;
384 return ErrorCode::OK;
389 return ErrorCode::ARG_ERR;
393 return ErrorCode::OK;
397 return ErrorCode::OK;
402 return ErrorCode::OK;
405 return ErrorCode::NOT_SUPPORT;
425 if (ans == ErrorCode::OK)
430 (data.
size_ > 0) ?
reinterpret_cast<const uint8_t*
>(data.
addr_)[0] : 0;
435 return OnCustomClassData(in_isr, bRequest, data);
472 return ErrorCode::OK;
484 return ErrorCode::OK;
496 return ErrorCode::OK;
518 return ErrorCode::NOT_SUPPORT;
521 virtual ErrorCode OnCustomClassData(
bool in_isr, uint8_t bRequest,
ConstRawData& data)
526 return ErrorCode::NOT_SUPPORT;
538 return ErrorCode::NOT_SUPPORT;
550 return ErrorCode::OK;
564 return ErrorCode::FAILED;
566 if (!report.
addr_ || report.
size_ == 0 || report.
size_ > TX_REPORT_LEN)
568 return ErrorCode::ARG_ERR;
573 return ErrorCode::BUSY;
578 if (report.
size_ > buf.size_)
580 return ErrorCode::NO_BUFF;
提供一个通用的回调包装,支持动态参数传递。 Provides a generic callback wrapper, supporting dynamic argument passing.
static Callback Create(FunType fun, ArgType arg)
创建一个新的回调对象,并绑定回调函数和参数。 Creates a new callback instance, binding a function and an argument.
常量原始数据封装类。 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.
void SetData(RawData data)
设置配置项数据 Set configuration item data
USB 设备类接口基类,所有自定义 USB 类(如 HID、CDC、MSC)都需派生自本类。 USB device class base interface, all custom device cla...
USB端点基类 / USB Endpoint base class.
EPNumber
端点号 / Endpoint number
@ EP_AUTO
自动分配端点号 / Auto allocate
uint8_t GetAddress() const
获取端点地址(方向 + 号) Get endpoint address (dir + num)
@ OUT
输出方向 / OUT direction
void SetOnTransferCompleteCallback(Callback< ConstRawData & > cb)
设置传输完成回调 / Set transfer complete callback
virtual void Configure(const Config &cfg)=0
二次初始化/配置端点协议参数(由Pool/Manager分配后调用) Configure endpoint protocol parameters (call after pool allocation...
@ INTERRUPT
中断端点 / Interrupt
virtual void Close()=0
关闭端点(软禁用/资源复位) Close (soft disable)
State GetState() const
获取端点状态 Get endpoint state
virtual ErrorCode Transfer(size_t size)=0
传输数据 Transfer data
RawData GetBuffer() const
获取端点缓冲区 Get endpoint buffer
USB端点池类 / USB endpoint pool class.
ErrorCode Get(Endpoint *&ep_info, Endpoint::Direction direction, Endpoint::EPNumber ep_num=Endpoint::EPNumber::EP_AUTO)
分配端点 / Allocate endpoint
ErrorCode Release(Endpoint *ep_info)
回收端点 / Release endpoint
USB HID(Human Interface Device)基类,支持可选 OUT 端点、自动生成描述符,适合键盘、鼠标、手柄等扩展。 USB HID (Human Interface Device)...
virtual ConstRawData GetHIDDesc()
获取 HID 描述符 Get HID Descriptor
bool enable_out_endpoint_
是否启用 OUT 端点 / Whether OUT endpoint is enabled
virtual ErrorCode OnGetLastOutputReport(uint8_t report_id, DeviceClass::RequestResult &result)
获取最近一次输出报告 Get last Output Report
virtual ErrorCode OnSetReport(uint8_t report_id, DeviceClass::RequestResult &result)
处理 SET_REPORT 请求 Handle SET_REPORT request
ErrorCode OnGetDescriptor(bool in_isr, uint8_t bRequest, uint16_t wValue, uint16_t wLength, ConstRawData &need_write) override
处理标准请求 GET_DESCRIPTOR(HID/Report 描述符)。 Handle standard GET_DESCRIPTOR requests for HID/Report Descrip...
Endpoint * GetOutEndpoint()
获取输出端点 Get OUT endpoint
bool HasIAD() override
检查是否包含IAD Check if IAD is present
uint8_t last_output_report_id_
最近的 Output Report ID / Last Output Report ID
Endpoint * ep_out_
输出端点指针 / OUT endpoint pointer
HID(bool enable_out_endpoint=false, uint8_t in_ep_interval=10, uint8_t out_ep_interval=10, Endpoint::EPNumber in_ep_num=Endpoint::EPNumber::EP_AUTO, Endpoint::EPNumber out_ep_num=Endpoint::EPNumber::EP_AUTO)
HID 构造函数 HID class constructor.
virtual ConstRawData GetReportDesc()=0
获取 HID 报告描述符 Get HID Report Descriptor
uint8_t idle_rate_
当前空闲率/ Current idle rate (unit 4ms)
ErrorCode SendInputReport(ConstRawData report)
发送输入报告到主机 Send Input Report to host
Endpoint * ep_in_
输入端点指针 / IN endpoint pointer
virtual ErrorCode OnGetFeatureReport(uint8_t report_id, DeviceClass::RequestResult &result)
获取特征报告 Get Feature Report
virtual ErrorCode OnCustomClassRequest(bool in_isr, uint8_t bRequest, uint16_t wValue, uint16_t wLength, RequestResult &result)
处理自定义类请求 Handle custom class request
uint8_t out_ep_interval_
输出端点间隔 / OUT endpoint interval
Protocol
HID 协议类型 / HID Protocol Types.
@ REPORT
报告协议 / Report protocol (通用)
@ BOOT
启动协议 / Boot protocol (键盘/鼠标)
virtual ErrorCode OnGetInputReport(uint8_t report_id, DeviceClass::RequestResult &result)
获取输入报告 Get Input Report
size_t GetMaxConfigSize() override
获取最大配置描述符块长度 Get max config descriptor size.
HIDDescBlockINOUT desc_
HID 描述符块/ Descriptor block.
ErrorCode OnClassRequest(bool in_isr, uint8_t bRequest, uint16_t wValue, uint16_t wLength, DeviceClass::RequestResult &result) override
处理 HID 类请求 Handle HID class-specific requests
uint8_t in_ep_interval_
输入端点间隔 / IN endpoint interval
Endpoint::EPNumber out_ep_num_
输出端点号 / OUT endpoint number
bool HasOutEndpoint() const
查询是否支持OUT端点 Check if OUT endpoint is enabled
void Init(EndpointPool &endpoint_pool, uint8_t start_itf_num) override
初始化 HID 设备,自动选择端点与描述符块 Initialize HID device and select descriptor block (IN or IN+OUT).
size_t itf_num_
接口号 / Interface number
uint8_t GetIDLERate() const
获取IDLE报告率 Get IDLE report rate
ReportType
HID 报告类型 / HID Report Types.
@ OUTPUT
输出报告 / Output report
@ INPUT
输入报告 / Input report
@ FEATURE
特征报告 / Feature report
Endpoint * GetInEndpoint()
获取输入端点 Get IN endpoint
virtual ErrorCode OnSetReportData(bool in_isr, ConstRawData &data)
处理 SET_REPORT 数据阶段 Handle SET_REPORT data stage
Endpoint::EPNumber in_ep_num_
输入端点号 / IN endpoint number
Protocol protocol_
当前协议类型 / Current protocol
uint8_t GetLastOutputReportID() const
获取最近一次 Output Report 的 Report ID Get the last received Output Report ID.
void Deinit(EndpointPool &endpoint_pool) override
反初始化 HID 设备 Deinitialize HID device.
bool inited_
初始化标志 / Initialization flag
HIDDescriptorType
HID 描述符类型 / HID Descriptor Types.
@ HID
HID 类描述符 / HID Class Descriptor.
@ REPORT
报告描述符 / Report Descriptor
@ PHYSICAL
物理描述符 / Physical Descriptor (rarely used)
size_t GetInterfaceNum() override
获取接口数量 Get number of interfaces
ClassRequest
HID 类请求代码 / HID Class-Specific Requests.
@ SET_PROTOCOL
设置协议 / Set Protocol
@ GET_PROTOCOL
获取协议 / Get Protocol
@ GET_REPORT
获取报告 / Get Report
@ SET_REPORT
设置报告 / Set Report
@ SET_IDLE
设置空闲率 / Set Idle
@ GET_IDLE
获取空闲率 / Get Idle
ErrorCode OnClassData(bool in_isr, uint8_t bRequest, LibXR::ConstRawData &data) override
处理类请求数据阶段 Handle class data stage
端点描述符结构体 Endpoint descriptor structure (USB 2.0 Spec 9.6.6)
接口描述符结构体 Interface descriptor structure (USB 2.0 Spec 9.6.5)
控制请求结果结构体 / Structure for control transfer results
bool write_zlp
写操作是否需要发送 0 长度包 / Send ZLP after write
ConstRawData write_data
主机写入设备的数据 / Data to write (from host)
包含 IN 端点的描述符块 Descriptor block with IN endpoint.
EndpointDescriptor ep_in
IN 端点描述符 / IN endpoint descriptor.
HIDDescriptor hid
HID 描述符 / HID descriptor.
InterfaceDescriptor intf
接口描述符 / Interface descriptor
包含 IN+OUT 端点的描述符块 Descriptor block with IN and OUT endpoints.
HIDDescriptor hid
HID 描述符 / HID descriptor.
EndpointDescriptor ep_out
OUT 端点描述符 / OUT endpoint descriptor.
EndpointDescriptor ep_in
IN 端点描述符 / IN endpoint descriptor.
InterfaceDescriptor intf
接口描述符 / Interface descriptor
HID描述符结构体 HID descriptor structure.
uint8_t bLength
描述符长度 / Descriptor length
uint8_t bNumDescriptors
后续描述符数量 / Number of subordinate descriptors
uint16_t bcdHID
HID 版本号 / HID class specification release.
HIDDescriptorType bReportDescriptorType
报告描述符类型 / Report descriptor type (0x22)
HIDDescriptorType bDescriptorType
描述符类型 / Descriptor type (0x21)
uint16_t wReportDescriptorLength
报告描述符长度 / Report descriptor length
uint8_t bCountryCode
国家码 / Country code