USB HID学习:初识

USB协议本身非常复杂,如果一头扎入协议中研究,会走不出来。许多年前笔者就是因为协议过于复杂放弃研究,只留下“EndPoint”、“中断传输”这些概念。
本文开始的几篇文章将介绍一下笔者所了解的 USB 知识。虽然仅限于 HID 设备,但也能一窥 USB 门径。本着实用使用、适用合用之目的,暂且抛开 USB 协议本身,以一个门外汉的心态学习 USB HID 的开发。

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 自身协议。这也是一个重要的开发思路。

后续文章,将根据笔者的一点经验和资料收集,展开一些研究。

发布了478 篇原创文章 · 获赞 243 · 访问量 109万+

猜你喜欢

转载自blog.csdn.net/subfate/article/details/104237177