HID 报告描述符终极解析
HID报告描述符

基于HID 类的USB 人机接口设计作者:北京交通大学 涂晓强 周洪利 来源:本站原创 点击数:235 更新时间:2007-11-27您可以添加到网摘 让更多人关注此文章:目前市场上USB 设备的种类繁多,但是这些设备会有一些共同的特性,根据这些特性可以把USB 设备划分为不同的类,如显示设备、通信设备、音频设备、大容量存储设备、人机接口设备(HID )。
这里介绍如何实现HID 类设备,以及如何在应用程序中对HID 类设备进行访问。
从Windows98操作系统开始,为HID 类设备提供了通用的驱动程序,所以只要按照HID 设备类的规范编写设备的固件程序,就能够让Windows 系统自动识别设备,省去了复杂的驱动程序编写过程。
1 HID 协议简介人机接口设备(HID )主要是指一些人与计算机进行交互的设备,如键盘、鼠标、游戏杆等;但是HID 设备不一定非要是这些人机交互设备,只要符合HID 设备级定义规范要求的都可以认为是HID 设备。
HID 设备有以下主要特点:① 交换的数据存储在报告的结构内,设备必须支持HID 报告格式。
② 每笔事务可以携带小量或中量的数据。
低速设备每笔事务最大为8字节,全速设备每笔最大为64字节,高速设备最大为1 024字节;③ 有最大传输速度的限制。
低速设备最快10 ms 一笔事务,最高速度为800 B/s ;全速设备最快1 ms 一笔事务,最高速度为64 KB/s ;高速设备最快125 μs 一笔事务,最高速度为24.576 MB/s 。
④ 没有传输速度的保证。
当插入USB 设备后,主机会向设备请求各种描述符来识别设备。
为了把一个设备识别为HID 类别,设备在定义描述符的时候必须遵守HID 规范。
图1显示了HID 各种描述符之间的关系。
事实上,每个设备可以有多个接口描述符来实现多接口设备,而且每个接口描述符下应该有多个端点描述符。
图1 HID各种描述符之间的关系从图1中可以看出,除了USB标准定义的一些描述符外,HID设备还必须定义HID描述符。
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描述符。
HID 报告描述符终极解析

