USBHID协议中文版.docx
- 文档编号:11210788
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:88
- 大小:499.82KB
USBHID协议中文版.docx
《USBHID协议中文版.docx》由会员分享,可在线阅读,更多相关《USBHID协议中文版.docx(88页珍藏版)》请在冰豆网上搜索。
USBHID协议中文版
第8章USB接口HID设备
HID(HumanInterfaceDevice,人机接口设备)是USB设备中常用的设备类型,是直接与人交互的USB设备,例如键盘、鼠标与游戏杆等。
在USB设备中,HID设备的成本较低。
另外,HID设备并不一定要有人机交互功能,只要符合HID类别规范的设备都是HID设备。
Wndows操作系统最先支持的HID设备。
在windows98以及后来的版本中内置有HID设备的驱动程序,应用程序可以直接使用这些驱动程序来与设备通信。
在设计一个USB接口的计算机外部设备时,如果HID类型的设备可以满足需要,可以将其设计为HID类型设备,这样可以省去比较复杂的USB驱动程序的编写,直接利用Windows操作系统对标准的HID类型USB设备的支持。
8.1HID设备简介
8.1.1HID设备的特点
•交换的数据储存在称为报表(Report)的结构内,设备的固件必须支持HlD报表的格式。
主机通过控制和中断传输中的传送和请求报表来传送和接收数据。
报表的格式非常灵活。
•每一笔事务可以携带小量或中量的数据。
低速设备每一笔事务最大是8B,全速设备每一笔事务最大是64B,高速设备每一笔事务最大是1024B。
一个报表可以使用多笔事务。
•设备可以在未预期的时间传送信息给主机,例如键盘的按键或是鼠标的移动。
所以主机会定时轮询设备,以取得最新的数据。
•HID设备的最大传输速度有限制。
主机可以保证低速的中断端点每10ms内最多1笔事务,每一秒最多是800B。
保证全速端点每lms一笔事务,每一秒最多是64000B。
保证高速端点每125us三笔事务,每一秒最多是24.576MB。
•HID设备没有保证的传输速率。
如果设备是设置在10ms的时距,事务之间的时间可能等于或小于10ms。
除非设备是设置在全速时在每个帧传输数据,或是在高速时在每个微帧传输数据。
这是最快的轮询速率,所以端点可以保证有正确的带宽可供使用。
HID设备除了传送数据给主机外,它也会从主机接收数据。
只要能够符合HlD类别规范的设备都可以是HID设备。
设备除了HlD接口之外,它可能同时还包含有其他的USB接口。
例如影像显示设备可能使用HID接口来做亮度、对比度的软件控制,而使用传统的影像接口来传送要显示的数据。
USB扩音器可以使用实时传输来播放语音,同时使用HID接口来控制音量、低音等。
HID类别设备的规范文件主要是以下两份:
•DeviceClassDefinitionforHumaninterfaceDevices
•HIDUsageTables
其中前者是HID的基本规范文件,后者可以是前者的附件,为开发人员提供实际的控制类型的描述。
文件是用来定义让主机了解以及使用HID数据的数值。
这两份文件是由USBDeviceWorkingGroup制定的,可以在网址http:
//www.usb.org/developers/hidpage/#Class_Definition下载。
8.1.2HID设备的硬件要求
HID接口必须符合DeviceClassDefinitionforHumaninterfaceDevices规范内所定义的HID类别的需求。
在此文件内描述了所需的描述符、传输的频率以及传输的类型等。
为了符合规范,HID接口的端点与描述符都必须符合数个要求。
所有的HID传输都是使用默认控制管道或是一个中断管道,HID设备必须有一个中断输入端点来传送数据到主机,中断输出端点则不是必需的。
表8-1HID设备的传输类型
传输
类型
数据来源
数据类型
是否需
要管道
控制
设备(输入)
没有严格时间限制的数据
是
主机(输出)
没有严格时间限制的数据
或是没有中断输出管道时的任何数据
中断
设备(输入)
定时或低延迟的数据
是
主机(输出)
定时或低延迟的数据
是
主机与设备之间所交换的数据,可以分成两种类型:
•低延迟的数据,必须尽快地到达目的;
•配置或其他的数据,没有严格时间限制的需求。
中断管道是控制管道之外的另一种数据交换的方式,特别适合使用在接收端需要定时或是尽可能及时收到数据的时候。
中断输入管道携带数据到主机,中断输出管道则是携带数据到设备。
在总线忙的时候,控制管道可能会被延迟,而中断管道保证会有可得到的带宽。
HID不需要一定有中断输出管道。
如果没有中断输出管道,主机会在控制管道上使用HID设备特有的Set_Report请求来传送所有的报表。
8.1.3HID固件的要求
主机的驱动程序要与HID设备通信,设备的固件必须符合下列需求:
•设备的描述符必须识别该设备包含有HID接口。
•除了默认控制管道外,固件必须另外支持一个中断输入管道。
•固件必须包含一个报表描述符来定义要传送与接收的设备数据。
如果要传送数据,固件必须支持Get_Report控制传输与中断输入传输。
如果要接收数据,固件必须支持Set_Report控制传输与选择性的中断输出传输。
所有的HID数据都必须使用定义过的报表格式来定义报表中数据的大小与内容。
设备可以支持一个或多个报表。
在固件中的一个报表描述符用来描述此报表,以及如何使用报表数据的信息。
在每一个报表中的一个数值,定义此报表是一个输入(Input)、输出(Output)或是特征(Feature)报表。
主机在输入报表中接收数据,在输出报表中传送数据,特征报表可以在任何方向传递。
Windows98以及后来版本的HID驱动程序使用中断传输来传递输入报表。
输出报表的传输类型要根据设备支持的端点与Windows的版本而定。
Windows98Gold只符合HID1.0规范,它的HID驱动程序使用控制传输来传递输出报表。
Windows98SE、Wndows2000符合HID1.1规范,HID驱动程序在有中断输出端点时使用中断传输,否则使用控制传输来传递输出报表。
特征报表都是使用控制传输。
8.2HID设备描述符
HID设备连接到USB主机后,主机通过发送Get_Descriptor请求读取HID设备的描述符,了解描述符对了解USB设备是至关重要的。
8.2.1HID设备的描述符
HID设备除了支持USB设备的5种标准描述符之外,还支持HID设备特有的3种描述符。
这些描述符是:
•USB标准描述符:
设备、配置、接口、端点和字符串描述符。
•HID特有的描述符:
HID、报表(Report)和实体(Physical)描述符。
从描述符的关联关系看,HID描述符是关联于接口。
所以如果一个HID设备有2个端点,设备不需要每个端点有一个HID描述符。
从前面的USB描述符可以看出一个规律,描述符的第一、二字节分别是描述符的长度和类型,描述符的类型字段(bDescriptorType)表明描述符的种类,下表列出了不同描述符的类型字段数值。
表8-2HID的描述符
类型
描述符
应用
数值
标准
设备Device
所有设备必须有,只能一个
01
配置Configuration
所有设备必须有,至少一个
02
字符串String
可选择
03
接口Interface
每一个接口一个
04
端点Endpoint
除端点0之外的每个端点一个
05
设备限定Device_Qualiffier
同时支持全速与高速的设备必须有一个
06
Other_Speed_Configuration
07
Interface_power
08
类别
HID
HID设备必须有
21
Hub
29
HID
特定
报表Report
HID设备必须有
22
实体Physical
可选择的
23
对于一个HID设备,设备描述符与配置描述符没有HID特定的信息。
其设备描述符的bDeviceClass和bDeviceSubClass字段的值为0,接口描述符的bInterfaceClass字段值为03,表示设备的该接口是HID类别。
在接口描述符中其他包含HID特定信息的字段还有子类别码(blnterfaceSubClass)与协议码(blnterfaceProtocol字段)。
在接口描述符中子类别码字段等于1表示此设备支持启动接口(BootInterface)。
如果设备有启动接口,即便主机的HID没有加载驱动程序,设备也可以使用。
这种情形可能发生在计算机是由DOS直接启动,在启动时观看系统设置画面或使用Wndows的安全模式时。
含有启动接口的键盘或鼠标可以使用BIOS或许多主机支持的默认简单协议。
HID规范定义了键盘与鼠标的启动接口协议。
如果设备没有启动接口,并且接口描述符中协议码字段是1,表示设备支持键盘接口,协议码字段是2,表示支持鼠标接口。
接口描述符中协议码字段是0,表示设备不支持启动协议。
在HIDUsageTables规范中定义了键盘与鼠标的启动描述符(BootDescriptor)。
BIOS不需要从设备中读取描述符,因为它知道启动协议,并且假设设备支持启动协议。
所以要启动的设备不需要在固件内包含启动接口描述符,它只要在主机尚未要求在报表描述符中的定义协议时支持启动协议即可。
在操作系统加载HlD驱动程序后会使用Set_Protocol请求,将设备由启动协议转换成报表协议。
8.2.2HID描述符
HID描述符的主要作用是用来识别HID通信所使用的额外描述符。
下表是HID描述符结构。
表8-3HID描述符结构
偏移
量
字段
字节
数
数值
类型
说明
0
bLength
1
Numeric
描述符字节数
1
bDescriptorType
1
Constant
0x21=HID描述符
2
bcdHID
2
Numeric
HID规范版本号(BCD)
4
bCountryCode
1
Numeric
硬件设备所在国家的国家代码
5
bNumDescriptors
1
Numeric
类别描述符数目(至少有一个报表描述符)
6
bDescriptorType
1
Constant
类别描述符的类型
7
wDescriptorLength
2
Numeric
报表描述符的总长度
9
[bDescriptorType]...
1
Constant
附加的描述符的类型,可选的
10
[wDescriptorLength]...
2
Numeric
附加的描述符的总长度,可选的
bcdHID:
设备与其描述符所遵循的HID规范的版本号码,此数值是4个16进制的BCD格式字符。
例如版本1.1的bcdHID是0110h。
(2bytes)
bCountryCode:
硬件目的国家的识别码。
如果不说明,该字段为0。
bDescriptorType:
HID描述符附属的描述符的类型(报表或实体)。
每一个HID都必须至少支持一个报表描述符。
一个接口可以支持多个报表描述符,以及一个或多个实体描述符。
HID描述符的偏移量为9和10的bDescriptorType和wDescriptorLength可以重复存在多个。
1.报表描述符
报表描述符定义了执行设备功能的数据格式和使用方法。
报表描述符和USB的其他描述符是不一样的,它不是一个简单的表格,报表描述符是USB所有描述符中最复杂的。
报表描述符非常复杂而有弹性,因为它需要处理各种用途的设备。
报表的数据必须以简洁的格式来储存,这样才不会浪费设备内的储存空间以及数据传输时的总线时间。
实际上可以这样理解,报表内容的简洁,是通过报表描述符全面的、复杂的数据描述实现的。
报表描述符必须先描述数据的大小与内容。
报表描述符的内容与大小因设备的不同而不同,在进行报表传输之前,主机必须先请求设备的报表描述符,只有得到了报表描述符才可正确解析报表的数据。
报表描述符是报表描述项目(Item)的集合,每一个描述项目都有相对统一的数据结构,项目很多,通过编码实现。
(1)项目
报表描述符由描述HID设备的数据项目(Item)组成。
项目的第一个字节(项目前缀)由三部分构成:
项目标志(itemTag):
说明项目的功能,
项目类型(itemType):
说明项目的数据类型,
项目长度(itemSize):
说明项目的数据部分的长度。
HID的项目有短项目和长项目两种,其中短项目的格式如下图。
短项目的数据字节数由bSize的值定义,bSize为0、1、2、3时Data部分的字节数分别为0、1、2、4个字节。
(nn为数据长度)
短项目的项目类型由bType定义,bType为0、1、2时分别为Main、Global和Local类型。
(见后面的表8-4HID项目列表)
长项目可以携带较多的数据,其格式如下图。
项目中的第一个字节为上图中的特定值时表明该项目是一个长项目。
长项目中的bDataSize说明Data部分的字节数,bLongItemTag在HID规范中没有定义。
下面是通过汇编实现的一个简单的报表描述符,描述符的每一行是一个项目,该描述符描述了一个从设备接收2个字节的输入报表和发送2个字节到设备的输出报表。
HID_Report_desc_table:
db06h,A0h,FFh;UsagePage(Vendordefined)定义设备功能
db09h,A5h;Usage(VendorDefined)定义用法
dbA1h,01h;Collection(Application)开一个集合
db09H,A6h;Usage(Vendordefined)定义用法
;输入报表
db09h,A7h;Usgae(Vendordefined)定义用法
db15h,80h;LogicalMinimum定义输入最小值=-128
db25h,7Fh;LogicalMaximum定义输入最大值=+127
db75h,08h;ReportSize定义报表数据项大小=8
db95h,02h;ReportCount定义报表数据项个数=2
db81h,02h;Input(Data,Variable,Absolute)输入项目
;输出报表
db09h,A9h;Usgae(Vendordefined)定义用法
db15h,80h;LogicalMinimum定义输入最小值=-128
db25h,7Fh;LogicalMaximum定义输入最大值=+27
db75h,08h;ReportSize定义报表数据项大小=8
db95h,02h;ReportCount定义报表数据向个数=2
db91h,02h;Output(Data,Variable,Absolute)输出项目
dbC0h;EndCollection关闭集合
(2)项目的分类
报表的项目有Main、Global和Local三大类,每一类都有多个不同的项目,实现不同的描述。
Main类项目用于定义报表描述符中的数据项。
也可以组合其中的若干数据项成为一个集合。
Main项目可以分为带数据的Main项目和不带数据的Main项目。
带数据项的Main用于生成报表中的数据项,包括Input、Output和Feature项目。
不带数据的Main项目不生成报表中的数据项,包括Collection和EndCollection项目。
Global类项目实现对数据的描述,用来识别报表并且描述报表内的数据,包括数据的功能、最大与最小允许值以及数据项的大小与数目等。
改变由Main类项目生成的项目状态表。
Global类项目描述对后续的所有项目有效,除非遇到有新的Global类项目。
Local类项目定义控制的特征,这一类项目的作用域不超过下一个Main项目,所以在每一Main项目之前可能有多个Local项目。
Local项目用于描述后面的Input、Output和Feature项目。
下表列出的是全部的项目的前缀字和简要功能说明。
表8-4HID项目列表
项目
类型
项目标志(Tag)
项目前缀,nn为数据长度
功能说明
Main
类项目
(00)
Input
100000nn
定义输入报表,主机利用该信息解析设备提供的数据。
主机向控制端口发送Get_Report实现输入
Output
100100nn
创建输出报表,通过向设备发送Set_Report实现输出
Feature
101100nn
定义送往设备的设置信息
Collection
101000nn
定义2个以上数据(Input、Output和Feature)的关系为集合,Collection开始一个集合,之后的EndCollection结束集合。
Collection项目的数据部分说明Collection的类型
EndCollection
110000nn
Global
类项目(01)
UsagePage
000001nn
指定设备的功能(06h,A0h,FFh)
另外由于Usage项目有32位数据值,UsagePage项目用于为Usage项目在报表描述符中占居存储空间。
用于存放后续的Usage项目的高16位。
LogicalMinimum
000101nn
定义变量或数组项目的逻辑最小值和最大值
(-128,+127)(15h,80h)(25h,7Fh)
LogicalMaximum
001001nn
PhysicalMinimum
001101nn
定义变量或数组项目的物理最小值和最大值,分别和LogicalMinimum、LogicalMaximum对应
PhysicalMaximum
010001nn
UnitExponent
010101nn
定义数值是基于10的指数
Unit
011001nn
单位
ReportSize
011101nn
指定报表数据区域所包含的位数(=8)
ReportID
100001nn
报表ID,该项目在报表中插入一个字节的报表ID
ReportCount
100101nn
报表中数据域的数目(=2)
Push
101001nn
将Global项目状态表送入堆栈
Pop
101101nn
从堆栈恢复Global项目状态表
110001nn–
111101nn
保留
Local
类项目(10)
Usage
000010nn
用法索引值,表示对项目或集合建议的用法,用于当一个项目描述多个控制,对每一个变量和数组元素都有建议的用法(09h,A7h)
UsageMinimum
000110nn
定义阵列或位图中控制操作的第一个和最后一个用法
UsageMaximum
001010nn
DesignatorIndex
001110nn
确定用于控制的实体,指向物理描述符中的目标
DesignatorMinimum
010010nn
定义阵列或位图目标的起始和终止索引值
DesignatorMaximum
010110nn
StringIndex
011110nn
确定字符串描述符中的索引值
StringMinimum
100010nn
定义用于阵列或位图控制中字符串序列索引值的最小值和最大值
StringMaximum
100110nn
Delimiter
101010nn
定义一组Local项目的开始和结束,1=开始,0=结束
101010nn–
111110nn
保留
在这些项目中,UsagePage用来指定设备的功能,而Usage项目用来指定个别报表的功能。
UsagePage项目相当于是HID的子集合,Usage相当于是UsagePage的子集合。
2.报表描述符的项目
(1)Input、Outpot和Feature项目
这3个项目用来定义报表中的数据字段。
Input项目可以应用到任何控制、计数器读数或其他设备传给主机的信息。
一个输入报表包含一个或多个Input项目,主机使用中断输入传输来请求输入报表。
Ouput项目用来定义主机传送给设备的信息。
一个输出报表包含一个或多个Outpot项目。
输出报表包含控制状态的数据。
如果有中断输出管道,HID1.1兼容主机使用中断输出传输来传送输出报表,否则使用Set_Report控制请求。
Feature项目应用到主机传送给设备的信息,或是主机从设备读取Feature项目。
一个特征报表包含一个或多个Feature项目,Feature项目通常是包合影响设备与其组件整体行为的配置。
特征报表通常是控制可以使用实际的控制面板调整的设置,例如主机可以使用虚拟控制面板来让用户选择控制特征。
主机使用Set_Report与Get_Report请求来传送与接收特征报表。
在每一个Input、Output和Feature项目的前缀字之后是32位描述数据,目前最多定义了9个位,余的位则是保留。
位0~8的定义中只有位7不能应用于Input项目,除此之外其他的位定义都适应于Input、Output和Feature项目。
表8-5Input、Output和Feature项目的数据项说明
数据字段
含义说明
位
值
名称
0
0
Data
数据:
表示项目的内容是可更改的(读/写)。
1
Constant
常数:
表示项目的内容是不可更改的(只读)。
1
0
Array
数组:
报告全部控制的状态。
如在键盘报表中每一个键在报表中占一位,报表传输全部键的状态,可以同时按下任意多个键。
1
Variable
变量:
报告作用中的控制。
如在键盘报表中只报告按下的键的编号,可以同时按下的键的数目等于报表的计数(Global类项目ReportCount)
2
0
Absolute
绝对:
表示数值以一个固定值为基准。
游戏杆通常是报告绝对数据(游戏杆目前的位置)。
1
Relative
相对:
表示数据的改变以上一个读数为基准。
鼠标通常是报告相对数据(鼠标的移动位置)。
3
①
0
NoWrap
如果设置为1表示回转,当数值超过最小值到最大值的范围时将回转,如果最小值是0而最大值是10,超过最大值的下一个数值是0。
1
Wrap
4
①
0
Linear
线形:
表示测量的数据与报表的数据有线性的关系。
1
Non-Linear
非线性:
表示测量的数据与报表的数据没有线性的关系。
5
①
0
Preferred
优选状态:
表示控制在没有用户交互时会回到一个特定的状态。
如按钮就有优选状态,在无操作时保持未按下的状态。
1
Non-Preferred
非优选状态:
它维持在上一个用户选择的状态。
如交替的开关就没有优选状态。
6
①
0
NoNullPosition
无空状态位置:
表示控制永远在传送有效的数据。
1
NullState
空状态:
表示控制支持一个没有传送有效数据的状
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- USBHID 协议 中文版