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设备。
HID设备描述符介绍
HID设备描述符介绍最近在做一个投票系统的上位机。
虽然是上位机,但还是要弄清楚下位机与自己的接口――HID。
因为windows下已经有一个usb监听程序――USB HOUND。
所以,我选择先写好下位机的程序,成功发送数据后,再进行上位机程序的编写。
下位机程序,重点在于HID设备的描述符配置。
什么是描述符?HID设备通过设备描述符来标识自己的设备信息,如设备ID、厂商名称、版本、配置数量等;通过配置描述符集合来标识自己的配置信息,包括:配置描述符(总述)、接口描述符(接口类型,鼠标,键盘,自定义设备等)、端点描述符(端点读写类型,支持的数据包属性等)和HID描述符(HID版本、下级描述符信息等)。
通过字符串描述符来定义自己的一些字符串,如厂商名称等;通过报告描述符来标识数据流的格式,如数据用途(鼠标、键盘、自定义等)、长度、大小等。
网上的很多示例和介绍都使用c语言,但是,我遇到的源码,却是汇编编写的,所以我以我的项目为例,用汇编来介绍各个描述符结构,也算是个不一样的体验吧。
具体的描述介绍如下:设备描述符deviceDesc: ; Device descriptorDB deviceDescEnd - deviceDesc ; bLength 该描述符长度DB DESC_TYPE_DEVICE ; bDescriptorType 类型DW 0200H ; bcdUSB (USB 2.0) USB 版本DB 00H ; bDeviceClass (given by interface) 类代码DB 00H ; bDeviceSubClass 子类代码DB 00H ; bDeviceProtocol 设备协议DB EP0_PACKET_SIZE ; 端点0最大包长DW 0451H ; idV endor (Texas Instruments) 厂商ID (VID)#if (chip==2531)DW 16A9H ; idProduct (CC2531 HID) 产品ID (PID)#elif (chip==2511)DW 16A5H ; idProduct (CC2511 HID)#elseDW 16A7H ; idProduct (CC1111 HID)#endifDW 0100H ; bcdDevice (v1.0) 设备版本号DB 01H ; iManufacturer 描述厂商的字符串索引DB 02H ; iProduct 描述产品的字符串索引DB 00H ; iSerialNumber 产品序列号字符串的索引DB 01H ; bNumConfigurations 可能的配置数deviceDescEnd:在里面,最重要的是VID和PID,它一般用来标识你的USB设备。
USBHID报告描述符详解
USBHID报告描述符详解
1、HID报告描述符介绍
USB人机界面设备,简称HID,是计算机系统中最常见的一种通信接口,它使用设备描述符(Device Descriptors)来描述设备特性,同时使用报告描述符(Report Descriptors)来描述设备支持的数据报文格式,操作系统或软件驱动可以根据报告描述符中设置的信息来识别HID设备所具有的功能,从而支持和控制HID设备。
HID报告描述符描述了与设备相关的数据信息,它是HID设备进行自然交互的基础。
2、HID报告描述符的作用
输入报告(Input Reports)可以被认为是从HID设备发送到操作系统的数据,它可以描述HID设备特性的状态,可以用来报告控制命令、操作状态、三轴分量数据等信息;输出报告(Output Reports)则相反,它表示从操作系统发送给HID设备的数据。
HID 报告描述
HID报告描述1报告描述简介Report Description,即上报事件的描述,描述所支持事件的格式及取值意义,比如鼠标按键上报格式、左键右键中间键分别对应的值等;报告描述跟JSON有些类似,都是结构数据,格式类似{usage:1,{id:0,usage:1.1,size:1,count:1,min:0,max:5,format:xx}}2描述符结构几个主要的名词解释一下:Collection,集合,相当于{},用来包含一组描述;Collection有Application和Physical之分,Application表示大项,里有可以有很多Physical子项Report,报告,在上图中只是一个ID号,来区分不同report。
Main Item,主项,例出来哪些项Report Size,每一项有多少位。
Report Count,总共有多少项Logical Minimum,每个项的取值范围中的最小值,即最小只能取的值。
Logical Maximum,每个项的取值范围中的最大值,即最大只能取的值。
Usage,用途,表示有哪些功能,一个Usage代表一个功能。
一项描述基本上是由两个字节构成,第一个字节表示名称,第二个字节表示值,如Report Size,8Report Size是名称,8是它的值。
Report Size对应的16制数据是0x75,在代码里上面的表现是0x75,0x08。
有些名称不需要带值,如Collection的结束符())为0xC0,就没有第二个字节。
3名称名称有分长字和短字,这里只介绍短字,短字是由一个字节构成,结构如下:第3~2位表示类型,有如下几种:0=Main1=Global2=Local3=Reserved第1~0位表示名称的值由多少个字节构成,具体意义如下:0=0bytes,名称后面不带值1=1bytes,名称后面带1个值2=2bytes,名称后面带2个值3=4bytes,名称后面带4个值第7~4位表示Tag,Tag与类型对应,每种类型有很多不同的Tag。
HID报告描述详解
在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。
USB报告描述符(Report Descriptor)是HID设备中的一个描述符,它是比较复杂的一个描述符。
USB HID设备是通过报告来给传送数据的,报告有输入报告和输出报告。
输入报告是USB 设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。
报告是一个数据包,里面包含的是所要传送的数据。
输入报告是通过中断输入端点输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出。
而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。
通过它,USB HOST可以分析出报告里面的数据所表示的意思。
它通过控制输入端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求发送到接口的,而不是到设备。
一个报告描述符可以描述多个报告,不同的报告通过报告ID 来识别,报告ID在报告最前面,即第一个字节。
当报告描述符中没有规定报告ID时,报告中就没有ID字段,开始就是数据。
更详细的说明请参看USB HID协议,该协议可从下载。
下面通过由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)//输入用,变量,值,绝对值。
hid的tip swith描述符
hid的tip swith描述符HID(Human Interface Device)设备的`tip swith`描述符通常包含多个字节,以下是一个`tip swith`描述符示例:```cpp0x09, 0x42, // Usage (Tip Switch)0x15, 0x00, // Logical Minimum(0)0x25, 0x01, // Logical Maximum(1)0x75, 0x01, // Report Size(1)0x95, 0x01, // Report Count(1)0x81,0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)```其中:- `0x09, 0x42`:表示`Usage (Tip Switch)`,即`tip swith`的用途。
- `0x15, 0x00`:表示`Logical Minimum(0)`,即`tip swith`的逻辑最小值为0。
- `0x25, 0x01`:表示`Logical Maximum(1)`,即`tip swith`的逻辑最大值为1。
- `0x75, 0x01`:表示`Report Size(1)`,即`tip swith`的报告大小为1。
- `0x95, 0x01`:表示`Report Count(1)`,即`tip swith`的报告数量为1。
- `0x81,0x02`:表示`Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)`,即`tip swith`的输入类型为`Data`,变量`Var`,绝对值`Abs`,无`Wrap`,线性`Linear`,首选状态`Preferred State`,无`Null Position`。
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协议报告描述总结
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)可以认为所有用【全局项目】说明的各种数据域特性构成一个【全局状态表】,随着新的【全局项目】出现,该表在不断变化。
HID报告描述详解
在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。
USB报告描述符(Report Descriptor)是HID设备中的一个描述符,它是比较复杂的一个描述符。
USB HID设备是通过报告来给传送数据的,报告有输入报告和输出报告。
输入报告是USB 设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。
报告是一个数据包,里面包含的是所要传送的数据。
输入报告是通过中断输入端点输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出。
而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。
通过它,USB HOST可以分析出报告里面的数据所表示的意思。
它通过控制输入端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求发送到接口的,而不是到设备。
一个报告描述符可以描述多个报告,不同的报告通过报告ID 来识别,报告ID在报告最前面,即第一个字节。
当报告描述符中没有规定报告ID时,报告中就没有ID字段,开始就是数据。
更详细的说明请参看USB HID协议,该协议可从下载。
下面通过由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)//输入用,变量,值,绝对值。
HID 报告描述
HID报告描述1报告描述简介Report Description,即上报事件的描述,描述所支持事件的格式及取值意义,比如鼠标按键上报格式、左键右键中间键分别对应的值等;报告描述跟JSON有些类似,都是结构数据,格式类似{usage:1,{id:0,usage:1.1,size:1,count:1,min:0,max:5,format:xx}}2描述符结构几个主要的名词解释一下:Collection,集合,相当于{},用来包含一组描述;Collection有Application和Physical之分,Application表示大项,里有可以有很多Physical子项Report,报告,在上图中只是一个ID号,来区分不同report。
Main Item,主项,例出来哪些项Report Size,每一项有多少位。
Report Count,总共有多少项Logical Minimum,每个项的取值范围中的最小值,即最小只能取的值。
Logical Maximum,每个项的取值范围中的最大值,即最大只能取的值。
Usage,用途,表示有哪些功能,一个Usage代表一个功能。
一项描述基本上是由两个字节构成,第一个字节表示名称,第二个字节表示值,如Report Size,8Report Size是名称,8是它的值。
Report Size对应的16制数据是0x75,在代码里上面的表现是0x75,0x08。
有些名称不需要带值,如Collection的结束符())为0xC0,就没有第二个字节。
3名称名称有分长字和短字,这里只介绍短字,短字是由一个字节构成,结构如下:第3~2位表示类型,有如下几种:0=Main1=Global2=Local3=Reserved第1~0位表示名称的值由多少个字节构成,具体意义如下:0=0bytes,名称后面不带值1=1bytes,名称后面带1个值2=2bytes,名称后面带2个值3=4bytes,名称后面带4个值第7~4位表示Tag,Tag与类型对应,每种类型有很多不同的Tag。
HID设备报告描述符详解_划出重点
HID设备报告描述符详解_划出重点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轴的位移量。
为了这个目的应运而生报告描述符,其将数据的操控与它的用途作一对一的对应,所以解读报告后就可以知道每个数据作何种操作。
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描述符。
- 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中。