USB HID Report终极解析 HID的报告描述符巨难懂,关键是数据格式与每一位代表的意思。
经过三天的研究,终于将HID Report的每一个数据位的含义弄清楚了,现将数据解析如下,最后附上了一个HID 通信的Report例子。
以一个键盘的HID Report为例:键盘的HID报告描述符:code char KeyBoardReportDescriptor[63] = {0x05, 0x01, // USAGE_PAGE (Generic Desktop)0x09, 0x06, // USAGE (Keyboard)0xa1, 0x01, // COLLECTION (Application)0x05, 0x07, // USAGE_PAGE (Keyboard)0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)0x15, 0x00, // LOGICAL_MINIMUM (0)0x25, 0x01, // LOGICAL_MAXIMUM (1)0x75, 0x01, // REPORT_SIZE (1)0x95, 0x08, // REPORT_COUNT (8)0x81, 0x02, // INPUT (Data,V ar,Abs)0x95, 0x01, // REPORT_COUNT (1)0x75, 0x08, // REPORT_SIZE (8)0x81, 0x03, // INPUT (Cnst,V ar,Abs)0x95, 0x05, // REPORT_COUNT (5)0x75, 0x01, // REPORT_SIZE (1)0x05, 0x08, // USAGE_PAGE (LEDs)0x19, 0x01, // USAGE_MINIMUM (Num Lock)0x29, 0x05, // USAGE_MAXIMUM (Kana)0x91, 0x02, // OUTPUT (Data,V ar,Abs)0x95, 0x01, // REPORT_COUNT (1)0x75, 0x03, // REPORT_SIZE (3)0x91, 0x03, // OUTPUT (Cnst,V ar,Abs)0x95, 0x06, // REPORT_COUNT (6)0x75, 0x08, // REPORT_SIZE (8)0x15, 0x00, // LOGICAL_MINIMUM (0)0x25, 0xFF, // LOGICAL_MAXIMUM (255)0x05, 0x07, // USAGE_PAGE (Keyboard)0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)0x81, 0x00, // INPUT (Data,Ary,Abs)0xc0 // END_COLLECTION};具体分析如下:code char KeyBoardReportDescriptor[63] = {0x05, 0x01, // USAGE_PAGE (Generic Desktop)// 分析根据HID短项目数据格式短项目的编码形式如下:0x05 = 0000 01010000:Usage Page01:bType,全局(bType = 0:主项目;bType = 1:全局项目;bType = 2:区域项目;)01:bSize,1字节(BSize 用来指出项目的数据所需字节的数目,该数目仅可以为0(当bSize=0),1(当bSize=1),2(当bSize=2),和4(当bSize=3)﹔注意不可以为3个字节。
USBHID键盘报告描述符

USBHID键盘报告描述符USB HID键盘报告描述符最近弄USB驱动,⾥⾯的报告描述符晕了我好⼏天!找了⼀些资料希望能对⼤家有帮助~~~~~~~~~~~~~~HID Script脚本语⾔的理解:Global item--全局项Main item --主项local item --局部项对于Main项,parser解释器,将顺序解释集合中的数据,并且,解释器解释完的数据,将按Main项出现的先后顺序,主要是Input和Output项,顺序拼接⽣成对应的数据bit位,解释器将以关键字Collection开始解释并拼接bit位信息,关键字End Collection将结束paser解释器的⼯作,我把关键字Collection和关键字End Collection叫做"集合",这样给他取个名字,以后说明起来也⽅便些,"集合"⾥边描述的就是最后⽣成的由HID硬件设备1次性上发给pc的HID驱动程序的数据流了.在中,(gliethttp)关键字Collection和关键字End Collection都是Main item主项,对应的控制字分别为:1010 00 nn和1100 00 nn,如果Collection后边有1个参数数据,那么即为: 1010 00 01=0xA1,如Collection(Application)翻译成控制码后为:0xA1,0x01;0xA1的1表⽰有1个参数数据,0x01表⽰Application在HID协议中规定的索引值为0x01,pc的HID驱动程序在parser解释器中会通过0x01得知,是对Application进⾏数据流位⽣成,就是说HID报告描述符(Report Descriptor)所描述的数据流是为了Application使⽤的,Application在中包含两种设备:mouse和keyboard,⾄于Collection(Application)⾥边描述的是mouse还是keyboard,将具体的由Usage进⼀步限定,如:Usage(KeyBoard),也就是说明确告诉pc的HID驱动程序的paser解释器,接下来的这段信息最后⽣成出来的bits 位数据信息,将交由pc的HID驱动程序中KeyBoard对应的API函数处理,当然这只是HID硬件设备开发者给pc的HID驱动程序的paser解释器提供的⼀个建议值,⽐如我们做DDK下的HID驱动⼆次开发,那么我们可以很随意,但是HID硬件设备开发者,建议使⽤的HID驱动程序API 接⼝,最好遵守,因为HID硬件设备开发者⽐DDK开发⼈员更清楚送上来的bit数据流的真正物理意义.Input和Output是⽤来真正⽣成bits位流数据域的关键字,他们描述的东西是最后通过usb总线实实在在发送到pc或者从pc接收的数据位,当然这些bits数据流数据域所代表的意义以及某段bits位们所代表的意思以及这些bits将交由pc上HID驱动程序的哪⼀个API接⼝来做进⼀步解析(是mouse还是keyboard),需要其他描述符来描述,⽐如前边的Usage就是其中的1个描述符,如果⼀个HID设备同时提供2种不同的功能,那么就会分别⽣成2个bits位流数据域,每个bits位流数据,将交由不同的驱动解析,⽐如,⼀个keyboard可能还集成了⼀个附属的⿏标功能,那么键盘数据信息将由HID script脚本描述的keyboard对应bits数据位流传送,mouse数据将由HID script脚本描述的mouse对应bits数据位流传送,但同⼀个Input管道怎么能传送两个独⽴的数据流呢,答案很简单:不能,所以⼜引⼊了⼀个Report ID的概念,ID⽤来标识多条独⽴的bits数据流,pc的HID驱动程序根据ID,将这些独⽴的bits数据流们路由到相应的API处理函数上去,进⽽不同的bits数据流数据最终都能够被⾃⼰对应的API驱动函数正确接收并解析处理.对于2字节、4字节等多字节数据的传输,是按⼩端模式little-endian进⾏的.这些多字节数据的最⼩值由Logical Minimum定义,最⼤值由Logical Maximum定义,如果两个值均为⾮负值,那么bits位流数据就是⽆符号数,如果没有明确指定,那么作为有符号数处理,另外HID1.1协议不允许传输浮点数据.硬件开发者应该时刻清除⾃⼰写的HID script脚本所描述的数据流将来应该由PC上的HID驱动程序怎么使⽤,另外对于硬件开发者来说,对于不允许PC驱动修改的bit位数据,HID1.1协议制定者强烈建议采⽤NULL数值,最好不要随便填其他值.----------------------------------------------Main item --主项当前⼀共5个:1)Input2)Output3)Feature4)Collection5)End Collection----------------------------------------------Global item--全局项当前⼀共13个:1)Usage Page2)Logical Minimum ---var变量或array数组的逻辑最⼩值3)Logical Maximum4)Physical Minimum5)Physical Maximum6)Unit Exponent ---单位的指数值,是10的指数7)Unit ---单位索引号:可以是时间单位、电流单位、电压单位和距离单位等等.8)Report Size9)Report ID ---数据流的ID值设置10)Report Count11)Push12)Pop13)Reseved ---保留----------------------------------------------local item --局部项当前⼀共11个:1)Usage ---定义Uage Page下⾯某个功能item的起始索引值,⽐如Keyboard 功能,LEDs功能等,这也告诉pc的HID解释器,Input或Output变量或数组的相应⽣成数据位⽤来描述Usage引⽤到的那个功能,如:⽤来描述Keyboard功能或LEDs功能等.2)Usage Minimum ---定义与array或bitmap关联的usage定义的某个功能下的起始值Usage作为Uage Page的⼀个⼦功能索引号,同时Usage⾃⼰也有很多⼦功能,或者说有很多个⼦值,这⾥就是定义这些⼦值的范围值,之后和⽤Input或Output⽣成bits位数据流,进⾏相应关联.(可以⽤多维数组来说明,可能会更明确⼀点)如:Gliethttp[5][6][80],Gliethttp为最上层,5就是Usage Page(5),6就是在前⼀个基础上Usage(6),当然在HID Descriptor Tool ⾥边6有它的字符串名,即:Usage(Keyboard),然后80就是Keyboard⾥边的⼀个索引取值,查找之后是:KeyBoard LeftArrow,所以Usage_Minimum(80)就等于Usage_Minimum(KeyBoard LeftArrow)Usage的顺序先后和Report Count定义的bits位组的先后顺序依次⼀⼀对应,Usage Minimum和Usage Maximum之间的Usage的索引值也将依次与Report Count定义的bits位组的先后顺序依次⼀⼀对应上。
USBHID设备报告描述符详解

