电工技术基础_电工基础知识_电工之家-电工学习网

欢迎来到电工学习网!

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

2022-02-18 14:48分类:电子元器件 阅读:

 

在USB中,USB HOST是根据各种各样ioctl来鉴别机器设备的,有机器设备ioctl,配备ioctl,插口ioctl,节点ioctl,字符串数组ioctl,汇报ioctl这些。USB汇报ioctl(Report Descriptor)是HID机器设备中的一个ioctl,它是非常复杂的一个ioctl。

USB HID机器设备是根据汇报来给传输数据的,汇报有键入汇报和輸出汇报。键入汇报是USB机器设备发给服务器的,比如USB电脑鼠标将光标运动和鼠标单击等信息内容返还给电脑上,电脑键盘将功能键数据信息数据信息返还给电脑上等;輸出汇报是服务器发给USB机器设备的,比如键盘上的数据键盘锁定灯和英文大写字母锁住灯等。汇报是一个数据文件,里边含有的是所要传递的数据信息。键入汇报是根据终断键入节点键入的,而輸出汇报有点儿差别,当沒有终断輸出节点时,能够利用调节輸出节点0推送,当有终断輸出节点时,根据终断輸出节点传出。

而汇报ioctl,是叙述一个汇报及其汇报里边的统计数据是用于干啥用的。根据它,USB HOST能够剖析出汇报里边的数据信息所表示的意思。它根据操纵键入节点0回到,服务器应用获得汇报ioctl指令来获得汇报ioctl,留意这一要求是发送至插口的,而不是到机器设备。一个汇报ioctl能够叙述好几个汇报,不一样的汇报根据汇报ID来鉴别,汇报ID在汇报最前边,即第一个字节数。当汇报ioctl中并没有要求汇报ID时,汇报中就沒有ID字段名,逐渐便是数据信息。

USB汇报ioctl能够根据应用HID Descriptor tool来转化成。点一下字体加粗一部分可以下载此专用工具。


下边根据由HID Descriptor tool转化成的USB电脑鼠标和USB电脑键盘来表明一下汇报ioctl和汇报。

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的仅用了五个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),假如2个键按住,则第一、2两个
//字节数各自为对应的键值,依次推导。


//关结合,跟里面的相匹配
0xc0 // END_COLLECTION
};

根据以上的剖析,我们知道这一汇报中只有一个汇报,因此沒有汇报ID,
因而回到的基本都是具体采用的数据信息。一共有8字节键入,1字节輸出。在其中键入的
第一字节数用于表明独特功能键,第二字节数保存,后边的六字节数为一般功能键。假如
仅有左ctrl键按住,则回到01 00 00 00 00 00 00 00(十六进制),假如
仅有数字键盘1 按住,则回到00 00 59 00 00 00 00 00,假如数据
键1 和2 与此同时按住,则回到00 00 59 5A 00 00 00 00,假如
再按住左shift 键,则回到02 00 59 5A 00 00 00 00,
随后再释放出来1 键,则回到02 00 5A 00 00 00 00 00,
随后所有功能键释放出来,则回到00 00 00 00 00 00 00 00。
这种数据信息(即汇报)全是根据终断节点回到的。当按住Num Lock键时,PC会推送
輸出汇报,从汇报ioctl中我们知道,Num Lock的LED相匹配着輸出汇报的最少位,
当数字小键盘开启时,輸出xxxxxxx1(二进制,打x的由其他的LED情况决策);
当数字小键盘关掉时,輸出xxxxxxx0(同前)。取下最少位就可以操纵数字键盘锁住LED了。
下边这一汇报ioctl是USB电脑鼠标汇报ioctl,相比电脑键盘的来讲要简易些。
它表述了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)

//添充五个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)
//尺寸为八个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
};

根据对以上的汇报剖析,我们知道汇报回到4个字节数,沒有汇报ID。假如鼠标左键按住,
则回到01 00 00 00(十六进制值),假如鼠标右键按住,则回到02 00 00 00,假如中键按住,
则回到04 00 00 00,假如三个键与此同时按住,则回到07 00 00 00。假如电脑鼠标向右挪动则
第二字节数回到恰逢,值越大挪动速率越快。其他的推导。

上一篇:主板usb接口线序

下一篇:DS1775,DS1775R微型数字温度计及温度监控器

相关推荐

电工推荐

    电工技术基础_电工基础知识_电工之家-电工学习网
返回顶部