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

[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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版