USBHID设备报告描述符详解
USBHID设备报告描述符是一种描述USBHID设备报告的结构,用于定义设备报告的输入输出特性,允许设备与控制器的主机通信。
通常,报告描述符是一段二进制数据,其中包含由设备提供的输入和输出报告,以及描述报告的数据结构要求信息。
它是一种混合结构,由多个子块组成,每个子块又由一个或多个报告描述符中的域组成。
报告描述符的结构如下:
报告描述符
-
-bLengt
-bDescriptorTyp
-wDescriptorLengt
-数据
-输入报
-输出/特殊报
-特殊报
头部:报告描述符的头部包括三个字段:报告描述符的字节长度(bLength),报告描述符类型(bDescriptorType)和报告描述符的总长度(wDescriptorLength)。
bLength:报告描述符的字节长度,是报告描述符数据的字节数。
bDescriptorType:报告描述符类型,用于指示报告描述符的类型,必须为0x22
wDescriptorLength:报告描述符的总长度,用于指示报告描述符的总字节数。
数据段:数据段包括输入报告、输出/特殊报告和特殊报告。
输入报告:输入报告用于获取主机发送到设备的数据,一般由设备按定义的格式读取。
输出报告:输出报告用于将设备发送到主机的数据。
HID设备报告描述符详解_划出重点

