键盘鼠标报告描述符解释

键盘鼠标报告描述符解释
键盘鼠标报告描述符解释

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)

//逻辑最小值为0

0x15, 0x00, // LOGICAL_MINIMUM (0)

//逻辑最大值为1

0x25, 0x01, // LOGICAL_MAXIMUM (1)

//报告大小(即这个字段的宽度)为1bit,所以前面的逻辑最小值为0,逻辑最大值为1

0x75, 0x01, // REPORT_SIZE (1)

//报告的个数为8,即总共有8个bits

0x95, 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键等

//这样的数据段个数为1

0x95, 0x01, // REPORT_COUNT (1)

//每个段长度为8bits

0x75, 0x08, // REPORT_SIZE (8)

//输入用,常量,值,绝对值

0x81, 0x03, // INPUT (Cnst,Var,Abs)

//上面这8个bit是常量,设备必须返回0

//这样的数据段个数为5

0x95, 0x05, // REPORT_COUNT (5)

//每个段大小为1bit

0x75, 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)

//这样的数据段个数为1

0x95, 0x01, // REPORT_COUNT (1)

//每个段大小为3bits

0x75, 0x03, // REPORT_SIZE (3)

//输出用,常量,值,绝对

0x91, 0x03, // OUTPUT (Cnst,Var,Abs)

//由于要按字节对齐,而前面控制LED的只用了5个bit,

//所以后面需要附加3个不用bit,设置为常量。

//报告个数为6

0x95, 0x06, // REPORT_COUNT (6)

//每个段大小为8bits

0x75, 0x08, // REPORT_SIZE (8)

//逻辑最小值0

0x15, 0x00, // LOGICAL_MINIMUM (0)

//逻辑最大值255

0x25, 0xFF, // LOGICAL_MAXIMUM (255)

//用途页为按键

0x05, 0x07, // USAGE_PAGE (Keyboard)

//使用最小值为0

0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))

//使用最大值为0x65

0x29, 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)

//使用最小值1

0x19, 0x01, // USAGE_MINIMUM (Button 1)

//使用最大值3。1表示左键,2表示右键,3表示中键

0x29, 0x03, // USAGE_MAXIMUM (Button 3) //逻辑最小值0

0x15, 0x00, // LOGICAL_MINIMUM (0)

//逻辑最大值1

0x25, 0x01, // LOGICAL_MAXIMUM (1)

//数量为3

0x95, 0x03, // REPORT_COUNT (3)

//大小为1bit

0x75, 0x01, // REPORT_SIZE (1)

//输入,变量,数值,绝对值

//以上3个bit分别表示鼠标的三个按键情况,最低位(bit-0)为左键//bit-1为右键,bit-2为中键,按下时对应的位值为1,释放时对应的值为0

0x81, 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) //用途为X

0x09, 0x30, // USAGE (X)

//用途为Y

0x09, 0x31, // USAGE (Y)

//用途为滚轮

0x09, 0x38, // USAGE (Wheel)

//逻辑最小值为-127

0x15, 0x81, // LOGICAL_MINIMUM (-127)

//逻辑最大值为+127

0x25, 0x7f, // LOGICAL_MAXIMUM (127)

//大小为8个bits

0x75, 0x08, // REPORT_SIZE (8)

//数量为3个,即分别代表x,y,滚轮

0x95, 0x03, // REPORT_COUNT (3)

//输入,变量,值,相对值

0x81, 0x06, // INPUT (Data,Var,Rel)

//关集合

0xc0, // END_COLLECTION

0xc0 // END_COLLECTION

};

这里只对报告描述符做一个简单的介绍,更详细的资料请参看USB HID协议以及HID Usage Tables

USB的描述符详解总结

USB的描述符与命令请求详解 一、描述符 1.什么是描述符 所谓描述符,就是用于描述设备特性的具有特定格式排列的一种数据组织结构。 2.描述符的作用 描述符的作用在于设备向主机汇报自己的信息、特征,主机根据这些信息从而加载相应的驱动程序。 3.描述符的分类 描述符分为三大类:标准描述符、设备类描述符、厂商描述符。 除字符串描述符可选外,任何设备都必须包含剩下的几种标准描述符。 在USB1.0中规定了5种标准的描述符: 设备描述符 配置描述符 接口描述符 端点描述符 字符串描述符 规定的设备类描述符有:集线器类描述符、人机接口类描述符。 下表是三种描述符的类型值: 4.使用的几种类 设备类DeviceClass 下表是设备类值的含义。

接口类InterfaceClass 下表是接口类值的含义。 类的交叉与独享 在描述符中,只有设备描述符和接口描述符中会有类别之分,即只有设备和接口会分 类使用,不过有些类别的使用只需经过设备或接口的区分就可彻底清楚明白,这说明在设备类别和接口类别的定义上会有共同的类别名称。而有些类别则是设备或接口独享的,下表是与使用设备相关的类别划分交叉或共享情况:

