USB HID介绍
HID是一种USB通信协议,无需安装驱动就能进行交互,在学习HID之前,先来复习一下USB协议的相关内容。
 
USB设备描述符-概述
当插入USB设备后,主机会向设备请求各种描述符来识别设备。那什么是设备描述符呢?
Descriptor即描述符,是一个完整的数据结构,可以通过C语言等编程实现,并存储在USB设备中,用于描述一个USB设备的所有属性,USB主机是通过一系列命令来要求设备发送这些信息的。
描述符的作用就是通过命令操作来给主机传递信息,从而让主机知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式及数据量的大小,只有主机确定了这些信息之后,设备才能真正开始工作。
USB有那些标准描述符? 
USB有5种标准描述符:设备描述符 、配置描述符、字符描述符、接口描述符、端点描述符  。
描述符之间有一定的关系,一个设备只有一个设备描述符,而一个设备描述符可以包含多个配置描述符,而一个配置描述符可以包含多个接口描述符,一个接口使用了几个端点,就有几个端点描述符。由此我们可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。其中可能还会有获取设备序列号,厂商字符串,产品字符串等。
 
设备描述符
struct _DEVICE_DEscriptOR_STRUCT
{
  BYTE  bLength;    //设备描述符的字节数大小
  BYTE  bDescriptorType;  //描述符类型编号,为0x01
  WORD  bcdUSB;  //USB版本号
  BYTE  bDeviceClass;  //USB分配的设备类代码,0x01~0xfe为标准设备类,0xff为厂商自定义类型,0x00不是在设备描述符中定义的,如HID
  BYTE  bDeviceSubClass;  //usb分配的子类代码,同上,值由USB规定和分配的,HID设备此值为0
  BYTE  bDeviceProtocl;  //USB分配的设备协议代码,同上HID设备此值为0
  BYTE  bMaxPacketSize0;  //端点0的最大包的大小
  WORD  idVendor;  //厂商编号
  WORD  idProduct;  //产品编号
  WORD  bcdDevice;  //设备出厂编号
  BYTE  iManufacturer;  //描述厂商字符串的索引
  BYTE  iProduct;  //描述产品字符串的索引
  BYTE  iSerialNumber;  //描述设备序列号字符串的索引
  BYTE  bNumConfiguration;  //可能的配置数量
}
 
配置描述符 
struct _CONFIGURATION_DEscriptOR_STRUCT
{
  BYTE  bLength;  //配置描述符的字节数大小
  BYTE  bDescriptorType;  //描述符类型编号,为0x02
  WORD  wTotalLength;  //配置所返回的所有数量的大小
  BYTE  bNumInterface;  //此配置所支持的接口数量
  BYTE  bConfigurationVale;  //Set_Configuration命令需要的参数值
  BYTE  iConfiguration;  //描述该配置的字符串的索引值
  BYTE  bmAttribute;  //供电模式的选择
unicode字符的种类有  BYTE  MaxPower;  //设备从总线提取的最大电流
}
 
字符描述符 
struct _STRING_DEscriptOR_STRUCT
{
BYTE bLength; //字符串描述符的字节数大小
BYTE bDescriptorType; //描述符类型编号,为0x03
BYTE SomeDescriptor[36]; //UNICODE编码的字符串
}
 
接口描述符
struct _INTERFACE_DEscriptOR_STRUCT
{
BYTE bLength; //接口描述符的字节数大小
BYTE bDescriptorType; //描述符类型编号,为0x04
BYTE bInterfaceNunber; //接口的编号
BYTE bAlternateSetting;//备用的接口描述符编号
BYTE bNumEndpoints; //该接口使用端点数,不包括端点0
BYTE bInterfaceClass; //接口类型 HID设备此值为0x03
BYTE bInterfaceSubClass;//接口子类型 HID设备此值为0或者1
BYTE bInterfaceProtocol;//接口所遵循的协议
BYTE iInterface; //描述该接口的字符串索引值
}
 
端点描述符
struct _ENDPOIN_DEscriptOR_STRUCT
{
BYTE bLength; //端点描述符的字节数大小
BYTE bDescriptorType; //描述符类型编号,为0x05
BYTE bEndpointAddress; //端点地址及输入输出属性
BYTE bmAttribute; //端点的传输类型属性
WORD wMaxPacketSize; //端点收、发的最大包的大小
BYTE bInterval; //主机查询端点的时间间隔
}
 
HID设备描述符
温习了以上内容,我们再来看看HID协议与这些描述符之间的关系。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。