HID协议
简单来说,USB 包括了 USB 主机(USB HOST)和 USB 设备(USB Device),两者的称呼是相对而言的,通常情况,我们的 PC 机是主机,像 USB 键盘、USB 鼠标、USB 游戏杆、USB 串口线、U盘,等带 USB 接口的设备,都是 USB 设备。
在 USB 中,主机是通过设备的各种描述符来识别设备的,主要有如下几类: 设备描述符,接口描述符,端点描述符,字符描述符, 告描述符。
当主机请求 HID 设备(HID 设备插入主机)时,设备返回给主机的描述符依次为设备描述符、配置描述符、接口描述符、HID描述符、端点描述符。在后续文章将分析这些描述符。
同时 HID 还扩展了其特定请求,HID设备类特定的命令(请求)有6个,它们分别是Get_Report、Get_Idle、Get_Protocol、Set_Report、Set_Idle和Set_Protocol。后续针对 Report 进行分析。
至于开发,
可以看看《圈圈教你玩 USB》这本著作。在 STM32 平台比较容易实现 USB 协议,这也是应用比较多的平台。
对于 HID 协议,主要参考《Device Class Definition for Human Interface Devices (HID)》 V1.11版本。
工具
一般地,第一步了解 USB 设备的,莫过于 Windows 系统的设备管理器了,点击对应的设备,可以查询许多信息,如设备VID和PID,设备路径,类GUID,等等。这些信息在开发中有重要的作用。另外,还有许多第三方的工具,如 Bus Hound 可捕获 USB 数据包,对分析协议十分有用,类似的还有 USBlyzer 软件。
首次学习 USB 协议,建议使用 Bus Hound 捕获键盘或鼠标的数据分析,将工具得到的数据与手册相结合,才能发挥作用。图1是使用 Bus Hound 选择 USB 键盘作为分析的对象。

图1
开发
在代码中对 USB 设备进行操作,可以直接使用系统提供的 API,也可以使用第三方库,如 https://github.com/libusb/hidapi ,该库使用C语言实现,根据不同平台实现相同的接口,封装的接口较友好,建议使用。
一般地,很多应用场合,都是利用了 USB 接口,再在其上实现一套自定义的应用层协议。类似利用 socket 进行 络传输,但传输的数据,均使用自定义的协议。
实际上,一旦调用 USB 传输,一旦将 USB 读写(包括 feature report)封装起来,就可以关注上层协议,而不是 USB 自身协议。这也是一个重要的开发思路。
后续文章,将根据笔者的一点经验和资料收集,展开一些研究。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!