TinyUSB
+ -

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_IDLEGET_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_IDLESET_PROTOCOLGET_REPORT
hidd_xfer_cb 中断传输完成阶段 中断端点传输完成时 处理报告收发完成事件
上电 → hidd_init()
    ↓
总线复位 → hidd_reset()
    ↓
枚举:GET_DESCRIPTORSET_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 实现流量控制、连续发送多帧报告
本文链接为:http://www.usbzh.com/article/detail-1718.html ,欢迎转载,转载请附上本文链接。

0 篇笔记 写笔记

Windows下枚举系统中所有HID设备
Windows下对任何设备,文件的打开都是通过CreateFile来实现的,不过要打开一个设备得首先知道设备或文件名。由上节可知道,对于HID设备,都会注册一个接口类型为{2ACCFE60-C130-11D2-B082-00A0C91EFB8B}的GUID。我们可以通过Setup系列函数枚举出系统中......
HID 设置协议SetProtocol
SetProtocol用于设置ID设备的协议值。对于USB引导设备,该协议是必须对;对于非引导设备,是可选的。详见:USB请求bmRequestType(1):0x21bRequest(1): SetProtocol,值为0bwValue(2):数据为0表示引导协议,为1表示报告协议。wInd......
HID 设置报告请求SetReport
SetReport请求用于主机向设备发送报告请求。详见:USB请求bmRequestType(1):0x21bRequest(1): SET_REPORT,值为09.wValue(2):高字节报告类型,低字节为报告ID.01:表示输入报告02: 表示输出报告03: 表示特定报告wIndex......
HID 触摸屏的报表描述符
讲道理,这个触摸屏的报告描述符是我从网上搜索的一段代码,这个触摸屏的报告内容本人也进行了测试。测试是通过本站编写的虚拟触摸屏驱动实现的。0x05, 0x0d, // USAGE_PAGE (Digitizers) 0 0x......
HID 简介
 HID(Human Interface Device,人机接口设备)是USB设备中常用的设备类型,是直接与人交互的USB设备,例如键盘、鼠标与游戏杆等。在USB设备中,HID设备的成本较低。另外,HID设备并不一定要有人机交互功能,只要符合HID类别规范的设备都是HID设备。  Windows操......
HID 体系结构
Windows 中的 HID 驱动程序堆栈的体系结构基于名为 hidclass.sys 的类驱动程序。 客户端和传输微型驱动程序从用户模式或内核模式下访问的类驱动程序。HID类驱动程序在系统提供的 HID 类驱动程序是 WDM 功能驱动程序和总线驱动程序 HID 设备安装程序类 (HIDClass)......
HID 报表描述符数字显示实例
USAGE_PAGE (Alphnumeric Display) 05 14USAGE (Alphanumeric Display) 09 01LOGICAL_MINIMUM (0) 15 00 CO......
HID键盘设备数据抓包分析实践
本文使用 Bus Hound 工具对 USB HID 设备数据包进行分析,并结合官方手册及网上文章进行整理。在进行数据分析前,我们先回顾一下USB相关的基础知识。USB描述符USB 主机是通过各种描述符来识别设备的,有设备描述符,接口描述符,端点描述符,字符描述符,报告描述符(HID)等。和普通的......
USB复合HID设备报告描述符的区分
在USB规范中,设备的功能是通过接口来承载的,在USB规格书中就是接口描述符。对于一般的设备,一般一个接口就是一个功能,这个功能可以是鼠标,键盘或其它设备类型。当然这个只是对USB简易设备而言的,对于一些USB复杂设备如UVC摄像头,UAC音频等是多接口相互配合来实现其功能的,为了整合这么多接口使......
HID 设备描述符关系
HID设备连接到USB主机后,主机通过发送Get_Descriptor请求读取HID设备的描述符,了解描述符对了解USB设备是至关重要的。HID设备的描述符HID设备除了支持USB设备的5种标准描述符之外,还支持HID设备特有的3种描述符。这些描述符是:USB标准描述符:设备描述符、配置描述符、......
HID描述符
HID描述符的主要作用是用来识别HID通信所使用的额外描述符。下表是HID描述符结构。偏移量字段字节数数值类型说明0bLength1Numeric描述符字节数1bDescriptorType1Constant0x21 = HID描述符2bcdH......
HID报告描述符详解
HID的报告描述符和其它描述符不一样,不是具有固定的数据结构,而是由固件开发商根据上报的数据自行组装的。这个组装的原材料是HID规范定义的ITEM。所以说HID报告描述符就像搭积木一样,其最终的数据结构和设计图纸是什么,都是由固件开发商决定的,但是其最终的产品又是由HID规范提供的各个标准积木模块搭......
HID 报表描述符远程控制实例
USAGE_PAGE (Consumer Devices) 05 0CUSAGE (Consumer Control) 09 01COLLECTION (Application) A1 01 ......
HID 报表描述符键盘实例
通过下面的报告描述符的定义,我们根据上面的注释可知,包含一个中断输入报表描述符和一个中断输出报告描述符。其中断输入报告描述符用于USB HID键盘中断输入端点,输出报表描述符用于USB HID键盘中断输出端点。USB HID键盘的中断输入报告对于中断输入端点,数据格式定义如下:BYTE0:该字......
USB通用父驱动usbccgp.sys的过滤UVC摄像头、UAC麦克风和HID设备硬件ID
激动的心情,无溢言表。。虽然只是一个很简单的东西。。但相于折腾了这么久,还是很开心的了。最近有个需求,功能是这样的:有一个USB复合设备,连接到windows系统中它在windows下的设备树如下:USB Composite Device(usbccgp.sys)UVC CameraUAC ......
关注公众号
  • HID人机交互
  • Linux&USB
  • TinyUSB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • USB资源
  • XHCI 1.2b 规范
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!