TinyUSB HID设备移植
2026-06-15
本文链接为:http://www.usbzh.com/article/detail-1718.html ,欢迎转载,转载请附上本文链接。
TinyUSB的驱动函数如下:
{
.name = DRIVER_NAME("HID"),
.init = hidd_init,
.deinit = hidd_deinit,
.reset = hidd_reset,
.open = hidd_open,
.control_xfer_cb = hidd_control_xfer_cb,
.xfer_cb = hidd_xfer_cb,
.xfer_isr = NULL,
.sof = NULL
},
| 函数名 | 作用 | 调用时机/场景 | 返回值说明 |
|---|---|---|---|
| hidd_init | 初始化 HID 设备层驱动 | 系统启动或 USB 协议栈初始化时 | 无返回值 |
| hidd_deinit | 反初始化 HID 设备层,释放相关资源 | 系统关闭、USB 功能禁用或重枚举时 | true:成功 false:失败 |
| hidd_reset | 复位指定 HID 设备实例状态 | USB 总线复位事件发生、收到主机复位信号时 | 无返回值 |
| hidd_open | 解析并打开 HID 接口描述符,建立端点 | USB 枚举阶段,主机获取配置描述符后 | 已处理的字节数(用于描述符解析进度) |
| hidd_control_xfer_cb | 处理 HID 类特定的控制传输请求 | 收到主机发来的 HID 控制请求(如 SET_IDLE、GET_REPORT 等)时 | true:已处理 false:未处理 |
| hidd_xfer_cb | 处理 HID 中断端点传输完成事件 | 中断 IN/OUT 端点传输完成时 | true:已处理 false:未处理 |
rhport 参数:表示 USB 端口号(Roothub Port),通常为 0
典型调用顺序:
hidd_init() → hidd_open() → [运行中] → hidd_control_xfer_cb() / hidd_xfer_cb() → hidd_reset() → hidd_deinit()
| 函数名 | 对应阶段 | 触发时机 | 补充说明 |
|---|---|---|---|
| hidd_init | 系统初始化阶段 | 协议栈启动、设备上电 | 初始化内部变量、状态机 |
| hidd_deinit | 系统反初始化阶段 | 系统关闭、USB 功能禁用 | 释放资源、关闭端点 |
| hidd_reset | USB 总线复位阶段 | 主机发送总线复位信号 | 重置内部状态,不清除配置 |
| hidd_open | SET_CONFIGURATION | 主机选择配置(非 SET_INTERFACE) | 解析描述符、配置端点地址 |
| hidd_control_xfer_cb | 控制传输阶段 | 收到 HID 类请求时 | 处理 SET_IDLE、SET_PROTOCOL、GET_REPORT 等 |
| hidd_xfer_cb | 中断传输完成阶段 | 中断端点传输完成时 | 处理报告收发完成事件 |
上电 → hidd_init()
↓
总线复位 → hidd_reset()
↓
枚举:GET_DESCRIPTOR
↓
SET_CONFIGURATION → hidd_open() ← 在这里
↓
运行:控制传输 → hidd_control_xfer_cb()
中断传输 tud_hid_n_report→ hidd_xfer_cb()
↓
总线复位 → hidd_reset()(重新开始)
↓
关闭 → hidd_deinit()
主动上报
HID一般使用中断方式,所以可以主动上报数据给主机。
tud_hid_n_report是usbd_edpt_xfer的封装,用于HID主动上报数据给主机。
而执行结果成功与否分别以应tud_hid_report_complete_cb或tud_hid_report_failed_cb
应用回调
以下是这些 TinyUSB HID 应用层回调函数的功能及对应阶段表格:
| 回调函数 | 对应阶段/触发时机 | 作用说明 | 返回值/注意事项 |
|---|---|---|---|
| tud_hid_descriptor_report_cb | GET_HID_REPORT_DESCRIPTOR 控制传输 | 返回 HID 报告描述符指针供主机读取 | 返回描述符指针;内容必须保持有效直到传输完成 |
| tud_hid_get_report_cb | GET_REPORT 控制传输 | 填充缓冲区并返回报告内容给主机 | 返回填充长度;返回 0 会导致 STALL |
| tud_hid_set_report_cb | SET_REPORT 控制传输 或 OUT 端点接收数据 | 接收主机发来的报告(如输出报告、特征报告) | 无返回值 |
| tud_hid_set_protocol_cb | SET_PROTOCOL 控制传输 | 切换协议模式(Boot Protocol 或 Report Protocol) | protocol:0=Boot 协议,1=报告协议 |
| tud_hid_set_idle_cb | SET_IDLE 控制传输 | 设置空闲速率,用于控制重复报告发送频率 | 返回 false 会挂起请求;idle_rate 单位 4ms |
| tud_hid_report_complete_cb | 报告发送完成(中断传输完成) | 上次报告已成功发送给主机,可用于触发发送下一包 | report[0] 为报告 ID(复合报告时) |
| tud_hid_report_failed_cb | 报告发送失败(传输异常) | 通知应用程序上次报告发送失败,便于错误处理或重试 | 包含报告类型、已传输字节数等信息 |
典型应用场景
| 回调 | 常见用途 |
|---|---|
| tud_hid_descriptor_report_cb | 返回鼠标/键盘/自定义 HID 的报告描述符 |
| tud_hid_get_report_cb | 主机查询输入报告(如当前按键状态) |
| tud_hid_set_report_cb | 接收主机的 LED 命令(如键盘大写锁) |
| tud_hid_set_protocol_cb | 支持 Boot 模式(BIOS 下键盘/鼠标) |
| tud_hid_set_idle_cb | 实现报告去重和最小上报间隔 |
| tud_hid_report_complete_cb | 实现流量控制、连续发送多帧报告 |
TinyUSB





