转载请注明来源:cuixiaolei的技术博客


USB HID设备类的应用场合

  USB HID类是USB设备的一个标准设备类,包括的设备非常多。HID类设备定义它属于人机交互操作的设备,用于控制计算机操作的一些方面,如USB鼠标、USB键盘、USB游戏操纵杆等。但HID设备类不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。

  USB HID设备的一个好处就是操作系统自带了HID类的驱动程序,而用户无需去开发驱动程序,只要使用API系统调用即可完成通信。


USB HID设备类的通信管道

   所有的HID设备通过USB的控制管道(默认管道,即端点0)和中断管道(端点1或端点2)与主机进行通信。

  管道        要求      说明

  控制(端点0)    必须      传输USB描述符、类请求代码以及供查询的消息数据

  中断输入      必须      传输从设备到主机的输入数据

  中断输出      可选      传输从主机到设备的输出数据

注:USB主机为PC,USB设备如鼠标等。

  控制管道主要用于下面3个方面

  • 接收/响应USB主机的控制请求以及相关的类数据
  • 在USB主机查询时传输数据(如响应Get_Report请求等)
  • 接收USB主机的数据

  中断管道主要用于下面两个方面

  • USB主机接收USB设备的异步传输数据
  • USB主机发送有实时性要求的数据给USB设备

  从USB主机到USB设备的中断输出数据传输是可选的,当不支持中断输出数据时,USB主机通过控制管道将数据传输给USB设备。


与USB HID设备有关的描述符

  HID设备的描述符除了5个USB的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符)外,还包括三个HID设备类特定的描述符:HID描述符、报告描述符、实体描述符。

  除了HID的三个特定描述符组成对HID设备的解释外,5个标准描述符中与HID设备有关的部分有:

  • 设备描述符中:bDeviceClass, bDeviceSubClass, bDeviceProtocol三个值必须为0
  • 接口描述符中:bInterfaceClass的值必须时0x03, bInterfaceSubClass的值为0或1, 为1表示HID设备是一个启动设备(Boot Device, 一般对PC机有意义,意思是BIOS启动时能识别您使用的HID设备,切只有标准鼠标或者键盘才能称为Boot Device),为0表示HID设备是操作系统启动厚才能识别使用的设备。bInterfaceProtocol的取值含义如下:

  bInterfaceProtocol的取值(十进制)    含义

  0                    NONE

  1                    键盘

  2                    鼠标

  3-255                   保留

  下面分别对3个HID设备类特定描述符进行说明:

1.HID描述符

  HID描述符关联于接口描述符,因而如果一个设备只有一个接口描述符,则无论它有几个端点描述符,HID设备只有一个HID描述符。HID设备描述符主要描述HID规范的版本号, HID通信所使用的额外描述符, 报表描述符的长度等。下表为HID描述符的结构。

偏移量    域        大小    值    描述

0      bLength      1     数字    此描述符的长度,以字节为单位

1      bDescriptorType    1     常量   描述符种类(此处0X21为HID类)

2      bcdHID      2     数字   HID规范版本号(BCD码),采用4个16进制的BCD格式编码,如版本1.0,0x0100,版本1.1,0x10110

4      bCountryCode   1      数字   硬件目的国家的识别码

5      bNumDescriptors 1      数字   支持的附属描述符数目

6      bDescriptorType   1     常量   HID相关描述符的类型,见下表

7      wDescriptorLength  2    数字    报告描述符的总长度

9      bDescriptorType  1     常量   用于识别描述符类型的常量,使用有一个以上描述符的设备

10      wDescriptorLength 2     数字   描述符总长度,使用在有一个以上描述符的设备

HID相关描述符类型定义

描述符类型值      HID相关描述符类型

0x21           HID描述符

0x22           报表描述符  

0x23           实体描述符