USB/HID设备报告描述符详解概述:报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途(usage)上的说明。
USB通讯协议的规范是以1ms产生一个USB帧(frame),USB设备可以每一个帧中发送和接收一个交换(transaction)。
交换是由几个封包(packet)组成,而传输是由一个或几个交换来完成传送一口中有效的数据。
在这里,传输和报告的意思相类似。
传输方式有四种,初始学一般只要了解控制型传输(control trans fer)和中断型传输(interrupt transfer)即可。
控制型传输是当需要时才执行传输要求,是最一般的传输方式,组态、命令和状态的通讯都可以使用控制型传输;控制型传输主要用于消息型数据(message-type data)。
中断型传输目的在做重复的数据更新(recurring data)传输,精确一点而言,即是在每个有限有周期内(b ounded period)作至少一次的小量数据发送或接收;所以适用于流动型数据(str eam-type data),注意这里所谓的周期时间就是在端点描述符中的轮询间隔时间。
报告有三种:input,output,和Feature.后面将作进一步介绍。
中断型输入管线(inter rupt in pipe)仅可以传送input报告;中断型输出管线(interrupt out pipe)仅可以传送output报告;但是控制型管线(control pipe)可以传送input,output和feature报告。
端点描述符有声明所使用的端点为何种管线。
数据本身没有任何意义,要赋于用途才能明确其为控制什么(control);例如设备上的按钮指示灯和X与Y轴的位移等都通称控制,数据则为按钮和指示灯的开关状态或X与Y轴的位移量。
为了这个目的应运而生报告描述符,其将数据的操控与它的用途作一对一的对应,所以解读报告后就可以知道每个数据作何种操作。
关于USBHID协议以及鼠标键盘描述符的解释【转】

