USB HID报告及报告描述符简介

[复制链接]
12674|13
 楼主| computer00 发表于 2007-5-18 11:19 | 显示全部楼层 |阅读模式
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在USB中,USB&nbsp;HOST是通过各种描述符来识别设备的,有设备描述符,<br />配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。<br />USB报告描述符(Report&nbsp;Descriptor)是HID设备中的一个描述符,它是比较<br />复杂的一个描述符。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USB&nbsp;HID设备是通过报告来给传送数据的,报告有输入报告和输出报告。<br />输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等<br />信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送<br />给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。报告是<br />一个数据包,里面包含的是所要传送的数据。输入报告是通过中断输入端点<br />输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出<br />端点0发送,当有中断输出端点时,通过中断输出端点发出。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。<br />通过它,USB&nbsp;HOST可以分析出报告里面的数据所表示的意思。它通过控制输入<br />端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求<br />是发送到接口的,而不是到设备。一个报告描述符可以描述多个报告,不同的<br />报告通过报告ID来识别,报告ID在报告最前面,即第一个字节。当报告描述符中<br />没有规定报告ID时,报告中就没有ID字段,开始就是数据。更详细的说明请参看<br />USB&nbsp;HID协议,该协议可从Http://www.usb.org下载。<br />&nbsp;&nbsp;&nbsp;&nbsp;USB报告描述符可以通过使用HID&nbsp;Descriptor&nbsp;tool来生成,这个工具可以<br />到Http://www.usb.org下载,为了方便大家,我顺便上传了一份。<br /><a href="http://www.**/Upload/Blog/2007/4/2/af7c3443-ad61-4465-adc7-a74d28bbc322.zip" target=_blank>http://www.**/Upload/Blog/2007/4/2/af7c3443-ad61-4465-adc7-a74d28bbc322.zip</a>uploadfile-/2007-4/42672233.zip&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面通过由HID&nbsp;Descriptor&nbsp;tool生成的USB鼠标和USB键盘来说明一下报告<br />描述符和报告。<br />code&nbsp;char&nbsp;KeyBoardReportDescriptor[63]&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;//表示用途页为通用桌面设备<br />&nbsp;&nbsp;&nbsp;&nbsp;0x05,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;USAGE_PAGE&nbsp;(Generic&nbsp;Desktop)<br />&nbsp;&nbsp;&nbsp;&nbsp;//表示用途为键盘<br />&nbsp;&nbsp;&nbsp;&nbsp;0x09,&nbsp;0x06,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;USAGE&nbsp;(Keyboard)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION<br />&nbsp;&nbsp;&nbsp;&nbsp;0xa1,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;COLLECTION&nbsp;(Application)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//表示用途页为按键<br />&nbsp;&nbsp;&nbsp;&nbsp;0x05,&nbsp;0x07,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_PAGE&nbsp;(Keyboard)<br />&nbsp;&nbsp;&nbsp;&nbsp;//用途最小值,这里为左ctrl键<br />&nbsp;&nbsp;&nbsp;&nbsp;0x19,&nbsp;0xe0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_MINIMUM&nbsp;(Keyboard&nbsp;LeftControl)<br />&nbsp;&nbsp;&nbsp;&nbsp;//用途最大值,这里为右GUI键,即window键<br />&nbsp;&nbsp;&nbsp;&nbsp;0x29,&nbsp;0xe7,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_MAXIMUM&nbsp;(Keyboard&nbsp;Right&nbsp;GUI)<br />&nbsp;&nbsp;&nbsp;&nbsp;//逻辑最小值为0<br />&nbsp;&nbsp;&nbsp;&nbsp;0x15,&nbsp;0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;LOGICAL_MINIMUM&nbsp;(0)<br />&nbsp;&nbsp;&nbsp;&nbsp;//逻辑最大值为1<br />&nbsp;&nbsp;&nbsp;&nbsp;0x25,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;LOGICAL_MAXIMUM&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;//报告大小(即这个字段的宽度)为1bit,所以前面的逻辑最小值为0,逻辑最大值为1<br />&nbsp;&nbsp;&nbsp;&nbsp;0x75,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;//报告的个数为8,即总共有8个bits<br />&nbsp;&nbsp;&nbsp;&nbsp;0x95,&nbsp;0x08,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(8)<br />&nbsp;&nbsp;&nbsp;&nbsp;//输入用,变量,值,绝对值。像键盘这类一般报告绝对值,<br />&nbsp;&nbsp;&nbsp;&nbsp;//而鼠标移动这样的则报告相对值,表示鼠标移动多少<br />&nbsp;&nbsp;&nbsp;&nbsp;0x81,&nbsp;0x02,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;INPUT&nbsp;(Data,Var,Abs)<br />&nbsp;&nbsp;&nbsp;&nbsp;//上面这这几项描述了一个输入用的字段,总共为8个bits,每个bit表示一个按键<br />&nbsp;&nbsp;&nbsp;&nbsp;//分别从左ctrl键到右GUI键。这8个bits刚好构成一个字节,它位于报告的第一个字节。<br />&nbsp;&nbsp;&nbsp;&nbsp;//它的最低位,即bit-0对应着左ctrl键,如果返回的数据该位为1,则表示左ctrl键被按下,<br />&nbsp;&nbsp;&nbsp;&nbsp;//否则,左ctrl键没有按下。最高位,即bit-7表示右GUI键的按下情况。中间的几个位,<br />&nbsp;&nbsp;&nbsp;&nbsp;//需要根据HID协议中规定的用途页表(HID&nbsp;Usage&nbsp;Tables)来确定。这里通常用来表示<br />&nbsp;&nbsp;&nbsp;&nbsp;//特殊键,例如ctrl,shift,del键等<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//这样的数据段个数为1<br />&nbsp;&nbsp;&nbsp;&nbsp;0x95,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;//每个段长度为8bits<br />&nbsp;&nbsp;&nbsp;&nbsp;0x75,&nbsp;0x08,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(8)<br />&nbsp;&nbsp;&nbsp;&nbsp;//输入用,常量,值,绝对值<br />&nbsp;&nbsp;&nbsp;&nbsp;0x81,&nbsp;0x03,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;INPUT&nbsp;(Cnst,Var,Abs)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//上面这8个bit是常量,设备必须返回0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//这样的数据段个数为5<br />&nbsp;&nbsp;&nbsp;&nbsp;0x95,&nbsp;0x05,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(5)<br />&nbsp;&nbsp;&nbsp;&nbsp;//每个段大小为1bit<br />&nbsp;&nbsp;&nbsp;&nbsp;0x75,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;//用途是LED,即用来控制键盘上的LED用的,因此下面会说明它是输出用<br />&nbsp;&nbsp;&nbsp;&nbsp;0x05,&nbsp;0x08,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_PAGE&nbsp;(LEDs)<br />&nbsp;&nbsp;&nbsp;&nbsp;//用途最小值是Num&nbsp;Lock,即数字键锁定灯<br />&nbsp;&nbsp;&nbsp;&nbsp;0x19,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_MINIMUM&nbsp;(Num&nbsp;Lock)<br />&nbsp;&nbsp;&nbsp;&nbsp;//用途最大值是Kana,这个是什么灯我也不清楚^_^<br />&nbsp;&nbsp;&nbsp;&nbsp;0x29,&nbsp;0x05,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_MAXIMUM&nbsp;(Kana)<br />&nbsp;&nbsp;&nbsp;&nbsp;//如前面所说,这个字段是输出用的,用来控制LED。变量,值,绝对值。<br />&nbsp;&nbsp;&nbsp;&nbsp;//1表示灯亮,0表示灯灭<br />&nbsp;&nbsp;&nbsp;&nbsp;0x91,&nbsp;0x02,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;OUTPUT&nbsp;(Data,Var,Abs)<br />&nbsp;&nbsp;&nbsp;&nbsp;//这样的数据段个数为1<br />&nbsp;&nbsp;&nbsp;&nbsp;0x95,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;//每个段大小为3bits<br />&nbsp;&nbsp;&nbsp;&nbsp;0x75,&nbsp;0x03,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(3)<br />&nbsp;&nbsp;&nbsp;&nbsp;//输出用,常量,值,绝对<br />&nbsp;&nbsp;&nbsp;&nbsp;0x91,&nbsp;0x03,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;OUTPUT&nbsp;(Cnst,Var,Abs)&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//由于要按字节对齐,而前面控制LED的只用了5个bit,<br />&nbsp;&nbsp;&nbsp;&nbsp;//所以后面需要附加3个不用bit,设置为常量。<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//报告个数为6<br />&nbsp;&nbsp;&nbsp;&nbsp;0x95,&nbsp;0x06,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(6)<br />&nbsp;&nbsp;&nbsp;&nbsp;//每个段大小为8bits<br />&nbsp;&nbsp;&nbsp;&nbsp;0x75,&nbsp;0x08,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(8)<br />&nbsp;&nbsp;&nbsp;&nbsp;//逻辑最小值0<br />&nbsp;&nbsp;&nbsp;&nbsp;0x15,&nbsp;0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;LOGICAL_MINIMUM&nbsp;(0)<br />&nbsp;&nbsp;&nbsp;&nbsp;//逻辑最大值255<br />&nbsp;&nbsp;&nbsp;&nbsp;0x25,&nbsp;0xFF,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;LOGICAL_MAXIMUM&nbsp;(255)<br />&nbsp;&nbsp;&nbsp;&nbsp;//用途页为按键<br />&nbsp;&nbsp;&nbsp;&nbsp;0x05,&nbsp;0x07,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_PAGE&nbsp;(Keyboard)<br />&nbsp;&nbsp;&nbsp;&nbsp;//使用最小值为0<br />&nbsp;&nbsp;&nbsp;&nbsp;0x19,&nbsp;0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_MINIMUM&nbsp;(Reserved&nbsp;(no&nbsp;event&nbsp;indicated))<br />&nbsp;&nbsp;&nbsp;&nbsp;//使用最小值为0x65<br />&nbsp;&nbsp;&nbsp;&nbsp;0x29,&nbsp;0x65,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_MAXIMUM&nbsp;(Keyboard&nbsp;Application)<br />&nbsp;&nbsp;&nbsp;&nbsp;//输入用,变量,数组,绝对值<br />&nbsp;&nbsp;&nbsp;&nbsp;0x81,&nbsp;0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;INPUT&nbsp;(Data,Ary,Abs)<br />&nbsp;&nbsp;&nbsp;&nbsp;//以上定义了6个8bit宽的数组,每个8bit(即一个字节)用来表示一个按键,所以可以同时<br />&nbsp;&nbsp;&nbsp;&nbsp;//有6个按键按下。没有按键按下时,全部返回0。如果按下的键太多,导致键盘扫描系统<br />&nbsp;&nbsp;&nbsp;&nbsp;//无法区分按键时,则全部返回0x01,即6个0x01。如果有一个键按下,则这6个字节中的第一<br />&nbsp;&nbsp;&nbsp;&nbsp;//个字节为相应的键值(具体的值参看HID&nbsp;Usage&nbsp;Tables),如果两个键按下,则第1、2两个<br />&nbsp;&nbsp;&nbsp;&nbsp;//字节分别为相应的键值,以次类推。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//关集合,跟上面的对应<br />&nbsp;&nbsp;&nbsp;&nbsp;0xc0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;END_COLLECTION<br />};<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过上面的分析,我们知道这个报告中只有一个报告,所以没有报告ID,<br />因此返回的都是实际使用的数据。总共有8字节输入,1字节输出。其中输入的<br />第一字节用来表示特殊按键,第二字节保留,后面的六字节为普通按键。如果<br />只有左ctrl键按下,则返回01&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00(十六进制),如果<br />只有数字键1&nbsp;按下,则返回00&nbsp;00&nbsp;59&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00,如果数字<br />键1&nbsp;和2&nbsp;同时按下,则返回00&nbsp;00&nbsp;59&nbsp;5A&nbsp;00&nbsp;00&nbsp;00&nbsp;00,如果<br />再按下左shift&nbsp;键,则返回02&nbsp;00&nbsp;59&nbsp;5A&nbsp;00&nbsp;00&nbsp;00&nbsp;00,<br />然后再释放1&nbsp;&nbsp;&nbsp;键,则返回02&nbsp;00&nbsp;5A&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00,<br />然后全部按键释放,则返回00&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00。<br />这些数据(即报告)都是通过中断端点返回的。当按下Num&nbsp;Lock键时,PC会发送<br />输出报告,从报告描述符中我们知道,Num&nbsp;Lock的LED对应着输出报告的最低位,<br />当数字小键盘打开时,输出xxxxxxx1(二进制,打x的由其它的LED状态决定);<br />当数字小键盘关闭时,输出xxxxxxx0(同前)。取出最低位就可以控制数字键锁定LED了。<br />&nbsp;<br /><br />下面这个报告描述符是USB鼠标报告描述符,比起键盘的来说要简单些。<br />它描述了4个字节,第一个字节表示按键,第二个字节表示x轴(即鼠标左右移动,<br />0表示不动,正值表示往右移,负值表示往左移),第三个字节表示y轴(即鼠标<br />上下移动,0表示不动,正值表示往下移动,负值表示往上移动),第四个字节<br />表示鼠标滚轮(正值为往上滚动,负值为往下滚动)。<br />code&nbsp;char&nbsp;MouseReportDescriptor[52]&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;//通用桌面设备<br />&nbsp;&nbsp;&nbsp;&nbsp;0x05,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;USAGE_PAGE&nbsp;(Generic&nbsp;Desktop)<br />&nbsp;&nbsp;&nbsp;&nbsp;//鼠标<br />&nbsp;&nbsp;&nbsp;&nbsp;0x09,&nbsp;0x02,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;USAGE&nbsp;(Mouse)<br />&nbsp;&nbsp;&nbsp;&nbsp;//集合<br />&nbsp;&nbsp;&nbsp;&nbsp;0xa1,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;COLLECTION&nbsp;(Application)<br />&nbsp;&nbsp;&nbsp;&nbsp;//指针设备<br />&nbsp;&nbsp;&nbsp;&nbsp;0x09,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE&nbsp;(Pointer)<br />&nbsp;&nbsp;&nbsp;&nbsp;//集合<br />&nbsp;&nbsp;&nbsp;&nbsp;0xa1,&nbsp;0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;COLLECTION&nbsp;(Physical)<br />&nbsp;&nbsp;&nbsp;&nbsp;//按键<br />&nbsp;&nbsp;&nbsp;&nbsp;0x05,&nbsp;0x09,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USAGE_PAGE&nbsp;(Button)<br />&nbsp;&nbsp;&nbsp;&nbsp;//使用最小值1<br />&nbsp;&nbsp;&nbsp;&nbsp;0x19,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USAGE_MINIMUM&nbsp;(Button&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;//使用最小值3。1表示左键,2表示右键,3表示中键<br />&nbsp;&nbsp;&nbsp;&nbsp;0x29,&nbsp;0x03,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USAGE_MAXIMUM&nbsp;(Button&nbsp;3)<br />&nbsp;&nbsp;&nbsp;&nbsp;//逻辑最小值0<br />&nbsp;&nbsp;&nbsp;&nbsp;0x15,&nbsp;0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGICAL_MINIMUM&nbsp;(0)<br />&nbsp;&nbsp;&nbsp;&nbsp;//逻辑最大值1<br />&nbsp;&nbsp;&nbsp;&nbsp;0x25,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGICAL_MAXIMUM&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;//数量为3<br />&nbsp;&nbsp;&nbsp;&nbsp;0x95,&nbsp;0x03,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(3)<br />&nbsp;&nbsp;&nbsp;&nbsp;//大小为1bit<br />&nbsp;&nbsp;&nbsp;&nbsp;0x75,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;//输入,变量,数值,绝对值<br />&nbsp;&nbsp;&nbsp;&nbsp;//以上3个bit分别表示鼠标的三个按键情况,最低位(bit-0)为左键<br />&nbsp;&nbsp;&nbsp;&nbsp;//bit-1为右键,bit-2为中键,按下时对应的位值为1,释放时对应的值为0<br />&nbsp;&nbsp;&nbsp;&nbsp;0x81,&nbsp;0x02,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INPUT&nbsp;(Data,Var,Abs)<br />&nbsp;&nbsp;&nbsp;&nbsp;//填充5个bit,补足一个字节<br />&nbsp;&nbsp;&nbsp;&nbsp;0x95,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;0x75,&nbsp;0x05,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(5)<br />&nbsp;&nbsp;&nbsp;&nbsp;0x81,&nbsp;0x03,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INPUT&nbsp;(Cnst,Var,Abs)<br />&nbsp;&nbsp;&nbsp;&nbsp;//用途页为通用桌面<br />&nbsp;&nbsp;&nbsp;&nbsp;0x05,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USAGE_PAGE&nbsp;(Generic&nbsp;Desktop)<br />&nbsp;&nbsp;&nbsp;&nbsp;//用途为X<br />&nbsp;&nbsp;&nbsp;&nbsp;0x09,&nbsp;0x30,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USAGE&nbsp;(X)<br />&nbsp;&nbsp;&nbsp;&nbsp;//用途为Y<br />&nbsp;&nbsp;&nbsp;&nbsp;0x09,&nbsp;0x31,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USAGE&nbsp;(Y)<br />&nbsp;&nbsp;&nbsp;&nbsp;//用途为滚轮<br />&nbsp;&nbsp;&nbsp;&nbsp;0x09,&nbsp;0x38,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USAGE&nbsp;(Wheel)<br />&nbsp;&nbsp;&nbsp;&nbsp;//逻辑最小值为-127<br />&nbsp;&nbsp;&nbsp;&nbsp;0x15,&nbsp;0x81,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGICAL_MINIMUM&nbsp;(-127)<br />&nbsp;&nbsp;&nbsp;&nbsp;//逻辑最大值为+127<br />&nbsp;&nbsp;&nbsp;&nbsp;0x25,&nbsp;0x7f,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGICAL_MAXIMUM&nbsp;(127)<br />&nbsp;&nbsp;&nbsp;&nbsp;//大小为8个bits<br />&nbsp;&nbsp;&nbsp;&nbsp;0x75,&nbsp;0x08,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(8)<br />&nbsp;&nbsp;&nbsp;&nbsp;//数量为3个,即分别代表x,y,滚轮<br />&nbsp;&nbsp;&nbsp;&nbsp;0x95,&nbsp;0x03,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(3)<br />&nbsp;&nbsp;&nbsp;&nbsp;//输入,变量,值,相对值<br />&nbsp;&nbsp;&nbsp;&nbsp;0x81,&nbsp;0x06,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INPUT&nbsp;(Data,Var,Rel)<br />&nbsp;&nbsp;&nbsp;&nbsp;//关集合<br />&nbsp;&nbsp;&nbsp;&nbsp;0xc0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;END_COLLECTION<br />&nbsp;&nbsp;&nbsp;&nbsp;0xc0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;END_COLLECTION<br />};<br />&nbsp;<br />&nbsp;<br />通过对上面的报告分析,我们知道报告返回4个字节,没有报告ID。如果鼠标左键按下,<br />则返回01&nbsp;00&nbsp;00&nbsp;00(十六进制值),如果右键按下,则返回02&nbsp;00&nbsp;00&nbsp;00,如果中键按下,<br />则返回04&nbsp;00&nbsp;00&nbsp;00,如果三个键同时按下,则返回07&nbsp;00&nbsp;00&nbsp;00。如果鼠标往右移动则<br />第二字节返回正值,值越大移动速度越快。其它的类推。<br />&nbsp;<br />这里只对报告描述符做一个简单的介绍,更详细的资料请参看USB&nbsp;HID协议以及HID&nbsp;Usage&nbsp;Tables,<br />可以从Http://www.usb.org下载。<br /><br />根据这个实际设计的USB键盘和USB鼠标:<br />USB键盘:<br />user1/2198/archives/2007/36484.html<br /><a href="http://www.**/blog/computer00/20134/message.aspx" target=_blank>http://www.**/blog/computer00/20134/message.aspx</a><br />USB鼠标:<br />user1/2198/archives/2007/36520.html<br /><a href="http://www.**/blog/computer00/20135/message.aspx" target=_blank>http://www.**/blog/computer00/20135/message.aspx</a><br />
平常人 发表于 2007-5-19 18:47 | 显示全部楼层

