您的位置 首页 新能源

USB HID陈述及陈述描述符简介

本站为您提供的USB HID报告及报告描述符简介,在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。USB报告描述符(Report Descriptor)是HID设备

在USB中,USB HOST是经过各种描绘符来辨认设备的,有设备描绘符,装备描绘符,接口描绘符,端点描绘符,字符串描绘符,陈述描绘符等等。USB陈述描绘符(Report Descriptor)是HID设备中的一个描绘符,它是比较复杂的一个描绘符。


    USB HID设备是经过陈述来给传送数据的,陈述有输入陈述和输出陈述。输入陈述是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息回来给电脑,键盘将按键数据数据回来给电脑等;输出陈述是主机发送给USB设备的,例如键盘上的数字键盘确认灯和大写字母确认灯等。陈述是一个数据包,里边包括的是所要传送的数据。输入陈述是经过中止输入端点输入的,而输出陈述有点差异,当没有中止输出端点时,能够经过操控输出端点0发送,当有中止输出端点时,经过中止输出端点宣布。


    而陈述描绘符,是描绘一个陈述以及陈述里边的数据是用来干什么用的。经过它,USB HOST能够剖析出陈述里边的数据所表明的意思。它经过操控输入端点0回来,主机运用获取陈述描绘符指令来获取陈述描绘符,留意这个请求是发送到接口的,而不是到设备。一个陈述描绘符能够描绘多个陈述,不同的陈述经过陈述ID来辨认,陈述ID在陈述最前面,即榜首个字节。当陈述描绘符中没有规则陈述ID时,陈述中就没有ID字段,开端便是数据。


    USB陈述描绘符能够经过运用HID Descriptor tool来生成。点击加粗部分能够下载此东西。



    下面经过由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)
    //逻辑最小值为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字节输出。其间输入的
榜首字节用来表明特别按键,第二字节保存,后边的六字节为一般按键。假如
只要左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会发送
输出陈述,从陈述描绘符中咱们知道,Num Lock的LED对应着输出陈述的最低位,
当数字小键盘翻开时,输出xxxxxxx1(二进制,打x的由其它的LED状况决议);
当数字小键盘封闭时,输出xxxxxxx0(同前)。取出最低位就能够操控数字键确认LED了。
下面这个陈述描绘符是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
};


经过对上面的陈述剖析,咱们知道陈述回来4个字节,没有陈述ID。假如鼠标左键按下,
则回来01 00 00 00(十六进制值),假如右键按下,则回来02 00 00 00,假如中键按下,
则回来04 00 00 00,假如三个键一起按下,则回来07 00 00 00。假如鼠标往右移动则
第二字节回来正值,值越大移动速度越快。其它的类推。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/70984.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部