关于USBHID协议以及⿏标键盘描述符的解释【转】转⾃:⼀.HID设备识别前⾯有提到关于SCSI协议的USB设备实现。
现在来谈谈USBHID设备。
HID全称Human Interface Device。
HID协议⾥增加了HID描述符和报告描述符,以及特定的关于HID的类请求。
HID设备的通信是通过报表来进⾏的。
据说,报告描述符是USB设备中最难的描述符了。
关于HID描述符可以参考HID协议。
接下来我们谈谈报告描述符。
⼆.报告描述符每⼀个HID设备都有⾃⼰的报告描述符。
报告描述符有三种类项⽬:Main类项⽬,Global类项⽬,Local类项⽬。
具体看下表Global作⽤域是遇到下⼀个同名Global,Local作⽤域是遇到下⼀个Main(Input,Output,Feature)。
Usage Min-Max表⽰有⼏种功能,Logical Min-Max表⽰有⼏种状态。
每个报告描述符都有报告ID,报告ID是⽤来区别复合设备的。
在报告描述符⾥没有写报告ID,默认报告ID是0。
USB的控制端点可以进⾏Input,Output,Feature项⽬的传输,中断端点可以进⾏Input,Output传输。
三.⿏标和键盘的报告描述符(1)键盘的报告描述符1. 0x05,0x01,// Global Generic Desktop2. 0x09,0x06,// Local KeyBoard3. 0xA1,0x01,// Main app collection4. 0x05,0x07,// Global KeyBoard5. //////////////////////////////////第1字节6. 0x19,0xe0,// Local Usage Min (KeyBoard LeftControl)7. 0x29,0xe7,// Local Usage Max (KeyBoard Right GUI)8. 0x15,0x00,// Global Logical Min9. 0x25,0x01,// Global Logical Max10. 0x95,0x08,// Global ReportCount11. 0x75,0x01,// Global ReportSize12. 0x81,0x02,// Main Input(Data,Var,Abs)13. //////////////////////////////////第2字节14. 0x95,0x01,// Global ReportCount15. 0x75,0x08,// Global ReportSize16. 0x81,0x03,// Main Input(Cnst,Var,Abs)17. //////////////////////////////////第3-8字节18. 0x95,0x06,// Global ReportCount19. 0x75,0x08,// Global ReportSize20. 0x15,0x00,// Global Logical Min21. 0x26,0xff,0x00,//Global Logical Max22. 0x19,0x00,// Local Usage Min23. 0x29,0x65,// Local Usage Max24. 0x81,0x00,// Main Output(Data,Ary,Abs)25. ////////////////////////////////1字节输出报告26. 0x15,0x00,// Global Logical Min27. 0x25,0x01,// Global Logical Max28. 0x95,0x05,// Global ReportCount29. 0x75,0x01,// Global ReportSize30. 0x05,0x08,// Global LED31. 0x19,0x01,// Local Usage Min32. 0x29,0x05,// Local Usage Max33. 0x91,0x02,// Main Output(Data,Var,Abs)34. ////////////////////////////////补⾜上⾯变成1个字节35. 0x95,0x01,// Global ReportCount36. 0x75,0x03,// Global ReportSize37. 0x91,0x03,// Main Output(Cnst,Var,Abs)38. 0xc0 // Main End collection键盘的描述符共有8字节的输⼊报告和1字节的输出报告。
customhid_reportdescriptor