谢谢Computer00的精彩解释

补充一点,HID的报告中有输入报告和输出报告,这些Computer00已经解释得很清楚了,除此之外还有一种功能报告,功能报告是用来传递一些设备状态的。<br /><br />举个例子,一般键盘上都有三个锁定灯,大小写锁定、数字锁定和滚动锁定,(顺便说一下,00提到的Kana锁定灯是用于输入日文的);在00的例子中这些灯是用输出报告设置的,它们也可以用功能报告设置,这样可以实现上电时预置某些状态,比如要求开机时数字锁定(Num&nbsp;Lock);这样的特性用输出报告只能通过PC端的软件实现了,而用功能报告时,可以在键盘端用硬件设置好(如使用拨动开关或跳线)。
isbit 发表于 2007-5-19 19:27 | 显示全部楼层

呵呵

&nbsp;&nbsp;我找的就是他啊,顶,另外:报告描述符软件还不知道怎么用呢?<br />&nbsp;&nbsp;oo
 楼主| computer00 发表于 2007-5-19 21:23 | 显示全部楼层

呵呵,报告描述符软件自己去摸索一下吧, 我都是乱摸索出来

  
conwh 发表于 2007-5-19 21:42 | 显示全部楼层

不会,凑个份子

  
ranjohn 发表于 2007-6-6 22:10 | 显示全部楼层

