USB HID设备报告描述符详解
power device hid报告描述

power device hid报告描述
HID (Human Interface Device) 报告格式通常用于描述那些通过 USB 接口与计算机通信的设备,例如键盘、鼠标、游戏控制器等。
这些报告包含描述设备属性和功能的详细信息,以便操作系统能够正确地识别和处理来自设备的输入。
一个HID 报告通常包含以下几个部分:
1. 描述符(Descriptor): 描述符是一个字节序列,它提供了有关设备的类型、子类和其他信息。
例如,它可能包括设备的供应商 ID、产品 ID、版本信息等。
2. 全局属性 (Global Properties): 这些属性描述了设备的一些全局设置,例如它是否支持数据报告、是否支持中断传输等。
3. 局部属性 (Local Properties): 这些属性提供了关于设备的功能和行为的
详细信息。
例如,如果设备是一个键盘,那么局部属性可能包括键盘布局、按键的数量和功能等。
4. 输入/输出元素 (Input/Output Elements): 这些元素描述了设备的数据元素,例如按钮、轴、开关等。
每个元素都有一个描述符,描述该元素的功能和行为。
在创建 HID 报告时,必须遵循特定的语法和格式规则,以确保操作系统能够正确地解析和处理报告。
这些规则是由 HID 规范定义的,任何想要创建HID 设备的制造商或开发者都必须遵守这些规范。
hid类键盘的报告描述符的理解

USB学习小记-HID类键盘的报告描述符的理解前言断断续续的学习了将近三个月,才把USB的HID类搞明白,速度真是够慢的。
利用晚上+周末的时间学习自己的东西确实是必要的,不过效率是有点低,以后要更专注一些才行,希望自己能做到吧。
在学习过程中,刚开始主要参考了周立功编写的一本《PDIUSBD12 USB 固件编程与驱动开发》,后面的学习主要参考电脑圈圈的资料包,包括里面的HID类的英文协议文档,还有一位台湾前辈几年前写的几篇文章,还有网络下有下得到的一些例程。
在此感谢各位大虾前辈的分享。
一、学习流程1,先大致看下USB1.1中文版的协议(就是网上能找到的翻译版),先了解一下USB1.1的工作流程(可能此时的你会对其中很多内容都很含糊,不过没关系,请坚持!);2,选择一款最常用的USB芯片,比如我选择的NXP的PDIUSBD12.有很多使用该芯片的源码可以在上网搜索得到,而且周立功公司为其写了一本书,前面的章节对USB的工作流程作了一个简单而又清晰的讲解,而不致让人陷入协议的海洋里;3,有了对USB1.1协议的大致了解,选好了开发的平台(我刚好手上有一块周立功公司的EASEARM2200的开发板,上面有D12)之后,先跑一下附带的例程(此开发板配套的例程是基于UCOS2系统的,刚开始用它来参考肯定晕)。
没有能跑的例程,那就上网找一下经验证的例程,比如电脑圈圈在EDNCHINA建立的USB学习小组里有很好的几个例程,而且都是基于51+D12的,所以极具参考价值。
我是参考周立功公司出的那本书来学习的,电脑圈圈的例程与此书的例子书写风格较相似,所以可以互相参考。
如果也没有开发板,那可购买一套电脑圈圈他们搞活动的套件或者直接用51+D12自己搭一下,这样就可以直接用电脑圈圈写的例程了,可以避免走很多弯路。
4,有了例程的直观印象后,此时可以上BUS HOUND5.0了。
此软件可以观察到USB设备与主机(PC)之间的通讯数据,特别那11个标准请求的理解,通过此软件的观察,可以更好理解其相互之间是如何完成这个握手枚举过程的。
USBHID协议详情

