【转贴】USB HID 设备类协议入门

单片机相关 徐 自远 568℃ 0评论


一、应用场合

  USB HID类是比较大的一个类,HID类设备属于人机交互操作的设备。用于控制计算机操作的一些方面,如USB鼠标,USB键盘,USB游戏操纵杆,USB触摸板,USB轨迹球、电话拨号设备、VCR遥控等等设备。另外,使用HID设备的一个好处就是,操作系统自带了HID类的驱动程序,而用户无需去开发很麻烦的驱动程序,只要直接使用API调用即可完成通信。所以很多简单的USB设备,喜欢枚举成HID设备,这样就可以不用安装驱动而直接使用。

二、USB HID类可采用的通信管道

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

表1、USB HID规范定义的HID设备可用端点

管道

要求

说明

控制(端点0)

必须

传输USB描述符、类请求代码以及供查询的消息数据等

中断输入

必须

传输从设备到主机的输入数据

中断输出

可选

传输从主机到设备的输出数据

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

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

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

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

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

三、与USB HID设备有关的描述符

  HID设备的描述符除了5个USB的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符,见百合电子工作室的另一篇文章:USB开发基础--USB命令(请求)和USB描述符)外,还包括3个HID设备类特定描述符:HID描述符、报告描述符、实体描述符。

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

  • 设备描述符中bDeviceClass、bDeviceSubClass和bDeviceProtocol三个字段的值必须为零。
  • 接口描述符中bInterfaceClass的值必须为0x03,bInterfaceSubClass的值为0或1,为1表示HID设备符是一个启动设备(Boot Device,一般对PC机而言才有意义,意思是BIOS启动时能识别并使用您的HID设备,且只有标准鼠标或键盘类设备才能成为Boot Device。如果为0则只有在操作系统启动后才能识别并使用您的HID设备),bInterfaceProtocol的取值含义如下表所示:

表2、HID接口描述符中bInterfaceProtocol的含义

bInterfaceProtocol的取值(十进制)

含义

0

NONE

1

键盘

2

鼠标

3~255

保留

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

1、HID描述符

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

表3、USB HID类描述符的结构

偏移量

大小

描述

0

bLength

1

数字

此描述符的长度(以字节为单位)

1

bDescriptorType

1

常量

描述符种类(此处为0x21即HID类描述符)

2

bcdHID

2

数字

HID规范版本号(BCD码),采用4个16进制的BCD格式编码,如版本1.0的BCD码为0x0100,版本为1.1的BCD码为0x0110

4

bCountryCode

1

数字

硬件目的国家的识别码(BCD码)(见表3)

5

bNumDescritors

1

数字

支持的附属描述符数目

6

bDescriptorType

1

常量

HID相关描述符的类型,取值见表5

7

wDescriptorLength

2

数字

报告描述符总长度

9

bDescriptorType

1

常量

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

10

wDescriptorLength

2

数字

描述符总长度,使用在有一个以上描述符的设备

表4、HID硬件目的国家识别码

识别码(十进制)

国家和地区

  

识别码(十进制)

国家和地区

00

不支持

18

Netherlands/Dutch

01

Arabic

19

Norwegian

02

Belgian

20

Persian (Farsi)

03

Canadian-Bilingual

21

Poland

04

Canadian-French

22

Portuguese

05

Czech Republic

23

Russia

06

Danish

24

Slovakia

07

Finnish

25

Spanish

08

French

26

Swedish

09

German

27

Swiss/French

10

Greek

28

Swiss/German

11

Hebrew

29

Switzerland

12

Hungary

30

Taiwan

13

International (ISO)

31

Turkish-Q

14

Italian

32

UK

15

Japan (Katakana)

33

US

16

Korean

34

Yugoslavia

17

Latin American

35

Turkish-F

  

  

36~255

Reserved

 

表5、HID相关描述符类型定义

描述符类型值

HID相关描述符类型

0x21

HID描述符

0x22

报表描述符

0x23

实体描述符

2、报告描述符

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

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

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

3、实体描述符

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

表6、HID实体描述符的结构

偏移量

大小 

说明

0

bDesignator

1

用来指定本体的哪一部分影响项目(含义见表6)

1

bFlags

1

位指定标志 位0~4:Effort 位5~7:Qualifier(含义见表7)

表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类命令(请求)

  HID设备类特定的命令(请求)有6个,它们分别是Get_Report、Get_Idle、Get_Protocol、Set_Report、Set_Idle和Set_Protocol。

  HID类请求(命令)数据包格式如表8所示:

表9、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类请求(参考表9)

2

wValue

2

高字节说明描述符的类型(参考表5),而低字节为非0值时被用来选定实体描述符。

4

wIndex

2

2字节数值,根据不同的bRequest有不同的意义

6

wLength

2

该请求的数据段长度

表10、HID类请求

数值

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开发方面的开源项目-Easy USB 51 Programer,整个开发过程写得非常详细,不防参考一下,您还可以进入她的论坛参与此项目的讨论。

转载请注明:徐自远的乱七八糟小站 » 【转贴】USB HID 设备类协议入门

喜欢 (0)

您必须 登录 才能发表评论!

苏ICP备18041234号-1 bei_an 苏公网安备 32021402001397号