你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

[USB接口] 请教下USB报告描述符的问题。。谢谢

[复制链接]
bonnie-395705 提问时间:2013-9-26 15:17 /
下面是《圈圈教你玩USB》里USBTouchScreen例子的报告描述符,

请教下描述符里面用了5个字节,在下面描述中分别重哪里开始,哪是第一,2,3字节,又分别用了哪些bit,请懂的麻烦指教下,谢谢。。。。。

问题:请问上面描述的怎么是5个字节,分别是在哪个地方,用哪些语句描述的,请会的朋友
麻烦指教下,谢谢。。

       
  • //USB报告描述符的定义   
  • code uint8 ReportDescriptor[] =   
  • {   
  • //每行开始的第一字节为该条目的前缀,前缀的格式为:   
  • //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)   
  •     
  • //这是一个局部条目。说明用途为指针集合   
  •     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表示   
  • //这些数据域是独立的,每个域表示一个意思。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)   
  •     
  • //这是一个局部条目,说明用途为Y轴   
  •     0x09, 0x31, //     USAGE (Y)   
  •     
  • //下面两个为全局条目,说明返回的逻辑最小和最大值。   
  • //这里定义X和Y轴的逻辑最小值为0,即坐标原点   
  • //X和Y轴的逻辑最大值为4096,即屏幕右下方的坐标为(4096,4096)。   
  • //由于4096超过了一字节的范围,所以需要用2字节的格式表示最大值   
  •     0x15, 0x00, //     LOGICAL_MINIMUM (0)   
  •     0x26, 0x00, 0x10, //     LOGICAL_MAXIMUM (4096)   
  •     
  • //下面两个为全局条目,说明返回的物理最小和最大值。   
  • //这里定义X和Y轴的物理最小值为0,即坐标原点   
  • //X和Y轴的物理最大值为4096,即屏幕右下方的坐标为(4096,4096)。   
  • //由于4096超过了一字节的范围,所以需要用2字节的格式表示最大值   
  •     0x35, 0x00,    //Physical Minimum (0)   
  •     0x46, 0x00, 0x10, //Physical Maximum(4096)   
  •     
  • //这是一个全局条目,说明数据域的长度为16bit。   
  •     0x75, 0x10, //     REPORT_SIZE (16)   
  •     
  • //这是一个全局条目,说明数据域的个数为2个。   
  •     0x95, 0x02, //     REPORT_COUNT (2)   
  •     
  • //这是一个主条目。它说明这两个16bit的数据域是输入用的,   
  • //属性为:Data,Var,Abs。Data说明数据是可以变的,Var说明   
  • //这些数据域是独立的,Abs表示这些值是绝对值。   
  •     0x81, 0x02, //     INPUT (Data,Var,Abs)   
  •     
  • //下面这两个主条目用来关闭前面的集合用。   
  • //我们开了两个集合,所以要关两次。bSize为0,所以后面没数据。   
  •     0xc0,       //   END_COLLECTION   
  •     0xc0        // END_COLLECTION   
  • };   
  • //通过上面的报告描述符的定义,我们知道返回的输入报告具有5字节。   
  • //第一字节的低3位用来表示按键是否按下的,高5位为常数0,无用。   
  • //第二、三字节表示X轴的绝对坐标,第四、五字节表示Y轴的绝对坐标,   
  • //我们要按照上面的格式将实际的触摸屏数据通过中断端点1返回给电脑。   
  •     
  •     
  • ///////////////////////////报告描述符完毕///////////////////////////
收藏 评论3 发布时间:2013-9-26 15:17

举报

3个回答
fengye5340 回答时间:2013-9-26 16:25:42

回复:[USB接口] 请教下USB报告描述符的问题。。谢谢

楼主想要弄清楚这些字节,还得好好研究报告描述符才行,
{
//这是一个全局条目,选择用途页为按键(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表示
//这些数据域是独立的,每个域表示一个意思。Abs表示绝对值。
//这样定义的结果就是,第一个数据域bit0表示按键1(左键)是否按下,
//第二个数据域bit1表示按键2(右键)是否按下,第三个数据域bit2表示
//按键3(中键)是否按下。
    0x81, 0x02, //     INPUT (Data,Var,Abs)
}

