Windows自定义HID设备通讯开发概述
2021-09-13
3881
13
HID设备是USB规范中最早提出并支持的一类通讯设备,常见的键盘、鼠标、游戏手柄都属于HID设备。HID设备一般用于数据量小但实时性要求较高的环境,所以HID设备采用的是USB四种通讯类弄的中中断传传输类型。除了上述描述符的标准的HID设备,HID也提供一种自定义通讯,并由Windows提供驱动,而开发人员只需要专注于固件(主要是报告描述符的配置)和应用程序的开发,就可以实现简单的USB HID通讯。
凡是符合HID规范的都是HID设备,Windows下对HID设备进行了扩展,使其不仅可使用USB开发,也可以支持蓝牙,I2C讯通模型方案。在Windows凡是被识别为HID的设备在Windows设备管理器中单独分为一类,名称为人体学输入设备。
- 设备类型GUID为:{745a17a0-74d3-11d0-b6fe-00a0c90f57da}
- 接口类型GUID: {2ACCFE60-C130-11D2-B082-00A0C91EFB8B}
说明
这里我只针对USB HID设备进行开发。
HID包含一个很重要的概念报告描述符。报告描述符描述了HID设备与主机之间进行数据通讯的格式和长度。报告描述符可包含三类报告:
- 输入报告(Input Report): 从HID设备发送到上位机程序的数据,通常在状态发生更改时发送;
- 输出报告(Output Report):从上位机程序发送到HID设备(比如键盘上的LED状态)数据;
- 功能报告(Feature Report):通常与配置信息相关。
在报告描述符中,可以定义每种类型的0个或多个报告,通常Input Report至少有一个。
不同的操作系统,对USB HID的支持方式不一样。Windows下有驱动Hidusb.sys支持HID传输,并提供了HID应用程序接口;UEFI的下使用EFI_USB_IO_PROTOCOL构建通信函数;而Linux下则可以使用libusb与HID设备通信。
Windows系统的HID API
Windows系统上提供的HID应用程序编程接口(API),这些API声明在hidsdi.h中.
#include<hidsdi.h>
#pragma comment(lib,"hid.lib ")
这些API函数大致可以分为两类:
获取设备属性的函数
- HidD_GetAttributes() //获取属性信息
- HidD_GetHidGuid() //HID设备接口类GUID
- HidD_GetIndexedString() //字符串
- HidD_GetManufacturerString() //厂家信息
- HidD_GetPhysicalDescriptor() //物理描述符
- HidD_GetPreparsedData() //HidP_GetCaps的输入库
- HidD_GetProductString()
- HidD_GetSerialNumberString()
- HidD_GetNumInputBuffers()
- HidD_SetNumInputBuffers()
数据通信的函数
- ReadFile()
- WriteFile()
- HidD_GetInputReport()
- HidD_SetOutputReport()
- HidD_SetFeature()
- HidD_GetFeature()
获取设备属性函数的使用方法相对简单,直接查看MSDN上的函数描述就可以了。这里主要介绍下HID设备数据通讯函数的用法。
参考资料
- HID 体系结构:http://www.usbzh.com/article/detail-46.html
- VS2019分析HID报告描述符解析源代码:http://www.usbzh.com/article/detail-461.html
- HID报告描述符分析工具:http://www.usbzh.com/article/detail-537.html
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936