USB鼠标HID描述符以及数据格式

USB鼠标HID描述符以及数据格式

1. 标准USB鼠标

HID描述符

//每行开始的第一字节为该条目的前缀,前缀的格式为:
//D7~D4:bTag。D3~D2:bType;D1~D0:bSize。以下分别对每个条目注释。
0x05,0x01, // 是一个全部条目。表示用途页为通用桌面设备 
0x09,0x02, // 是一个局部条目。表示用途为鼠标
0xa1,0x01, // 表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION  
0x09,0x01, // 是一个局部条目。说明用途为指针集合
0xa1,0x00, // 这是一个主条目,开集合,后面跟的数据0x00表示该集合是一个物理集合,用途由前面的局部条目定义为指针集合。
0x95,0x03, // 这是一个全局条目,说明数据域的数量为三个。
0x75,0x01, // 这是一个全局条目,说明每个数据域的长度为1个bit。
0x05,0x09, // 这是一个全局条目,选择用途页为按键(Button Page(0x09))
0x19,0x01, // 这是一个局部条目,说明用途的最小值为1。实际上是鼠标左键。
0x29,0x03, // 这是一个局部条目,说明用途的最大值为3。实际上是鼠标中键。
0x15,0x00, // 这是一个全局条目,说明返回的数据的逻辑值(就是我们返回的数据域的值啦)最小为0。因为我们这里用Bit来表示一个数据域,因此最小为0。 MAXMIN
0x25,0x01, // 最大为1  MAXNUM
0x81,0x02, // 这是一个主条目,标识上面的3个bits是独立的。
0x95,0x01, // 这是一个全局条目,说明数据域数量为1个
0x75,0x05, // 这是一个全局条目,说明每个数据域的长度为5bit。
0x81,0x03, // //这是一个主条目,输入用,由前面两个全局条目可知,长度为5bit,数量为1个。它的属性为常量(即返回的数据一直是0)。这个只是为了凑齐一个字节(前面用了3个bit)而填充的一些数据而已,所以它是没有实际用途的。
0x95,0x03, // 这是一个全局条目,说明数据域的个数为3个。
0x75,0x08, // 这是一个全局条目,说明数据域的长度为8bit。
0x05,0x01, // 这是一个全局条目,选择用途页为普通桌面Generic Desktop Page(0x01)
0x09,0x30, // 这是一个局部条目,说明用途为X轴
0x09,0x31, // 这是一个局部条目,说明用途为Y轴
0x09,0x38, // 这是一个局部条目,说明用途为滚轴
0x15,0x81, // 这是一个全局条目,说明返回的逻辑最小为-128。
0x25,0x7f, // 这是一个全局条目,说明返回的逻辑最大为127。
0x81,0x06, // 这是一个主条目。标识上面的3个数据是绝对值。
0xc0,      // 我们开了两个集合,所以要关两次。bSize为0,所以后面没数据。
0xc0       // END_COLLECTION  

重点介绍下一下几个描述符

0x81,0x06标识数据是绝对值。绝对值的范围只能是一个字节,最大最小值只能在这个范围内确定

0x81,0x02标识数据是独立数值。独立数值的范围字节数可以通过条目前缀自己设定,但是最小值的数值必须是0。

注:独立数值如果设定字节数不是一个字节,还需要修改对应数据域的长度以及个数,具体可以参考下面的触摸设备配置

数据格式

鼠标发送给PC的数据每次4个字节
BYTE1 BYTE2 BYTE3 BYTE4
定义分别是:
BYTE1 –
|–bit7: 1 表示 Y 坐标的变化量超出-256 ~ 255的范围,0表示没有溢出
|–bit6: 1 表示 X 坐标的变化量超出-256 ~ 255的范围,0表示没有溢出
|–bit5: Y 坐标变化的符号位,1表示负数,即鼠标向下移动
|–bit4: X 坐标变化的符号位,1表示负数,即鼠标向左移动
|–bit3: 恒为1
|–bit2: 1表示中键按下
|–bit1: 1表示右键按下
|–bit0: 1表示左键按下
BYTE2 – X坐标变化量,与byte的bit4组成9位符号数,负数表示向左移,正数表右移。用补码表示变化量
BYTE3 – Y坐标变化量,与byte的bit5组成9位符号数,负数表示向下移,正数表上移。用补码表示变化量
BYTE4 – 滚轮变化。