USB HID类设备属于人机交互操作的设备,是一个比较大的类,用于控制计算机操作的某些方面,如USB鼠标、USB键盘、USB游戏操作杆、USB触摸板、USB轨迹球、电话拨号设备、VCR遥控等等设备。
另外,使用HID设备的一个好处就是操作系统自带了HID类的驱动程序,用户无需开发很麻烦的驱动程序,只有直接使用API调用即可完成通信,所有很多简单的USB设备喜欢枚举成HID设备,这样就可以不用安装驱动而直接使用。
1、HID设备描述符当插入USB设备后,主机会向设备请求各种描述符来识别设备。
为了把一个设备识别为HID类,设备在定义描述符的时候必须遵守HID规范。
HID设备的描述符除了5个USB的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符)外,还包括3个HID设备类特定描述符:HID描述符、报告描述符、物理描述符。
HID描述符是关联于接口(而不是端点)的,所以设备不需要为每个端点都提供一个HID描述符。
设备和主机的通信是通过报告的形式来实现的。
而物理描述符不是必需的。
5个标准描述符中与HID设备有关的部分有:设备描述符中bDeviceClass、bDeviceSubClass和bDeviceProtocol三个字段的值必须为0。
接口描述符中bInterfaceClass的值必须为0x03,bInterfaceSubClass的值为0或1,为1表示HID设备是一个启动设备(BootDevice,一般对PC机而言才有意义,意思是BIOS启动时能识别并使用您的HID设备,且只有标准鼠标或键盘类设备才能成为Boot Device。
如果为0则只有在操作系统启动后才能识别并使用您的HID设备)。
HID接口描述符中bInterfaceProtocol的含义bInterfaceProtocol的取值含0 NO1 键2 鼠3~255 保1.1 HID描述符HID描述符关联于接口描述符,因而如果一个设备只有一个接口描述符,则无论它有几个端点描述符,HID设备只有一个HID描述符。
USB HID报告及报告描述符简介

在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。
USB报告描述符(Report Descriptor)是HID设备中的一个描述符,它是比较复杂的一个描述符。
USB HID设备是通过报告来给传送数据的,报告有输入报告和输出报告。
输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。
报告是一个数据包,里面包含的是所要传送的数据。
输入报告是通过中断输入端点输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出。
而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。
通过它,USB HOST可以分析出报告里面的数据所表示的意思。
它通过控制输入端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求是发送到接口的,而不是到设备。
一个报告描述符可以描述多个报告,不同的报告通过报告ID来识别,报告ID在报告最前面,即第一个字节。
当报告描述符中没有规定报告ID时,报告中就没有ID字段,开始就是数据。
更详细的说明请参看USB HID协议,该协议可从下载。
USB报告描述符可以通过使用HID Descriptor tool来生成,这个工具可以到下载,为了方便大家,我顺便上传了一份。
/Upload/Blog/2007/4/2/af7c3443-ad61-4465-ADC7-a74d28bbc322.zip下面通过由HID Descriptor tool生成的USB鼠标和USB键盘来说明一下报告描述符和报告。
code char KeyBoardReportDescriptor[63] = {//表示用途页为通用桌面设备0x05, 0x01, // USAGE_PAGE (Generic Desktop)//表示用途为键盘0x09, 0x06, // USAGE (Keyboard)//表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION 0xa1, 0x01, // COLLECTION (Application)//表示用途页为按键0x05, 0x07, // USAGE_PAGE (Keyboard)//用途最小值,这里为左ctrl键0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)//用途最大值,这里为右GUI键,即window键0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)//逻辑最小值为00x15, 0x00, // LOGICAL_MINIMUM (0)//逻辑最大值为10x25, 0x01, // LOGICAL_MAXIMUM (1)//报告大小(即这个字段的宽度)为1bit,所以前面的逻辑最小值为0,逻辑最大值为10x75, 0x01, // REPORT_SIZE (1)//报告的个数为8,即总共有8个bits0x95, 0x08, // REPORT_COUNT (8)//输入用,变量,值,绝对值。
USBHID协议

USB HID 类设备属于人机交互操作的设备,是一个比较大的类,用于控制计算机操作的某些方面,如USB 鼠标、USB 键盘、USB 游戏操作杆、USB 触摸板、USB 轨迹球、电话拨号设备、VCR 遥控等等设备。
另外,使用HID 设备的一个好处就是操作系统自带了HID 类的驱动程序,用户无需开发很麻烦的驱动程序,只有直接使用API 调用即可完成通信,所有很多简单的USB 设备喜欢枚举成HID 设备,这样就可以不用安装驱动而直接使用。
1、HID 设备描述符当插入USB 设备后,主机会向设备请求各种描述符来识别设备。
为了把一个设备识别为HID 类,设备在定义描述符的时候必须遵守HID 规范。
HID 设备的描述符除了 5 个USB 的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符)外,还包括 3 个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 设备)。
HID 接口描述符中bInterfaceProtocol 的含义bInterfaceProtocol 的取值含NO1键2鼠3~255保1.1 HID 描述符HID 描述符关联于接口描述符,因而如果一个设备只有一个接口描述符,则无论它有几个端点描述符,HID 设备只有一个HID 描述符。
USBHID键盘报告范文描述符