上面括号内部分讲的是鼠标按键,定义在第一个字节的后三位,即BIT2 BIT1 BIT0

{
//这是一个全局条目,说明数据域数量为1个
    0x95, 0x01, //     REPORT_COUNT (1)
 
//这是一个全局条目,说明每个数据域的长度为5bit。
    0x75, 0x05, //     REPORT_SIZE (5)
 
//这是一个主条目,输入用,由前面两个全局条目可知,长度为5bit,
//数量为1个。它的属性为常量(即返回的数据一直是0)。
//这个只是为了凑齐一个字节(前面用了3个bit)而填充的一些数据
//而已,所以它是没有实际用途的。
    0x81, 0x03, //     INPUT (Cnst,Var,Abs)
}
上面括号内部分定义的是第一个字节的高5位,作为常量输入。

{

//这是一个全局条目,选择用途页为普通桌面Generic Desktop Page(0x01)
    0x05, 0x01, //     USAGE_PAGE (Generic Desktop)
 
//这是一个局部条目,说明用途为X轴
    0x09, 0x30, //     USAGE (X)
 
//这是一个局部条目,说明用途为Y轴
    0x09, 0x31, //     USAGE (Y)
 
//下面两个为全局条目,说明返回的逻辑最小和最大值。
//这里定义X和Y轴的逻辑最小值为0,即坐标原点
//X和Y轴的逻辑最大值为4096,即屏幕右下方的坐标为(4096,4096)。
//由于4096超过了一字节的范围,所以需要用2字节的格式表示最大值
    0x15, 0x00, //     LOGICAL_MINIMUM (0)
    0x26, 0x00, 0x10, //     LOGICAL_MAXIMUM (4096)
 
//下面两个为全局条目,说明返回的物理最小和最大值。
//这里定义X和Y轴的物理最小值为0,即坐标原点
//X和Y轴的物理最大值为4096,即屏幕右下方的坐标为(4096,4096)。
//由于4096超过了一字节的范围,所以需要用2字节的格式表示最大值
    0x35, 0x00,    //Physical Minimum (0)
    0x46, 0x00, 0x10, //Physical Maximum(4096)
 
//这是一个全局条目,说明数据域的长度为16bit。
    0x75, 0x10, //     REPORT_SIZE (16)
 
//这是一个全局条目,说明数据域的个数为2个。
    0x95, 0x02, //     REPORT_COUNT (2)
 
//这是一个主条目。它说明这两个16bit的数据域是输入用的,
//属性为:Data,Var,Abs。Data说明数据是可以变的,Var说明
//这些数据域是独立的,Abs表示这些值是绝对值。
    0x81, 0x02, //     INPUT (Data,Var,Abs)
}


上面括号内说明了第2-5个字节,每两个字节组成一个16位数值,用作X和Y。这里X 是 2-3字节
 Y--用 4 5字节表示。

 
wkuang 回答时间:2013-10-6 16:53:22

RE:[USB接口] 请教下USB报告描述符的问题。。谢谢

楼主还未看过USB协议吧。
1) USB描述符相当于单片机与PC的一套通讯握手协议。分为设备描述符,接口描述符,...等等.
2)这个描述符相当于PC问 MCU,你是谁,
MCU回答,我是***
PC问,你有几个接口,是不是复合USB等等;
MCU回答,我**
其中,PC问和MCU回复都通过结构体第一个字节解析出,这句话表示什么意思,是什么描述符,第二个字节一般表示这条描述符有多长(第一个字节表示是什么 描述符,第二句是描述符长度,后续是描述符的详细内容,其中描述符是PC和MCU约束好的,有USB协议规定的描述符,也可以PC和MCU商议,自定义)
3)具体可以看看USB协议
Soda.t 回答时间:2017-5-21 15:15:19
fengye5340 发表于 2013-9-26 16:25
楼主想要弄清楚这些字节,还得好好研究报告描述符才行,
{
//这是一个全局条目,选择用途页为按键(Button  ...

请问,红外触摸屏的逻辑最大最小,物理最大最小,分别指的什么意思呀,不太明白逻辑、物理的区别
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版