键盘鼠标报告描述符解释
键盘鼠标报告描述符解释
键盘鼠标报告描述符解释code char KeyBoardReportDescriptor[63] = {//表示用途页为通用桌面设备0x05, 0x01, // USAGE_PAGE (Generic Desktop)//表示用途为键盘0x09, 0x06, // USAGE (Keyboard)//表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION0xa1, 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)//输入用,变量,值,绝对值。
像键盘这类一般报告绝对值,//而鼠标移动这样的则报告相对值,表示鼠标移动多少0x81, 0x02, // INPUT (Data,Var,Abs)//上面这这几项描述了一个输入用的字段,总共为8个bits,每个bit表示一个按键//分别从左ctrl键到右GUI键。
这8个bits刚好构成一个字节,它位于报告的第一个字节。
hid协议
HID协议HID(Human Interface Device)协议是一种用于计算机与人机交互设备之间通信的协议。
它定义了计算机如何与键盘、鼠标、游戏手柄等输入设备进行通信,以及如何接收和处理来自这些设备的输入信息。
HID协议被广泛应用于各种操作系统和硬件平台中,为用户提供了良好的输入设备兼容性和可靠性。
HID协议的基本原理HID协议使用了一种称为报告(Report)的数据结构进行通信。
报告是一种特定格式的数据包,用于携带输入设备发送的信息。
在HID协议中,输入设备被称为HID设备,输出设备被称为HID主机。
HID主机通过发送请求来从HID设备获取报告,而HID设备则通过发送报告来向HID主机发送输入信息。
HID协议中定义了两种类型的报告:输入报告和输出报告。
输入报告用于向HID主机发送输入数据,比如按键信息、鼠标移动等。
而输出报告用于向HID设备发送控制命令,比如控制LED灯的亮度、设置鼠标灵敏度等。
HID协议的具体实现HID协议的具体实现方式因不同的操作系统和硬件平台而异。
以下以Windows 操作系统为例,介绍HID协议的具体实现过程。
在Windows操作系统中,HID协议的实现主要涉及到以下几个方面:1.设备识别:当插入一个HID设备时,Windows会自动识别设备并加载相应的驱动程序。
驱动程序是用来将HID设备的输入信息转换为操作系统能够理解的格式。
2.报告描述:HID设备需要提供一个报告描述符,用于描述设备支持的报告类型和报告格式。
报告描述符通常以二进制格式存储在设备的固件中,并在设备插入时由操作系统读取。
3.报告传输:HID设备和HID主机之间的报告传输通常使用USB接口进行。
HID设备通过USB接口将报告发送给HID主机,而HID主机则通过USB接口向HID设备发送请求并接收报告。
4.数据处理:HID主机接收到报告后,需要对报告进行解析和处理,以获取其中的输入数据。
操作系统提供了HID API供开发者使用,开发者可以使用这些API来访问和处理HID设备的输入信息。
电脑键盘和鼠标功能简介
电脑键盘功能简介一、光标移动键在文字编辑过程中,我们经常要和光标(也叫插入点)打交道。
输入汉字,删除汉字,都要将光标移到要插入汉字或删除汉字的地方。
下面介绍光标移动键:按“↑”键:光标向上移按“↓”键:光标向下移按“→”键:光标向右移按“←”键:光标向左移按“Home”:将光标移到行首按“End”:将光标移到行尾按“PageUp”: 每按一次光标向上移一屏幕按“PageDown”:每按一次,光标向下移一屏幕按“Ctrl+Home”:将光标移到文件的最前面按“Ctrl+End”:将光标移到文件的最后面二、删除键按“←”键(有的键盘上是“BackSpace”):删除光标前面的字符按“Delete键(或数字键盘区的“Del”): 删除光标后面的字符三、插入/改写切换在输入文本过程中,有两种编辑状态,即:插入状态和改写状态。
当编辑处于插入状态时,会在光标的前面插入新输入的字符。
若处于改写状态时,会将光标后面的字符改为新输入的字符。
如果要将某个字改错,可以切换到改写状态,再将光标移到要改掉的错字前面,再输入新的字符。
注意:如果要插入一些字符。
就不要切换到改写状态了,否则会把光标后面的文本全改掉了。
插入状态改写状态插入状态:状态栏的“改写”二字变灰。
改写状态:状态栏上的“改写”二字变黑。
切换的方法:方法1:按键盘上的“Insert”键或数字键盘区的“Ins”键(非数字状态)方法2:双击状态栏上的“改写”二字四、空格键空格键是位于键盘底部的最长的那个键。
它的作用取决于当前的编辑状态是“插入状态”还是“改写状态”插入状态:按该键,将在光标前面插入空格字符,可用于调整两字符间的距离。
改写状态:按该键,将把光标后面的字符改为空格字符。
例如:“我们”,这两个字的中间就插入了2个空格字符注意:用空格调整字符间距时,千万不要切换到“改写”状态了,否则会把光标后面的文字都会改成空格的。
五、回车键:Enter作用:①在输入文本的过程中,敲此键,可将光标后面的字符下移一行,即新起一个段落。
鼠标设计报告说明
产品设计报告根据市场需求以及用户需求和比赛要求,此次我组设计了如图所示的鼠标1,整体说明首先,由于鼠标已经完全趋于稳定成熟的阶段,所以在技术方面已经没有大的突破,而此时,设计就是为了能让鼠标符合人机工程,能给人一种别样的感受。
随着电脑的普及,鼠标已经成了日常用品,一个好的鼠标能给人带来舒适的感觉,能让人产生一定的好感。
整体上采用白色的上外壳和象征着皇室贵族气质的金黄色下表面来定义整个鼠标的主色调,显得淡雅,大气。
此次设计的主题为中国风,所以在其中加上中国元素是必不可少的。
2,各部分介绍(1)上表面上表面采用了ABS工程塑料,整个壳体曲线流畅,设计遵循人体工程学,在很大程度上避免了鼠标手的出现,长期使用鼠标对手造成的伤害是很大的,所以此次设计的鼠标这一方面是一重点。
中间有一个中国结的指示灯,该指示灯在不工作时和机身一样完全是白色的,但是一旦电脑运行起来,指示灯就会显示红色,并且只要使用就会一直亮着,如果离开电脑时间过长,指示灯就会一闪一闪的,这样提示他人电脑还在运作,没事的话可以及时关上电脑。
鼠标上表面的两个按键采用了中国式的橱窗,两个按键就像两个窗口一样,边框略微凸起一到两毫米。
这样便于控制鼠标。
(2)底部底部同样采用轻便的ABS工程塑料。
表面采用磨砂处理,在使用的时候不至于出现打滑的情况,。
而侧面两边则是祥云的图样,祥云部分稍微突出鼠标身体一到两毫米,这样也可以增大摩擦,避免给使用者带来不便。
(3)按键此次设计的鼠标主要功能就是按键,该鼠标一共有6个按键,上面四个,左边2个。
首先,鼠标的左右两键是按照正常的鼠标按键来设计的,只是曲面的设计更加贴近手势,更加符合人机工程。
而上表面的另外两个按键,一个是开关,一个用来检测的按键,两个按键都比较硬,按的时候会比其他的按键费力一些,开关按键当然是来开关鼠标的,鼠标虽小但是仍是耗电的东西,在不常使用的时候或者电脑待机的时候完全可以关掉鼠标等下次使用的时候再次打开。
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位组的先后顺序依次⼀⼀对应上。
USB报告描述符详细解析
USB报告描述符详细解析
USB报告描述符是对USB设备上的功能指定的一系列键值对,它们描
述了USB设备提供的服务,以及它如何使用USB总线。
USB报告描述符可
以让计算机可以正确地识别USB设备,并且可以正确地处理它们发送的数据。
报告描述符由一个全局报告描述符和一个或多个功能报告描述符组成。
全局报告描述符描述了整个USB设备,包括设备的厂商ID,产品ID,序
列号,版本号等全局信息。
一个功能报告描述符描述一些功能,或者一组
相关功能。
功能报告描述符向计算机提供有关每个功能的信息,包括功能
类型,最大报告大小,功能字节级访问信息,功能特征集,报文信息等。
USB设备可以在接口上提供多种功能,因此,可以有一个或多个功能
报告,每个功能报告描述符都将描述特定的功能。
例如,触摸板USB设备
可能提供多个功能报告描述符,每个描述符描述一个功能,如触摸屏,键盘,鼠标,笔,滚轮等。
USB报告描述符需要遵守USB协议,确保报告描述符中包含的信息传
输正确。
USB报告描述符除了包括数据传输信息外,还会描述USB设备的
更多信息,如设备功能,设备参数,配置参数,接口位置,电源参数,安
全功能等。
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轴的位移量。
为了这个目的应运而生报告描述符,其将数据的操控与它的用途作一对一的对应,所以解读报告后就可以知道每个数据作何种操作。
USB的描述符详解总结
USB的描述符与命令请求详解一、描述符1.什么是描述符所谓描述符,就是用于描述设备特性的具有特定格式排列的一种数据组织结构。
2.描述符的作用描述符的作用在于设备向主机汇报自己的信息、特征,主机根据这些信息从而加载相应的驱动程序。
3.描述符的分类描述符分为三大类:标准描述符、设备类描述符、厂商描述符。
除字符串描述符可选外,任何设备都必须包含剩下的几种标准描述符。
在USB1.0中规定了5种标准的描述符:设备描述符配置描述符接口描述符端点描述符字符串描述符规定的设备类描述符有:集线器类描述符、人机接口类描述符。
下表是三种描述符的类型值:4.使用的几种类设备类DeviceClass下表是设备类值的含义。
接口类InterfaceClass下表是接口类值的含义。
类的交叉与独享在描述符中,只有设备描述符和接口描述符中会有类别之分,即只有设备和接口会分类使用,不过有些类别的使用只需经过设备或接口的区分就可彻底清楚明白,这说明在设备类别和接口类别的定义上会有共同的类别名称。
而有些类别则是设备或接口独享的,下表是与使用设备相关的类别划分交叉或共享情况:(此表也适用于标准命令Get_Descriptor中wValue域高字节的取值含义)【说明:】在设备或接口分类上均可彻底分清使用的(Usage = Both),即在任一处描述符中定义即可的分清楚使用的类(Usage = Both)的基本类有:02h ------------- 通信及CDC控制类;DCh ------------ 诊断设备类;EFh ------------- 混杂设备类;FFh ------------- 厂商定义的设备类。
5.标准描述符设备描述符【说明1:】当设备类型bDeviceClass = 0时,说明类型将由接口描述符中定义的为准。
【说明2:】从设备描述符表格中可知,有3个索引值:厂商信息索引、产品信息索引、设备序列号索引,这意味着,将有3个字符串描述符为其准备。
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个字节。
USB鼠标键盘报告描述符介绍
USB鼠标键盘报告描述符介绍
USB鼠标键盘报告描述符是一种采用USB协议的报告描述设备,用来
描述鼠标和键盘报告的格式、报告长度以及如何在USB报告中识别鼠标和
键盘动作。
USB协议的报告描述符定义了鼠标和键盘报告格式、报告长度
以及如何在USB报告中识别操作。
报告描述符还必须描述每个设备的报告长度,比如鼠标报告长度是3
个字节,键盘报告长度是从6到127个字节。
这里的报告长度表示这个设
备发出的报告数据包的大小。
再有就是报告数据的格式,报告数据的格式是在报告描述符中定义的,它一般分为两种:普通报告和特殊报告。
普通报告是以设备状态为中心的,它以设备状态值的变化为基础对报告数据进行格式化,并向USB传输。
键盘和鼠标的介绍
应用程序图标:指向某个程序或文档的指针, 以便用户快速定位并使用程序或文档。
开始按钮
位置:一般位于桌面的左下角,它相对屏 幕的位置是可以改变的,但相对任务栏的位置 不可以改变。 功能:打开“开始”菜单。
任务栏
快速启动工 具栏
窗口按钮显 示区
状态区
快速启动工具栏
作用:放置一些常用的系统工具和用户程 序 图标Βιβλιοθήκη 以便快速启动程序。 使用方法:“单击”
窗口按钮显示区
窗口按钮显示区:大多数任务执行后,将在 任务栏上标记为一个按钮,分为前台窗 口 和后台窗口,处于当前窗口的按钮处于 凹陷的状态。 作用:进行任务的切换。 使用方法:在相应程序按钮上“单击”
状态区
状态区:含“时间”,“音量”,“输入 法”状态。 作用:可以观看状态,还可以快速设置。 使用方法: “单击”、“右键”、“双击”
Windows XP 桌面
当Windows XP系统启动成功后,其桌面就呈现在屏幕上。
桌面:启动Windows XP后的整个屏幕称为桌面 组成:图标、“开始菜单”、任务栏 功能:充当操作系统与用户进行交互的媒介, 并把计算机中的硬件资源和软件资源有机的联系 在一个屏幕上,操作方便,归类清晰。 注意:注意图标的特点,菜单的位置,任务栏的特征.
Enter键:回车键.英文是“输入”的意思。主要作用是执
行某一命令,在文字处理软件中是换行的作用。
Back Space键:退格键。按一下此键可使光标向左
移动一个字符,并将原位置上的原有字符删除。
键盘介绍
Tab键:表格键。在电脑中的应用主要是在文字处理软件里
(如Word)起到等距离移动的作用。
Windows XP 桌面
桌面的组成
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)//输入用,变量,值,绝对值。
报告描述符
报告大小指明数据项的位数。报告计数指明有多少个这样的数据项。
例如,定义以下数据项:
逻辑最小值(0)
逻辑最大值(0x7f)
报告大小(8)
那么它的意思就是,此报告中数据字段的大小是8位,本身可以表示0~255之间的任何数,但是逻辑值的范围被定义在0~127之间,所以实际上数据字段的数据不能超过127,否则视为无效报告。
报告描述符,顾名思义就是描述“报告”格式的,这个格式使主机和设备能遵循着同一个规则来解释一个报告中所含有的数据。与HID描述符不同,主机会发出单独的请求来读取报告描述符。关于报告描述符的组成,HID设备类定义文档中明确指出,一个报告描述符必须包含但不仅限于以下数据项:
输入(输出或特征)
用法(也可用“用法最小值与最大值”来定义一连串用法)
.dw 0x9, 0x1 //用法(供应商用法1)
.dw 0x15, 0x0 //逻辑最小值(0),全局项,修饰下面所有的主项
.dw 0x26, 0xff, 0x0 //逻辑最大值(255),全局项,修饰下面所有的主项
.dw 0x75, 0x8 //报告大小(8),全局项,修饰下面所有的主项
.dw 0x95, 0x7 //报告计数(7),全局项,修饰下面所有的主项
再举一个例子:
逻辑最小值(0)
逻辑最大值(3)
报告大小(2)
这个例子的意思是,此报告中数据字段的大小是2位,逻辑值范围是0~3,那么数据字段的值与逻辑值是一一对应且相等的,即0(00b),1(01b),2(10b),3(11b)。
第三个例子:
再举一个例子:
逻辑最小值(-1)
HID设备报告描述符详解_划出重点
USB/HID设备报告描述符详解概述:报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途(usage)上的说明。
USB通讯协议的规范是以1ms产生一个USB帧(frame),USB设备可以每一个帧中发送和接收一个交换(transaction)。
交换是由几个封包(packet)组成,而传输是由一个或几个交换来完成传送一口中有效的数据。
在这里,传输和报告的意思相类似。
传输方式有四种,初始学一般只要了解控制型传输(control transfer)和中断型传输(interrupt transfer)即可。
控制型传输是当需要时才执行传输要求,是最一般的传输方式,组态、命令和状态的通讯都可以使用控制型传输;控制型传输主要用于消息型数据(message-type data)。
中断型传输目的在做重复的数据更新(recurring data)传输,精确一点而言,即是在每个有限有周期内(bounded period)作至少一次的小量数据发送或接收;所以适用于流动型数据(strea m-type data),注意这里所谓的周期时间就是在端点描述符中的轮询间隔时间。
报告有三种:input,output,和Feature.后面将作进一步介绍。
中断型输入管线(interrupt in pipe)仅可以传送input报告;中断型输出管线(interrupt out pipe)仅可以传送output报告;但是控制型管线(control pipe)可以传送input,output和feature报告。
端点描述符有声明所使用的端点为何种管线。
数据本身没有任何意义,要赋于用途才能明确其为控制什么(control);例如设备上的按钮指示灯和X与Y轴的位移等都通称控制,数据则为按钮和指示灯的开关状态或X与Y 轴的位移量。
为了这个目的应运而生报告描述符,其将数据的操控与它的用途作一对一的对应,所以解读报告后就可以知道每个数据作何种操作。
自己整理的USB-HID鼠标、键盘通讯格式
Report Size (8),
Input (Constant), ;Reserved byte
Report Count (5),
Report Size (1),
/*******************************************************************************************/
|--bit4: Right Control是否按下,按下为1
|--bit5: Right Shift 是否按下,按下为1
|--bit6: Right Alt 是否按下,按下为1
|--bit7: Right GUI 是否按下,按下为1
在注释中说明,这个字节是保留字节。
这里我也把HID1.11传上来给大家研究。
自己整理的USB-HID鼠标、键盘通讯格式,欢迎指教
【详细说明】自己整理的USB-HID鼠标、键盘通讯格式,欢迎指教
想用STM32做个无线键鼠遥控、找了好几天没有找到完整的USB鼠标键盘协议介绍。最后自己收集整理了一份,希望对需要的朋友有所帮助。
废话不多说,进入正题:
鼠标发送给PC的数据每次4个字节
|--bit1: 1表示右键按下
|--bit0: 1表示左键按下
BYTE2 -- X坐标变化量,与byte的bit4组成9位符号数,负数表示向左移,正数表右移。用补码表示变化量
BYTE3 -- Y坐标变化量,与byte的bit5组成9位符号数,负数表示向下移,正数表上移。用补码表示变化量
定义分别是:
BYTE1 --
|--bit0: Left Control是否按下,按下为1
鼠标报告率什么意思
鼠标报告率什么意思鼠标报告率是指鼠标每秒向计算机发送的数据包数量,通常以Hz(赫兹)为单位。
它是衡量鼠标性能和响应速度的重要指标之一。
在计算机中,鼠标是一种常用的输入设备,用于控制光标的移动和点击操作。
鼠标报告率的高低直接影响到鼠标的灵敏度和响应速度。
一般来说,鼠标报告率越高,鼠标的响应速度就越快,操作起来也就更加流畅。
鼠标报告率的单位是Hz,它表示鼠标每秒向计算机发送的数据包数量。
例如,一个鼠标的报告率为1000Hz,就意味着它每秒向计算机发送1000个数据包。
而如果鼠标的报告率为500Hz,那么它每秒向计算机发送500个数据包。
对于普通用户来说,鼠标报告率的影响可能并不是很明显。
但是对于专业玩家或者对鼠标性能要求较高的用户来说,鼠标报告率就显得尤为重要了。
在一些需要高速反应的游戏中,鼠标报告率的高低可以直接影响到游戏操作的准确性和流畅度。
因此,对于这类用户来说,他们通常会选择报告率较高的鼠标,以获得更好的操作体验。
另外,鼠标报告率还与鼠标的灵敏度和精度有一定的关系。
一般来说,报告率越高,鼠标的灵敏度和精度也会相对更高。
这意味着用户在使用高报告率的鼠标时,可以更加准确地控制光标的移动和点击操作,从而提高操作效率和精度。
总的来说,鼠标报告率是衡量鼠标性能和响应速度的重要指标之一。
它直接影响到鼠标操作的流畅度、准确性和灵敏度,尤其对于专业玩家或对鼠标性能要求较高的用户来说,选择适合自己需求的鼠标报告率是非常重要的。
因此,在购买鼠标时,我们可以根据自己的实际需求和使用习惯,选择适合自己的鼠标报告率,以获得更好的操作体验。
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轴的位移量。
为了这个目的应运而生报告描述符,其将数据的操控与它的用途作一对一的对应,所以解读报告后就可以知道每个数据作何种操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
code char KeyBoardReportDescriptor[63] = {//表示用途页为通用桌面设备0x05, 0x01, // USAGE_PAGE (Generic Desktop)//表示用途为键盘0x09, 0x06, // USAGE (Keyboard)//表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION0xa1, 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)//输入用,变量,值,绝对值。
像键盘这类一般报告绝对值,//而鼠标移动这样的则报告相对值,表示鼠标移动多少0x81, 0x02, // INPUT (Data,Var,Abs)//上面这这几项描述了一个输入用的字段,总共为8个bits,每个bit表示一个按键//分别从左ctrl键到右GUI键。
这8个bits刚好构成一个字节,它位于报告的第一个字节。
//它的最低位,即bit-0对应着左ctrl键,如果返回的数据该位为1,则表示左ctrl键被按下,//否则,左ctrl键没有按下。
最高位,即bit-7表示右GUI键的按下情况。
中间的几个位,//需要根据HID协议中规定的用途页表(HID Usage Tables)来确定。
这里通常用来表示//特殊键,例如ctrl,shift,del键等//这样的数据段个数为10x95, 0x01, // REPORT_COUNT (1)//每个段长度为8bits0x75, 0x08, // REPORT_SIZE (8)//输入用,常量,值,绝对值0x81, 0x03, // INPUT (Cnst,Var,Abs)//上面这8个bit是常量,设备必须返回0//这样的数据段个数为50x95, 0x05, // REPORT_COUNT (5)//每个段大小为1bit0x75, 0x01, // REPORT_SIZE (1)//用途是LED,即用来控制键盘上的LED用的,因此下面会说明它是输出用0x05, 0x08, // USAGE_PAGE (LEDs)//用途最小值是Num Lock,即数字键锁定灯0x19, 0x01, // USAGE_MINIMUM (Num Lock)//用途最大值是Kana,这个是什么灯我也不清楚^_^0x29, 0x05, // USAGE_MAXIMUM (Kana)//如前面所说,这个字段是输出用的,用来控制LED。
变量,值,绝对值。
//1表示灯亮,0表示灯灭0x91, 0x02, // OUTPUT (Data,Var,Abs)//这样的数据段个数为10x95, 0x01, // REPORT_COUNT (1)//每个段大小为3bits0x75, 0x03, // REPORT_SIZE (3)//输出用,常量,值,绝对0x91, 0x03, // OUTPUT (Cnst,Var,Abs)//由于要按字节对齐,而前面控制LED的只用了5个bit,//所以后面需要附加3个不用bit,设置为常量。
//报告个数为60x95, 0x06, // REPORT_COUNT (6)//每个段大小为8bits0x75, 0x08, // REPORT_SIZE (8)//逻辑最小值00x15, 0x00, // LOGICAL_MINIMUM (0)//逻辑最大值2550x25, 0xFF, // LOGICAL_MAXIMUM (255)//用途页为按键0x05, 0x07, // USAGE_PAGE (Keyboard)//使用最小值为00x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))//使用最大值为0x650x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)//输入用,变量,数组,绝对值0x81, 0x00, // INPUT (Data,Ary,Abs)//以上定义了6个8bit宽的数组,每个8bit(即一个字节)用来表示一个按键,所以可以同时//有6个按键按下。
没有按键按下时,全部返回0。
如果按下的键太多,导致键盘扫描系统//无法区分按键时,则全部返回0x01,即6个0x01。
如果有一个键按下,则这6个字节中的第一//个字节为相应的键值(具体的值参看HID Usage Tables),如果两个键按下,则第1、2两个//字节分别为相应的键值,以次类推。
//关集合,跟上面的对应0xc0 // END_COLLECTION};通过上面的分析,我们知道这个报告中只有一个报告,所以没有报告ID,因此返回的都是实际使用的数据。
总共有8字节输入,1字节输出。
其中输入的第一字节用来表示特殊按键,第二字节保留,后面的六字节为普通按键。
下面这个报告描述符是USB鼠标报告描述符,比起键盘的来说要简单些。
它描述了4个字节,第一个字节表示按键,第二个字节表示x轴(即鼠标左右移动,0表示不动,正值表示往右移,负值表示往左移),第三个字节表示y轴(即鼠标上下移动,0表示不动,正值表示往下移动,负值表示往上移动),第四个字节表示鼠标滚轮(正值为往上滚动,负值为往下滚动)。
code char MouseReportDescriptor[52] = {//通用桌面设备0x05, 0x01, // USAGE_PAGE (Generic Desktop)//鼠标0x09, 0x02, // USAGE (Mouse)//集合0xa1, 0x01, // COLLECTION (Application)//指针设备0x09, 0x01, // USAGE (Pointer)//集合0xa1, 0x00, // COLLECTION (Physical)//按键0x05, 0x09, // USAGE_PAGE (Button)//使用最小值10x19, 0x01, // USAGE_MINIMUM (Button 1)//使用最大值3。
1表示左键,2表示右键,3表示中键0x29, 0x03, // USAGE_MAXIMUM (Button 3) //逻辑最小值00x15, 0x00, // LOGICAL_MINIMUM (0)//逻辑最大值10x25, 0x01, // LOGICAL_MAXIMUM (1)//数量为30x95, 0x03, // REPORT_COUNT (3)//大小为1bit0x75, 0x01, // REPORT_SIZE (1)//输入,变量,数值,绝对值//以上3个bit分别表示鼠标的三个按键情况,最低位(bit-0)为左键//bit-1为右键,bit-2为中键,按下时对应的位值为1,释放时对应的值为00x81, 0x02, // INPUT (Data,Var,Abs)//填充5个bit,补足一个字节0x95, 0x01, // REPORT_COUNT (1)0x75, 0x05, // REPORT_SIZE (5)0x81, 0x03, // INPUT (Cnst,Var,Abs)//用途页为通用桌面0x05, 0x01, // USAGE_PAGE (Generic Desktop) //用途为X0x09, 0x30, // USAGE (X)//用途为Y0x09, 0x31, // USAGE (Y)//用途为滚轮0x09, 0x38, // USAGE (Wheel)//逻辑最小值为-1270x15, 0x81, // LOGICAL_MINIMUM (-127)//逻辑最大值为+1270x25, 0x7f, // LOGICAL_MAXIMUM (127)//大小为8个bits0x75, 0x08, // REPORT_SIZE (8)//数量为3个,即分别代表x,y,滚轮0x95, 0x03, // REPORT_COUNT (3)//输入,变量,值,相对值0x81, 0x06, // INPUT (Data,Var,Rel)//关集合0xc0, // END_COLLECTION0xc0 // END_COLLECTION};这里只对报告描述符做一个简单的介绍,更详细的资料请参看USB HID协议以及HID Usage Tables。