USBHID键盘报告范文描述符HIDScript脚本语言的理解:Globalitem--全局项Mainitem--主项localitem--局部项对于Main项,parer解释器,将顺序解释集合中的数据,并且,解释器解释完的数据,将按Main项出现的先后顺序,主要是Input和Output项,顺序拼接生成对应的数据bit位,解释器将以关键字Collection开始解释并拼接bit位信息,关键字EndCollection将结束paer解释器的工作,我把关键字Collection和关键字EndCollection叫做\集合\,关键字Collection和关键字EndCollection都是Mainitem主项,对应的控制字分别为:101000nn和110000nn,如果Collection后边有1个参数数据,那么即为:10100001=0某A1,如Collection(Application)翻译成控制码后为:0某A1,0某01;0某A1的1表示有1个参数数据,0某01表示Application在HID协议中规定的索引值为0某01,pc的HID驱动程序在parer解释器中会通过0某01得知,是对Application进行数据流位生成,就是说HID报告描述符(ReportDecriptor)所描述的数据流是为了Application使用的,Application在中包含两种设备:moue和keyboard,至于Collection(Application)里边描述的是moue还是keyboard,将具体的由Uage进一步限定,如:Uage(KeyBoard),也就是说明确告诉pc的HID驱动程序的paer解释器,接下来的这段信息最后生成出来的bit位数据信息,将交由pc的HID驱动程序中KeyBoard对应的API函数处理,当然这只是HID硬件设备开发者给pc的HID驱动程序的paer解释器提供的一个建议值,比如我们做DDK下的HID驱动二次开发,那么我们可以很随意,但是HID硬件设备开发者,建议使用的HID驱动程序API接口,最好遵守,因为HID硬件设备开发者比DDK开发人员更清楚送上来的bit数据流的真正物理意义.Input和Output是用来真正生成bit位流数据域的关键字,他们描述的东西是最后通过ub总线实实在在发送到pc或者从pc接收的数据位,当然这些bit数据流数据域所代表的意义以及某段bit位们所代表的意思以及这些bit将交由pc上HID驱动程序的哪一个API接口来做进一步解析(是moue还是keyboard),需要其他描述符来描述,比如前边的Uage就是其中的1个描述符,如果一个HID设备同时提供2种不同的功能,那么就会分别生成2个bit位流数据域,每个bit位流数据,将交由不同的驱动解析,比如,一个keyboard可能还集成了一个附属的鼠标功能,那么键盘数据信息将由HIDcript脚本描述的keyboard对应bit数据位流传送,moue数据将由HIDcript脚本描述的moue对应bit数据位流传送,但同一个Input 管道怎么能传送两个独立的数据流呢,答案很简单:不能,所以又引入了一个ReportID的概念,ID 用来标识多条独立的bit数据流,pc的HID驱动程序根据ID,将这些独立的bit数据流们路由到相应的API处理函数上去,进而不同的bit数据流数据最终都能够被自己对应的API驱动函数正确接收并解析处理.对于2字节、4字节等多字节数据的传输,是按小端模式little-endian进行的.这些多字节数据的最小值由LogicalMinimum定义,最大值由LogicalMa 某imum定义,如果两个值均为非负值,那么bit位流数据就是无符号数,如果没有明确指定,那么作为有符号数处理,另外HID1.1协议不允许传输浮点数据.硬件开发者应该时刻清除自己写的HIDcript脚本所描述的数据流将来应该由PC上的HID驱动程序怎么使用,另外对于硬件开发者来说,对于不允许PC驱动修改的bit 位数据,HID1.1协议制定者强烈建议采用NULL数值,最好不要随便填其他值.----------------------------------------------Mainitem--主项当前一共5个:1)Input2)Output3)Feature4)Collection5)EndCollection----------------------------------------------Globalitem--全局项当前一共13个:1)UagePage2)LogicalMinimum---var变量或array数组的逻辑最小值3)LogicalMa某imum4)PhyicalMinimum5)PhyicalMa某imum6)UnitE某ponent---单位的指数值,是10的指数7)Unit---单位索引号:可以是时间单位、电流单位、电压单位和距离单位等等.8)ReportSize9)ReportID---数据流的ID值设置10)ReportCount11)Puh12)Pop13)Reeved---保留----------------------------------------------localitem--局部项当前一共11个:1)Uage---定义UagePage下面某个功能item的起始索引值,比如Keyboard功能,LED功能等,这也告诉pc的HID解释器,Input或Output变量或数组的相应生成数据位用来描述Uage引用到的那个功能,如:用来描述Keyboard功能或LED功能等.2)UageMinimum---定义与array或bitmap关联的uage定义的某个功能下的起始值Uage作为UagePage的一个子功能索引号,同时Uage自己也有很多子功能,或者说有很多个子值,这里就是定义这些子值的范围值,之后和用Input或Output生成bit位数据流,进行相应关联.(可以用多维数组来说明,可能会更明确一点)前一个基础上Uage(6),当然在HIDDecriptorTool里边6有它的字符串名,即:Uage(Keyboard),然后80就是Keyboard里边的一个索引取值,查找之后是:KeyBoardLeftArrow,所以Uage_Minimum(80)就等于Uage_Minimum(KeyBoardLeftArrow)Uage的顺序先后和ReportCount定义的bit位组的先后顺序依次一一对应,UageMinimum和UageMa某imum之间的Uage的索引值也将依次与ReportCount定义的bit位组的先后顺序依次一一对应上。
STM32 USB HID详解