customhid_reportdescriptorCustom HID Report Descriptor是一种用于定义自定义HID设备的报告描述符的方法。
报告描述符是一种数据结构,用于描述HID 设备的功能和数据格式。
通过自定义报告描述符,开发人员可以定义自己的HID设备,并指定设备的功能和数据格式。
本文将介绍如何生成一个准确的Custom HID Report Descriptor,并详细解释其各个部分的含义。
Custom HID Report Descriptor由一系列的字节组成,每个字节都有特定的含义。
下面是一个示例的Custom HID Report Descriptor:```c0x05, 0x01, // Usage Page (Generic Desktop)0x09, 0x06, // Usage (Keyboard)0xA1, 0x01, // Collection (Application)0x05, 0x07, // Usage Page(Keyboard/Keypad)0x19, 0xE0, // Usage Minimum (Keyboard Left Control)0x29, 0xE7, // Usage Maximum (KeyboardRight GUI)0x15, 0x00, // Logical Minimum (0)0x25, 0x01, // Logical Maximum (1)0x75, 0x01, // Report Size (1)0x95, 0x08, // Report Count (8)0x81, 0x02, // Input (Data, Variable, Absolute)0x95, 0x01, // Report Count (1)0x75, 0x08, // Report Size (8)0x81, 0x01, // Input (Constant)0x95, 0x05, // Report Count (5)0x75, 0x01, // Report Size (1)0x05, 0x08, // Usage Page (LEDs)0x19, 0x01, // Usage Minimum (Num Lock) 0x29, 0x05, // Usage Maximum (Kana)0x91, 0x02, // Output (Data, Variable, Absolute)0x95, 0x01, // Report Count (1)0x75, 0x03, // Report Size (3)0x91, 0x01, // Output (Constant)0x95, 0x06, // Report Count (6)0x75, 0x08, // Report Size (8)0x15, 0x00, // Logical Minimum (0)0x26, 0xFF, 0x00, // Logical Maximum (255)0x05, 0x07, // Usage Page(Keyboard/Keypad)0x19, 0x00, // Usage Minimum (Reserved (no event indicated))0x2A, 0xFF, 0x00, // Usage Maximum (Reserved (no event indicated))0x81, 0x00, // Input (Data, Array)0xC0 // End Collection```上述报告描述符定义了一个模拟键盘的自定义HID设备。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
USB HID Report终极解析 HID的报告描述符巨难懂,关键是数据格式与每一位代表的意思。
经过三天的研究,终于将HID Report的每一个数据位的含义弄清楚了,现将数据解析如下,最后附上了一个HID 通信的Report例子。
以一个键盘的HID Report为例:键盘的HID报告描述符:code char KeyBoardReportDescriptor[63] = {0x05, 0x01, // USAGE_PAGE (Generic Desktop)0x09, 0x06, // USAGE (Keyboard)0xa1, 0x01, // COLLECTION (Application)0x05, 0x07, // USAGE_PAGE (Keyboard)0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)0x15, 0x00, // LOGICAL_MINIMUM (0)0x25, 0x01, // LOGICAL_MAXIMUM (1)0x75, 0x01, // REPORT_SIZE (1)0x95, 0x08, // REPORT_COUNT (8)0x81, 0x02, // INPUT (Data,V ar,Abs)0x95, 0x01, // REPORT_COUNT (1)0x75, 0x08, // REPORT_SIZE (8)0x81, 0x03, // INPUT (Cnst,V ar,Abs)0x95, 0x05, // REPORT_COUNT (5)0x75, 0x01, // REPORT_SIZE (1)0x05, 0x08, // USAGE_PAGE (LEDs)0x19, 0x01, // USAGE_MINIMUM (Num Lock)0x29, 0x05, // USAGE_MAXIMUM (Kana)0x91, 0x02, // OUTPUT (Data,V ar,Abs)0x95, 0x01, // REPORT_COUNT (1)0x75, 0x03, // REPORT_SIZE (3)0x91, 0x03, // OUTPUT (Cnst,V ar,Abs)0x95, 0x06, // REPORT_COUNT (6)0x75, 0x08, // REPORT_SIZE (8)0x15, 0x00, // LOGICAL_MINIMUM (0)0x25, 0xFF, // LOGICAL_MAXIMUM (255)0x05, 0x07, // USAGE_PAGE (Keyboard)0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)0x81, 0x00, // INPUT (Data,Ary,Abs)0xc0 // END_COLLECTION};具体分析如下:code char KeyBoardReportDescriptor[63] = {0x05, 0x01, // USAGE_PAGE (Generic Desktop)// 分析根据HID短项目数据格式短项目的编码形式如下:0x05 = 0000 01010000:Usage Page01:bType,全局(bType = 0:主项目;bType = 1:全局项目;bType = 2:区域项目;)01:bSize,1字节(BSize 用来指出项目的数据所需字节的数目,该数目仅可以为0(当bSize=0),1(当bSize=1),2(当bSize=2),和4(当bSize=3)﹔注意不可以为3个字节。
大部分的卷标仅需一个字节的数据﹔全局项目的卷标Unit 比较特殊有可能最多用到4 个字节来表示其资料。
)0x01: Generic Desktop(查文档Universal Serial Bus HID Usage Tables,第三节Usage Pages)0x09, 0x06, // USAGE (Keyboard)0x09 = 00001001根据HID短项目格式0000:Usage10:bType,区域项目01:bSize,1字节0x06:KeyBoard(查文档Universal Serial Bus HID Usage Tables,第四节)0xa1, 0x01, // COLLECTION (Application)0xa1:0x01:(卷标End Collection 没有跟随任何资料。
但是卷标Collection 跟随一个字节的数据,例如指针的数据名为Physical,而鼠标的为Application。
所有Collection的数据名称与代码如表7:表7:报告集合的名称与代码Collection 的数据名称很难有一个准则来给定,Universal Serial Bus HID Usage Tables档中将各种用途的用途种类(usage type)列出,使用者必须依据用途种类来指定Collection 的数据名称,例如鼠标,键盘和游戏杆的用途种类为CA,所以要用Collection (Application),而指针为CP,所以用Collection (Physical)。
)0x05, 0x07, // USAGE_PAGE (Keyboard)//分析0x05 = 0000 01010000:Usage Page01:bType,全局(bType = 0:主项目;bType = 1:全局项目;bType = 2:区域项目;)01:bSize,1字节0x07:KeyBoard(查文档Universal Serial Bus HID Usage Tables,第三节Usage Pages)0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)0x19= 0001 10010001: Usage Minimun()10: bType,区域项目(bType = 0:主项目;bType = 1:全局项目;bType = 2:区域项目;)01:bSize,1字节0xe0:Keyboard LeftControl(查文档Universal Serial Bus HID Usage Tables,10 Keyboard/Keypad Page (0x07))0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)// 分析同上“USAGE_MINIMUM (Keyboard LeftControl)”0x15, 0x00, // LOGICAL_MINIMUM (0)// 分析0x15=0001 01010001 : LOGICAL_MINNUM(查报告描述符的标签中的全域项目Logical Minimum 01:bType,全局项目(bType = 0:主项目;bType = 1:全局项目;bType = 2:区域项目;)01:bSize,一个字节0x00:最小值0x25, 0x01, // LOGICAL_MAXIMUM (1)// 分析同上“LOGICAL_MINIMUM (0)”0x75, 0x01, // REPORT_SIZE (1)// 分析0x75 = 0111 01010111:Report Size(查报告描述符的标签中的全域项目Report Size)01:bType,全局项目(bType = 0:主项目;bType = 1:全局项目;bType = 2:区域项目;)01:bSize,一个字节0x01:Report Size,单位bit。
如Report Size(1),则表示报告的值只有一位,0或者1 如果Report Size(1),则报告的值有8bit,范围0~255.0x95, 0x08, // REPORT_COUNT (8)// 分析0x95 = 1001 01011001:Report Count(查报告描述符的标签中的全域项目Report Count)01:bType,全局项目(bType = 0:主项目;bType = 1:全局项目;bType = 2:区域项目;)01:bSize,一个字节0x08:Report Count,报告的字段。
即报告多少个Report Size的大小。
如Report Size(1), Report Count(3),每次报告三个位的数据。
0x81, 0x02, // INPUT (Data,V ar,Abs)//分析0x81 = 1000 0001这里要特别注意,这里要高6位和低2位拆分。
高6位含义:01:字节数,1字节0x02:参考附录一:主项目说明。
根据表格:表6:主项目的信息代码0x02 = 0000 0010我们只关心最后三位INPUT (Data,V ar,Abs)0:绝对值1:变量0:数据以下分析与上面分析重复,在此略过。
0x95, 0x01, // REPORT_COUNT (1)0x75, 0x08, // REPORT_SIZE (8)0x81, 0x03, // INPUT (Cnst,V ar,Abs)0x95, 0x05, // REPORT_COUNT (5)0x75, 0x01, // REPORT_SIZE (1)0x05, 0x08, // USAGE_PAGE (LEDs)0x19, 0x01, // USAGE_MINIMUM (Num Lock)0x29, 0x05, // USAGE_MAXIMUM (Kana)0x91, 0x02, // OUTPUT (Data,V ar,Abs)0x95, 0x01, // REPORT_COUNT (1)0x75, 0x03, // REPORT_SIZE (3)0x91, 0x03, // OUTPUT (Cnst,V ar,Abs)0x95, 0x06, // REPORT_COUNT (6)0x75, 0x08, // REPORT_SIZE (8)0x15, 0x00, // LOGICAL_MINIMUM (0)0x25, 0xFF, // LOGICAL_MAXIMUM (255)0x05, 0x07, // USAGE_PAGE (Keyboard)0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) 0x81, 0x00, // INPUT (Data,Ary,Abs)0xc0 // END_COLLECTION//分析Collection结束,不带任何数据};西伯利亚的风2012/12/19附件:附录一:主项目说明主项目主项目中产生报告数据格式的三个卷标(Input,Output,和Feature)具有共通的数据定义,这些数据和其代码列于表6中。