2.报告描述符

  HID设备的报告描述符比较复杂,也比较难理解。

  报告描述符的语法不同于USB标准描述符,它是以项目(item)方式排列而成,没有固定长度。HID的报告描述符已经不是简单的描述某个值对饮过的固定意义了,它已经能够组合出很多种情况,而且需要PC上的HID驱动程序提供parser解释器来对描述符的设备情形进行重新解释,进而组合生成本HID硬件设备独特的数据流格式,所以可以把它理解为“报告描述符脚本语言”更为贴切。我们使用“报告描述符”专用脚本语言,让用户来自己定义它们的HID设备都有什么数据,以及这些数据各个位(bit)都有什么意义。

  有关报告描述符的详细信息可以参考USB HID协议,USB协会提供了一个HID描述符编辑工具称作HID Descriptor Tool,用它可以方便生成我们的报告描述符。

  一个USB HID设备可以包含多种功能的报告描述符合集,这样可以实现复合设备,如带鼠标功能的USB键盘,这种复合键盘可以通过在报告描述符里包含鼠标和键盘两种报告实现,两个报告用报告ID来区分。

3.实体描述符

  实体描述符被用来描述设备的行为特性。实体描述符是可选的描述符,HID设备可以根据其本体的设备特性选择是否包含实体描述符。HID的实体描述符结构如下表:

偏移量      域      大小      说明

0        bDesignator  1        用来指定本体的那一部分影响项目,见下表

1        bFlags     1        位指定标志

                        位0~4:Effort

                        位5~7:Qualifier,见下表

表7、bDesignator取值含义表
bDesignator取值 含义   bDesignator取值 含义
0x00 0x15 小指
0x01 0x16
0x02 眼球 0x17
0x03 0x18 腰骨
0x04 眼皮 0x19
0x05 0x1A 大腿
0x06 0x1B 膝盖
0x07 0x1C 小腿
0x08 上唇 0x1D
0x09 下唇 0x1E
0x0A 0x1F 脚跟
0x0B 0x20 拇指
0x0C 上臂 0x21 大拇指
0x0D 手肘 0x22 第二指
0x0E 前臂 0x23 第三指
0x0F 手腕 0x24 第四指
0x10 手掌 0x25 小拇指
0x11 拇指 0x26
0x12 食指 0x27
0x13 中指 0x28~0xFF 保留
0x14 无名指  
表8、Qualifier取值含义
Qualifier取值 含义   Qualifier取值 含义
0x00 0x04 其中之一
0x01 0x05 中间
0x02 0x06 保留
0x03 两者同时 0x07 保留

USB HID类命令(请求)

偏移量 大小 说明
0 bmRequestType 1

HID设备类请求特性如下:
位7:
0=从USB HOST到USB设备
1=从USB设备到USB HOST
位6~5:
01=请求类型为设备类请求
位4~0:
0001=请求对象为接口(interface)

因而,针对HID的设备类请求,仅仅10100001和00100001有效

1 bRequest 1 HID类请求(参考表10)
2 wValue 2 高字节说明描述符的类型(参考表5),而低字节为非0值时被用来选定实体描述符。
4 wIndex 2 2字节数值,根据不同的bRequest有不同的意义
6 wLength 2 该请求的数据段长度
数值 HID类请求描述符 注释
0x01 GET_REPORT  
0x02 GET_IDLE  
0x03 GET_PROTOCOL 仅仅适应于支持启动功能的HID设备(Boot Device)
0x09 SET_REPORT  
0x0A SET_IDLE  
0x0B SET_PROTOCOL 仅仅适应于支持启动功能的HID设备(Boot Device)

  USB主机在请求HID设备的配置描述符时,设备需要按照顺序返回下面几种描述符:配置描述符, 接口描述符, HID描述符, 端点描述符。HID描述符里又包含了其附属的描述符的类型和长度(如报告描述符),然后主机再根据HID描述符的信息请求其相关的描述符。