STM32 USB HID详解1、USB简介2、USB描述符USB只是一个总线,只提供一个数据通路而已。
USB总线驱动程序并不知道一个设备具体如何操作,有哪些行为。
具体的一个设备实现什么功能,要由设备自己来决定。
那么,USB主机是如何知道一个设备的功能以及行为呢?这就要通过描述符来实现了。
描述符中记录了设备的类型、厂商ID和产品ID(通常依靠它们来加载对应的驱动程序)、端点情况、版本号等众多信息。
标准的USB设备有5种USB描述符:设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符。
下面详解:2.1、设备描述符一个USB设备只有一个设备描述符。
设备描述符主要记录的信息有:设备所使用的USB协议版本号、设备类型、端点0的最大包大小、厂商ID(VID)和产品ID(PID)、设备版本号、厂商字符串索引、产品字符串索引、设备序列号索引、可能的配置数等。
设备描述符里决定了该设备有多少种配置,每种配置都有一个配置描述符。
配置描述符主要记录的信息有:配置所包含的接口数、配置的编号、供电方式、是否支持远程唤醒、电流需求量等。
2.3、接口描述符在每个配置描述符中又定义了该配置有多少个接口,每个接口都有一个接口描述符。
接口描述符主要记录的信息有:接口的编号、接口的端点数、接口所使用的类、子类、协议等。
2.4、[类描述符]该描述符不是必须的,如果配置的USB类型有类特殊描述符(如HID类),它跟在相应的接口描述符之后。
在接口描述符里又定义了该接口有多少个端点,每个端点都有一个端点描述符。
端点描述符主要记录的信息有:端点号及方向、端点的传输类型、最大包长度、查询时间间隔等。
2.6、[字符串描述符]字符串描述符主要是提供一些方便人们阅读的信息,它不是必需的。
3、USB HID为了把一个设备识别为HID类别,设备在定义描述符的时候必须遵守HID规范。
除了USB标准定义的一些描述符外,HID设备还必须定义HID描述符。
hid协议报告描述总结