BYTE1高5位是可以不用关注的,一般这5bit 在HID描述符中都是作为填充位使用,置0即可。

2. USB触摸设备

HID描述符

 //每行开始的第一字节为该条目的前缀,前缀的格式为:
 //D7~D4:bTag。D3~D2:bType;D1~D0:bSize。以下分别对每个条目注释。
 //这是一个全局(bType为1)条目,选择用途页为普通桌面Generic Desktop Page(0x01)
 //后面跟一字节数据(bSize为1),后面的字节数就不注释了,
 //自己根据bSize来判断。
 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
 
 //这是一个局部(bType为2)条目,说明接下来的应用集合用途用于鼠标
 0x09, 0x02, // USAGE (Mouse)
 
 //这是一个主(bType为0)条目,开集合,后面跟的数据0x01表示
 //该集合是一个应用集合。它的性质在前面由用途页和用途定义为
 //普通桌面用的鼠标。
 0xa1, 0x01, // COLLECTION (Application)    //1byte报告ID +按键(3bit)+填充行(5bit)=1byte ; 坐标(16bits*2个)=4bytes;所以上报数据就是6bytes;  
 0x85,0x02,   // 报告ID(报告ID 0是保留的),多个设备需要添加。
 //这是一个局部条目。说明用途为指针集合
 0x09, 0x01, //   USAGE (Pointer)
 
 //这是一个主条目,开集合,后面跟的数据0x00表示该集合是一个
 //物理集合,用途由前面的局部条目定义为指针集合。
 0xa1, 0x00, //   COLLECTION (Physical)
 
 //这是一个全局条目,选择用途页为按键(Button Page(0x09))
 0x05, 0x09, //     USAGE_PAGE (Button)
 
 //这是一个局部条目,说明用途的最小值为1。实际上是鼠标左键。
 0x19, 0x01, //     USAGE_MINIMUM (Button 1)
 
 //这是一个局部条目,说明用途的最大值为3。实际上是鼠标中键。
 0x29, 0x03, //     USAGE_MAXIMUM (Button 3)
 
 //这是一个全局条目,说明返回的数据的逻辑值(就是我们返回的数据域的值啦)
 //最小为0。因为我们这里用Bit来表示一个数据域,因此最小为0,最大为1。
 0x15, 0x00, //     LOGICAL_MINIMUM (0)
 
 //这是一个全局条目,说明逻辑值最大为1。
 0x25, 0x01, //     LOGICAL_MAXIMUM (1)
 
 //这是一个全局条目,说明数据域的数量为三个。
 0x95, 0x03, //     REPORT_COUNT (3)
 
 //这是一个全局条目,说明每个数据域的长度为1个bit。
 0x75, 0x01, //     REPORT_SIZE (1)
 
 //这是一个主条目,说明有3个长度为1bit的数据域(数量和长度
 //由前面的两个全局条目所定义)用来做为输入,
 //属性为:Data,Var,Abs。Data表示这些数据可以变动,Var表示  //Var可以任意大小数据但是最小值要从0开始   Abs只能一个字节  
 //这些数据域是独立的,每个域表示一个意思。Abs表示绝对值。
 //这样定义的结果就是,第一个数据域bit0表示按键1(左键)是否按下,
 //第二个数据域bit1表示按键2(右键)是否按下,第三个数据域bit2表示
 //按键3(中键)是否按下。
 0x81, 0x02, //     INPUT (Data,Var,Abs)
 
 //这是一个全局条目,说明数据域数量为1个
 0x95, 0x01, //     REPORT_COUNT (1)
 
 //这是一个全局条目,说明每个数据域的长度为5bit。
 0x75, 0x05, //     REPORT_SIZE (5)
 
 //这是一个主条目,输入用,由前面两个全局条目可知,长度为5bit,
 //数量为1个。它的属性为常量(即返回的数据一直是0)。
 //这个只是为了凑齐一个字节(前面用了3个bit)而填充的一些数据
 //而已,所以它是没有实际用途的。
 0x81, 0x03, //     INPUT (Cnst,Var,Abs)
  
 //这是一个全局条目,选择用途页为普通桌面Generic Desktop Page(0x01)
 0x05, 0x01, //     USAGE_PAGE (Generic Desktop)
 
 //这是一个局部条目,说明用途为X轴
 0x09, 0x30, //     USAGE (X)
  //下面两个为全局条目,说明返回的逻辑最小和最大值。 屏幕大小 1920*1080
 //这里定义X的逻辑最小值为0,即坐标原点
 //X的逻辑最大值为1919,即屏幕x的坐标为(0,1919)。
 //由于1920超过了一字节的范围,所以需要用2字节的格式表示最大值
 0x15, 0x00, //     LOGICAL_MINIMUM (0)
 0x26, 0x7f, 0x07, //     LOGICAL_MAXIMUM (1919)

  //下面两个为全局条目,说明返回的物理最小和最大值。
 //这里定义X的物理最小值为0,即坐标原点
 //X的物理最大值为1919,即屏幕x的坐标为(0,1919)。
 //由于1920超过了一字节的范围,所以需要用2字节的格式表示最大值
 0x35, 0x00,    //Physical Minimum (0)
 0x46, 0x7f, 0x07, //Physical Maximum(1919)

 //这是一个全局条目,说明数据域的长度为16bit。
 0x75, 0x10, //     REPORT_SIZE (16)
 
 //这是一个全局条目,说明数据域的个数为1个。
 0x95, 0x01, //     REPORT_COUNT (1)
 
 //这是一个主条目。它说明这两个16bit的数据域是输入用的,
 //属性为:Data,Var,Abs。Data说明数据是可以变的,Var说明
 //这些数据域是独立的,Abs表示这些值是绝对值。
 0x81, 0x02, //     INPUT (Data,Var,Abs)
 
 //这是一个局部条目,说明用途为Y轴
 0x09, 0x31, //     USAGE (Y)

  //下面两个为全局条目,说明返回的逻辑最小和最大值。
 //这里定义Y的逻辑最小值为0,即坐标原点
 //Y的逻辑最大值为1079,即屏幕Y的坐标为(0,1079)。
 //由于1080超过了一字节的范围,所以需要用2字节的格式表示最大值
 0x15, 0x00, //     LOGICAL_MINIMUM (0)
 0x26, 0x37, 0x04, //     LOGICAL_MAXIMUM (1079)

  //下面两个为全局条目,说明返回的物理最小和最大值。
 //这里定义Y的物理最小值为0,即坐标原点
 //Y的物理最大值为1079,即屏幕Y的坐标为(0,1079)。
 //由于1080超过了一字节的范围,所以需要用2字节的格式表示最大值
 0x35, 0x00,    //Physical Minimum (0)
 0x46, 0x37, 0x04, //Physical Maximum(1079)

 //这是一个全局条目,说明数据域的长度为16bit。
 0x75, 0x10, //     REPORT_SIZE (16)
 
 //这是一个全局条目,说明数据域的个数为1个。
 0x95, 0x01, //     REPORT_COUNT (1)
 
 //这是一个主条目。它说明这两个16bit的数据域是输入用的,
 //属性为:Data,Var,Abs。Data说明数据是可以变的,Var说明
 //这些数据域是独立的,Abs表示这些值是绝对值。
 0x81, 0x02, //     INPUT (Data,Var,Abs)
 
 //下面这两个主条目用来关闭前面的集合用。
 //我们开了两个集合,所以要关两次。bSize为0,所以后面没数据。
 0xc0,       //   END_COLLECTION
 0xc0  ,      // END_COLLECTION

数据格式

触摸设备根据HID设置发送给PC的数据每次6个字节
BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6
定义分别是:

BYTE1 – 报告ID(报告ID 0是保留的),多个设备需要添加。

BYTE2 –
|–bit7: 保留 默认值为 0
|–bit6: 保留 默认值为 0
|–bit5: 保留 默认值为 0
|–bit4: 保留 默认值为 0
|–bit3: 保留 默认值为 0
|–bit2: 1表示中键按下
|–bit1: 1表示右键按下
|–bit0: 1表示左键按下

BYTE3 – X坐标变化量低8位,BYTE3 与 BYTE4组合后最大值不能操作描述符中设定的值
BYTE4 – X坐标变化量高8位

BYTE5 – Y坐标变化量低8位,BYTE3 与 BYTE4组合后最大值不能操作描述符中设定的值
BYTE6 – Y坐标变化量高8位

  • 7
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值