USB HID 协议入门的更多相关文章

  1. USB HID复合设备实例—键盘+鼠标

    实现这种USB HID复合设备有两种方法,在<USB HID协议入门>一节已经讲到其中一种方法,说一个USB HID设备可以包含多种功能的报告描述符合集,这样可以实现复合设备,如带鼠标功能 ...

  2. USB 设备类协议入门【转】

    本文转载自:http://www.cnblogs.com/xidongs/archive/2011/09/26/2191616.html 一.应用场合 USB HID类是比较大的一个类,HID类设备属 ...

  3. USB HID报告及报告描述符简介

    在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等.USB报告描述符(Report Descriptor)是HID ...

  4. USB传输协议。——Arvin

    问题一:USB的传输线结构是如何的呢? 答案一:一条USB的传输线分别由地线.电源线.D+.D-四条线构成,D+和D-是差分输入线,它使用的是3.3V的电压(注意哦,与CMOS的5V电平不同),而电源 ...

  5. 史上最全USB HID开发资料

    史上最全USB HID开发资料 史上最全USB HID开发资料,悉心整理一个月,亲自测试. 涉及STM32 C51 8051F例子都有源码,VC上位机例子以及源码,USB协议,HID协议,USB抓包工 ...

  6. 蓝牙HID协议笔记

    1.概述     The Human Interface Device (HID)定义了蓝牙在人机接口设备中的协议.特征和使用规程.典型的应用包括蓝牙鼠标.蓝牙键盘.蓝牙游戏手柄等.该协议改编自USB ...

  7. USB HID介绍【转】

    本文转载自:http://blog.csdn.net/leo_wonty/article/details/6721214 HID是一种USB通信协议,无需安装驱动就能进行交互,在学习HID之前,先来复 ...

  8. USB HID描述符【转】

    本文转载自: USB是个通用的总线,端口都是统一的.但是USB设备却各种各样,例如USB鼠标,USB键盘,U盘等等,那么USB主机是如何识别出不同的设备的呢?这就要依赖于描述符了.USB的描述符主要有 ...

  9. Windows与自定义USB HID设备通信说明.

    1 .   所使用的典型 Windows API CreateFile ReadFile WriteFile 以下函数是 DDK 的内容: HidD_SetFeature HidD_GetFeatur ...

随机推荐

  1. JQuery中attr ,html,text,val,的一些用法

    attr:主要获取元素内部的属性,返回 的是属性值 html:返回当前元素(不包括他自己本身的标签,但是可以返回他自己的)的标签加上内容.仅限于返回第一个. text:和 .html() 方法不同, ...

  2. UVaLive 6698 Sightseeing Bus Drivers (水题,贪心)

    题意:n个工人,有n件工作a,n件工作b,每个工人干一件a和一件b,a[i] ,b[i]代表工作时间,如果a[i]+b[j]>t,则老板要额外付钱a[i]+b[j]-t;现在要求老板付钱最少: ...

  3. 创建类模式(五):单例(Singleton)

    定义 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式一般情况下通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化. 和静态变量的区别 虽然 ...

  4. android 自定义adapter和线程结合 + ListView中按钮滑动后状态丢失解决办法

    adapter+线程 1.很多时候自定义adapter的数据都是来源于服务器的,所以在获取服务器的时候就需要异步获取,这里就需要开线程了(线程池)去获取服务器的数据了.但这样有的时候adapter的中 ...

  5. setTimeout setInterval 区别 javascript线程解释

    原文:http://www.iamued.com/qianduan/1645.html 今天看到这篇文章,学到了不少东西 特此发出来 和大家分享 JavaScript的setTimeout与setIn ...

  6. 文件字符读写函数fscanf()和 fgets() 比较

    一. 文件格式化读入函数 fscanf()  int  fscanf(文件指针,格式化字符串,输入列表); 返回值: 整形,输入列表中定义字符串的个数. 1, 例如读取字符串: char  str1[ ...

  7. ExtJs FormPanel布局

    FormPanel有两种布局:form和column,form是纵向布局,column为横向布局.默认为后者.使用layout属性定义布局类型.对于一个复杂的布局表单,最重要的是正确分割,分割结果直接 ...

  8. Ajax随笔

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  9. The IAR Archive Tool—iarchive

    The IAR Archive Tool—iarchive—creates and manipulates a library (anarchive) of several ELF object fi ...

  10. bootstrap适配移动端

    上次在pythonanywhere上挂上去的页面,是这个样子的 而在手机上看是这个样子的 总之简直不能看= = 看了一下学校几个微信公众号的页面.都是用的bootstrap,好吧我也去试试看好了. 在 ...