HID报告描述符主要内容整理●刚刚接触USB(HID)时对【报告描述符】感到难于理解, 因此就更无从下手。
下面根据2个主要的协议文本整理出一些常用信息, 不完整, 备忘。
⏹主要参考文本:⏹【协议文本1】: 《Device Class Definition for Human Interface Devices (HID)》Ver1.11【协议文本2】: 《Universal Serial Bus HID Usage Tables》Ver1.12每个协议文本后面的附录都有很多例子可供参考借鉴。
0、主要术语与概念(1)报告(Report): HID设备与主机交换信息的单位(报告字节数似乎没有限制);(2)报告描述符(Report Description): 用许多【项目】说明报告的格式与【用途】;(3)用途(Usage): 用于指出报告中某个数据域的意义或目的, 32bit。
高16bit用途页(Usage Page)指出用途的大类, 低16bit用途ID(Usage ID)指出用途大类下的子用途;(4)项目(Item):报告描述符用于说明数据域的某种属性的数据, 有短项目和长项目之分, 短项目1~5B, 长项目3~255B;(5)共有3种类型的项目: 主项目、全局项目(Global)、局部项目(Local);(6)主项目(Main Item)共有5个, 其中的Input、Output和Feature会产生实际的数据域并附带说明其操作特性(见2.1);其余2个Collection和End Collection是一对括号, 其间的内容构成一个【集合】, 用于限定集合中信息的整体特性;(7)全局项目(Global Item): 说明其后主项目产生的数据域的某方面特性, 一旦说明一直有效, 除非遇到一个新的全局项目说明改变其值;(8)局部项目(Local Item): 说明其后主项目产生的数据域的某方面特性, 但只对其后的一个主项目有效;(9)可以认为所有用【全局项目】说明的各种数据域特性构成一个【全局状态表】, 随着新的【全局项目】出现, 该表在不断变化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
USB HID设备报告描述符详解概述:报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途(usage)上的说明。
USB通讯协议的规范是以1ms产生一个USB帧(frame),USB设备可以每一个帧中发送和接收一个交换(transaction)。
交换是由几个封包(packet)组成,而传输是由一个或几个交换来完成传送一口中有效的数据。
在这里,传输和报告的意思相类似。
传输方式有四种,初始学一般只要了解控制型传输(control transfer)和中断型传输(interrupt transfer)即可。
控制型传输是当需要时才执行传输要求,是最一般的传输方式,组态、命令和状态的通讯都可以使用控制型传输;控制型传输主要用于消息型数据(message-type data)。
中断型传输目的在做重复的数据更新(recurring data)传输,精确一点而言,即是在每个有限有周期内(bounded period)作至少一次的小量数据发送或接收;所以适用于流动型数据(stream-type data),注意这里所谓的周期时间就是在端点描述符中的轮询间隔时间。
报告有三种:input,output,和Feature.后面将作进一步介绍。
中断型输入管线(interrupt in pipe)仅可以传送input报告;中断型输出管线(interrupt out pipe)仅可以传送output报告;但是控制型管线(control pipe)可以传送input,out put和feature报告。
端点描述符有声明所使用的端点为何种管线。
数据本身没有任何意义,要赋于用途才能明确其为控制什么(control);例如设备上的按钮指示灯和X与Y轴的位移等都通称控制,数据则为按钮和指示灯的开关状态或X与Y轴的位移量。
为了这个目的应运而生报告描述符,其将数据的操控与它的用途作一对一的对应,所以解读报告后就可以知道每个数据作何种操作。
所以“传输的数据”和“操作”只是一事件的两种描述方式。
用途是以一个32位卷标(称作usage tag)来表示,高16位称作usage page(用途类页),低16位称为usage DI(用途识别名):Usage = (usage page:usage ID)举例说明:二个字节分别为x和y轴的位移数据,因此第一个字节的usage =(generic desktop:X),而第二个字节的usage = (generic desktop:Y),其中generic desktop为用途的大类别(称作用途类页)之一,x和y轴的操作用途属于此用途类页。
文件universal serial Bus HID Usage Table完整列出所有的usag e pages(用途类页)和usage ID(用途识别名),使用者必须遵照文件的规范来声明操作的用途。
该文件的附录A有十多个报告描述符的范例,值得研究下。
表1、报告描述符的标签标签:用途卷标只是报告描述符诸多标签的一个。
表1列出所有的卷标,利用这些卷标取可以清楚完整的描述符操作的用途。
报告描述符的语法不同于USB标准描述符,它是以项目(items)方式排列而成,无一定的长度;项目有一个前辍(p refix),然后跟着一个括号,内为该项目的数据:item = prefix(data)。
项目分成三种类别:主项目,全局项目,区域项目。
主项目中的input,oupu t,feature三个卷标用来表示报告中数据的种类,这些是报告描述符中最主要的项目,其他项目都是用来修饰这三种项目。
主要项目中其他二个卷标后面再作详细的介绍。
●Input 项:表示设备操作输入到主机的数据模式。
这个数据格式就形成一个输入报告,虽然输入报告可以用控制型管线以get report(input)来传输,但是通常用中断型输入管线来传输以确保在每一固定周期内都能将更新的输入报告传给主机。
●Output项:表示由主机输出到装置操作的数据格式。
这个数据格式就形成一个输出报告。
输出报告通常不适用轮询的方式来传送给设备,而是由应用软件依实际需求以传令方式要求送出输出报告,所以大多用控制型管线以set re port(output)指令来将报告送到设备。
当然也可以选择用中断型输出管线来传送,只是通常不建议这样用。
●Feature项:表示由主机送到设备的组态所需数据的数据格式。
这个数据模式就形成一个特征报告。
特征报告只能用控制型管线以get report(feature)和set report(feature)指令分别来取得和设定设备的特征值。
●范例:考虑一个2X16字的显示装置,它的列数、行数、字宽、和字高为固定值属于feature报告;显示状态例如“就绪”和“输入字错误”则属于in put报告;光标位置和显示的字需可读写,所以属于另一个feature报告;更新显示的字则为output报告。
为了区别两个features,要用到全局项目中的report ID,每个feature报告有一个不同的report ID,因而主机请求指令要加上report ID的值:get report(feature,report ID)和Set report(feature,report ID)。
主项目用来定义报告中数据的种类和格式,而说明主项目之意义与用途为全局项目和区域项目。
顾名思义,区域性项目只能适用于列于其下的第一个主项目,不适用于其他主项目,若一个主项目之上有几个不同的卷标的区域性项目,则这些区域性项目皆适用于描述该主项目。
相反,全局性项目适用于其下方的所有主项目,除非另一个相同卷标的全局性项目出现。
为了清楚说明报告描述符,将使用“项目状态表”(item state table)用来表示在某位址处适用的全局性项目的组合。
图1显示全局性项目和区域性项目与所描述的主项目之对应关系。
区域性项目卷标:简单地说,区域性项目(见表1)只是说明用途而已。
Designator是要搭配实体描述符使用的,这里不对实体描述符进行介绍,所以略过这些designator标签。
标签Usage 实际上应该称作Usage ID,它搭配全域项目的Usage Page 卷标才形成前文所定义的用途{usage}﹔但是报告描述符允许在区域项目的Usage 卷标直接用32位的方式来指定用途,这种方式称作扩充式用途指定法(extended usage)以示区别。
例如:Usage(Generic Desktop:Mouse),Usage Minimum(Keyb oard:0),和Usage Maximum(Keyboard:101)。
很明显的,扩充式用途指定法会取代『项目状态表』中的Usage Page。
还有,使用扩充式用途指定法时,数据的高16 个位为用途类页Usage Page,低16 个位则为用途识别名Usage ID。
往往一个报告数据会对应到几个操作,因而会有几个用途,例如101 按键的键盘利用不同代码代表不同的键,每一个键是一个操作,有自己的用途,要将所有Usage ID 列出不太现实,所以就需要Usage Minimum 和Usage Maximum 二个标签。
以键盘为例,主项目之上只要二个区域项目:Usage Minimum (0), Us age Maximum (101)。
如此一来,则无键按下(Usage ID 为0)和101 键中任一键被按下(Usage ID 为1 至101)的用途都被赋于到一个报告数据上,后面会有一个范例进一步解说。
卷标String Index 类似卷标Usage,而卷标String Minimum 和String Ma ximum 则类似标签Usage Minimum 和Usage Maximum。
如果希望某个操作对应到一个字串,则用String Index 来描述该操控的报告数据,这个字符串在字符串描述符中,StringIndex (data)项目中的data 是这个字符串在字符串描述符中的位置索引。
如果需要用到几个字符串,则可以使用String Minimum 来指向字符串描述符中被用到字符串的最先位置索引,和String Maximum 来指向最后位置索引。
标签Delimiter 很少用到,请参考Universal Serial Bus HID Usage Tables 文件中Appendix B 的范例详细说明。
全局项目卷标全局项目的卷标事实上只要Usage Page,Logical Minimum,Logical Maxi mum,Report Size,Report ID,Report Count 就足够了。
表2 列了二个音量操作的例子(音量增减键和音量旋钮)将用来辅助说明这些卷标,不过主项目括号内的数据会在后文中再做说明。
表2、音量操作举例查阅Universal Serial Bus HID Usage Tables 文档,这两个例子的用途需要令为(Consumer: Volume)。
Usage Page 前面已经介绍过了。
Report Size 用来设定主项目(Input,Output,Feature)的报告字段大小,它的单位是位。
主项目会对每个操作产生一个报告字段,字段大小则由Report Size 决定。
而Report Count 用来设定主项目之报告字段的数目,其等于操作的数目。
音量增减键的例子中ReportCount (1)表示主项目Input 只产生一个字段,所以可知只有一个音量增减键﹔而Report Size (2)表示这个字段为2 位。
另一个音量旋钮例子也是只有一个旋钮,所以用Report Count (1)﹔但是因为Report Size (7),所以该旋钮的数据字段为7位,可以表示0到127之数值。
再举一例,如果是鼠标的三个按键,每个按键占用一个一位的字段,则Report Size (1), Report Count (3)﹔那么这个报告长度为三个位,可以同时呈现出三个按键的状态(原状或被按下)。
Logical Minimum 和Logical Maximum 在说明每个报告字段的数值范围,这是纯数值所以称为逻辑数值(logical value)。
音量增减键的例子中Logical Mini mum (-1),Logical Maximum (1)表示只会出现-1, 0, 1 三种数值,所以用到二位(即ReportSize(2)),0b11 代表-1,0b00 代表0,0b01 代表1。
在音量旋钮例子中,虽然用7 位作一字段,但是旋钮仅会产生0 到100 的数值,因为Logica l Minimum (0)和Logical Maximum (100)。