(此表也适用于标准命令Get_Descriptor中wValue域高字节的取值含义) 【说明:】在设备或接口分类上均可彻底分清使用的(Usage = Both),即在任一处描述符中定义即可的分清楚使用的类(Usage = Both)的基本类有: 02h ------------- 通信及CDC控制类; DCh ------------ 诊断设备类; EFh ------------- 混杂设备类; FFh ------------- 厂商定义的设备类。 5.标准描述符 设备描述符

模式识别特征提取

特征提取 SIFT算法提取步骤 SIFT算法提取特征点的主要步骤: (1)检测尺度空间极值点 检测尺度空间极值的U的是确定特征点位置和所在尺度组。即先使用高斯过滤器对原始图像进行若干次连续滤波建立第一个尺度组,再把图形减小到原来的一半,进行同样的高斯滤波形成第二个尺度组。之后,重复操作直到图像小于某一个给定阀值为止。接下来对每个尺度组中的高斯图像进行差分,形成高斯差分尺度组(DoG尺度图像)。

在上面建立的DoG 尺度空间金字塔中,为了检测到DoG 空间的最大值和最小值, DoG 尺度空间中中间层(最底层和最顶层除外)的每个像素点需要跟同一层的相 邻8个像素点以及它上一层和下一层的9个相邻像素点总共26个相邻像素点进 行比较,以确保在尺度空间和二维图像空间都检测到局部极值,如图3-2所示 图3-2 DoG 空间局部极值检测 在图3-2中,标记为义号的像素若比相邻26个像素的DoG 值都大或都小,则该 点将作为一个局部极值点。被检测工件的高斯滤波图像如图3-3所示。 Gaussian Scale Ifirst g“ve) Difference of Gaussian (DOG) Scale Inwt

图3-3原始图像和部分髙斯滤波图像 (2)精确定位极值点 由于DoG值对噪声和边缘较敏感,因此,在上面DoG尺度空间中检测到局部极值点还要经过进一步的检验才能精确定位为特征点。一般通过二阶Taylor展开式讣算极值点的偏移量,获得亚像素定位精度,同时通过阈值设置剔除差异小的点。最终保留下来的点称为特征点,特征点的检测是在尺度空间中进行的,特征点保持为尺度不变量。各层图像特征点如图3-4所示。

报告描述符

1.2 报告描述符 要解释报告描述符,首先得清楚什么是“报告”。“报告”是主机和HID设备之间进行数据交换的最小单位。也就是说,在主机完成对设备的识别之后,在具体应用上的数据交换就得以“报告”的方式进行。“报告”的类型有三种:输入报告、输出报告和特征报告。输入报告就是设备发给主机的报告,而输出报告就是主机发给设备的报告,特征报告是主机发给设备的报告,特征报告常在自定义HID设备中被用作主机向设备发送自定义数据。 报告描述符,顾名思义就是描述“报告”格式的,这个格式使主机和设备能遵循着同一个规则来解释一个报告中所含有的数据。与HID描述符不同,主机会发出单独的请求来读取报告描述符。关于报告描述符的组成,HID设备类定义文档中明确指出,一个报告描述符必须包含但不仅限于以下数据项: 输入(输出或特征) 用法(也可用“用法最小值与最大值”来定义一连串用法) 用法页 逻辑最小值 逻辑最大值 报告大小 报告计数 报告描述符看起来比较复杂,无论是HID设备类定义文档,还是其他参考书籍,都会花较大的篇幅来阐述它。要把它完全理解是需要一点时间的,而且就算是理解了也不一定能写出“像样”的报告描述符来。学习总有一个过程,入门才是最重要的,只要入了门,后面的事情就会慢慢变得简单,无需在一开始的时候就面面俱到。所以这里只对上面提到的必需的数据项进行解释及举例说明。 输入项(输出或特征)指明了报告的类型,其中隐含了报告的传输方向以及报告数据所具有的数学特性。 用法和用法页一起指明了数据项的用法,每个数据项都必须指明用法,否则主机端不能成功解析报告描述符。用法页是全局的,修饰列于其后的所有数据项,直到出现新的用法页为止;用法则是局部数据项,局部数据项只修饰列于其后的第一个主数据项内的数据项,一旦出现新的主数据项,那么用法必须重新指定。这其中隐含的意思是,每个主数据项前面都必须有修饰它的用法与用法页组合。(“用法”表示的是一个单独的用法,而“用法最小值”和“用法最大值”可以替代“用法”,代表某个范围的用法。) 逻辑最小值和逻辑最大值指明了报告所使用的数据值的范围,这个数据值是以逻辑单位为基础的,与报告大小有着对应关系。 报告大小指明数据项的位数。报告计数指明有多少个这样的数据项。 例如,定义以下数据项: 逻辑最小值(0) 逻辑最大值(0x7f)

相关主题
相关文档
最新文档