HID里面的机打延时报告描述符怎么设置呀?

楼主的对报告描述符的讲解太精辟了.不过我还有个问题,比如说一般键盘都有设置机打延时的,但是在上面的USB报告描述符中只有对LED的设置报告,如果在USB键盘中也要设置机打延时的话,那报告描述符又是怎样的呢?谢谢!
平常人 发表于 2007-6-6 22:14 | 显示全部楼层

HID的报告描述符中没有这个参数

一般这个延时是在HOST端解决的。<br /><br />如果你一定要在设备端解决,唯一的办法就是设备端不断地发报告了。
ranjohn 发表于 2007-6-7 22:13 | 显示全部楼层

明了

说得很有道理,可能是在主机端根据控制面板里面键盘的设置自已设置好了的。
ranjohn 发表于 2007-6-8 21:19 | 显示全部楼层

在主机端解决的!

经过验证,确实是在主机端解决的。
东风小黑 发表于 2014-4-16 18:41 | 显示全部楼层
高手啊高手,膜拜
一般首席 发表于 2014-4-23 11:47 | 显示全部楼层
lh2008xp 发表于 2014-12-16 16:17 | 显示全部楼层
报告描述符有很大的学问
diyusb 发表于 2014-12-18 20:45 | 显示全部楼层
报表描述符的用法相当灵活,讨巧的方法,找到相应的设备,照搬报表
zjwyczj 发表于 2014-12-24 15:47 | 显示全部楼层
顶圈圈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

247

主题

14716

帖子

213

粉丝
快速回复 在线客服 返回列表 返回顶部