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

[复制链接]
2265|1
 楼主| lhchen922 发表于 2013-9-26 15:09 | 显示全部楼层 |阅读模式

下面是《圈圈教你玩USB》里USBTouchScreen例子的报告描述符,

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

问题:请问上面描述的怎么是5个字节,分别是在哪个地方,用哪些语句描述的,请会的朋友
麻烦指教下,谢谢。。
  1. //USB报告描述符的定义
  2. code uint8 ReportDescriptor[] =
  3. {
  4. //每行开始的第一字节为该条目的前缀,前缀的格式为:
  5. //D7~D4:bTag。D3~D2:bType;D1~D0:bSize。以下分别对每个条目注释。

  6. //这是一个全局(bType为1)条目,选择用途页为普通桌面Generic Desktop Page(0x01)
  7. //后面跟一字节数据(bSize为1),后面的字节数就不注释了,
  8. //自己根据bSize来判断。
  9.     0x05, 0x01, // USAGE_PAGE (Generic Desktop)

  10. //这是一个局部(bType为2)条目,说明接下来的应用集合用途用于鼠标
  11.     0x09, 0x02, // USAGE (Mouse)

  12. //这是一个主(bType为0)条目,开集合,后面跟的数据0x01表示
  13. //该集合是一个应用集合。它的性质在前面由用途页和用途定义为
  14. //普通桌面用的鼠标。
  15.     0xa1, 0x01, // COLLECTION (Application)

  16. //这是一个局部条目。说明用途为指针集合
  17.     0x09, 0x01, //   USAGE (Pointer)

  18. //这是一个主条目,开集合,后面跟的数据0x00表示该集合是一个
  19. //物理集合,用途由前面的局部条目定义为指针集合。
  20.     0xa1, 0x00, //   COLLECTION (Physical)

  21. //这是一个全局条目,选择用途页为按键(Button Page(0x09))
  22.     0x05, 0x09, //     USAGE_PAGE (Button)

  23. //这是一个局部条目,说明用途的最小值为1。实际上是鼠标左键。
  24.     0x19, 0x01, //     USAGE_MINIMUM (Button 1)

  25. //这是一个局部条目,说明用途的最大值为3。实际上是鼠标中键。
  26.     0x29, 0x03, //     USAGE_MAXIMUM (Button 3)

  27. //这是一个全局条目,说明返回的数据的逻辑值(就是我们返回的数据域的值啦)
  28. //最小为0。因为我们这里用Bit来表示一个数据域,因此最小为0,最大为1。
  29.     0x15, 0x00, //     LOGICAL_MINIMUM (0)

  30. //这是一个全局条目,说明逻辑值最大为1。
  31.     0x25, 0x01, //     LOGICAL_MAXIMUM (1)

  32. //这是一个全局条目,说明数据域的数量为三个。
  33.     0x95, 0x03, //     REPORT_COUNT (3)

  34. //这是一个全局条目,说明每个数据域的长度为1个bit。
  35.     0x75, 0x01, //     REPORT_SIZE (1)

  36. //这是一个主条目,说明有3个长度为1bit的数据域(数量和长度
  37. //由前面的两个全局条目所定义)用来做为输入,
  38. //属性为:Data,Var,Abs。Data表示这些数据可以变动,Var表示
  39. //这些数据域是独立的,每个域表示一个意思。Abs表示绝对值。
  40. //这样定义的结果就是,第一个数据域bit0表示按键1(左键)是否按下,
  41. //第二个数据域bit1表示按键2(右键)是否按下,第三个数据域bit2表示
  42. //按键3(中键)是否按下。
  43.     0x81, 0x02, //     INPUT (Data,Var,Abs)

  44. //这是一个全局条目,说明数据域数量为1个
  45.     0x95, 0x01, //     REPORT_COUNT (1)

  46. //这是一个全局条目,说明每个数据域的长度为5bit。
  47.     0x75, 0x05, //     REPORT_SIZE (5)

  48. //这是一个主条目,输入用,由前面两个全局条目可知,长度为5bit,
  49. //数量为1个。它的属性为常量(即返回的数据一直是0)。
  50. //这个只是为了凑齐一个字节(前面用了3个bit)而填充的一些数据
  51. //而已,所以它是没有实际用途的。
  52.     0x81, 0x03, //     INPUT (Cnst,Var,Abs)

  53. //这是一个全局条目,选择用途页为普通桌面Generic Desktop Page(0x01)
  54.     0x05, 0x01, //     USAGE_PAGE (Generic Desktop)

  55. //这是一个局部条目,说明用途为X轴
  56.     0x09, 0x30, //     USAGE (X)

  57. //这是一个局部条目,说明用途为Y轴
  58.     0x09, 0x31, //     USAGE (Y)

  59. //下面两个为全局条目,说明返回的逻辑最小和最大值。
  60. //这里定义X和Y轴的逻辑最小值为0,即坐标原点
  61. //X和Y轴的逻辑最大值为4096,即屏幕右下方的坐标为(4096,4096)。
  62. //由于4096超过了一字节的范围,所以需要用2字节的格式表示最大值
  63.     0x15, 0x00, //     LOGICAL_MINIMUM (0)
  64.     0x26, 0x00, 0x10, //     LOGICAL_MAXIMUM (4096)

  65. //下面两个为全局条目,说明返回的物理最小和最大值。
  66. //这里定义X和Y轴的物理最小值为0,即坐标原点
  67. //X和Y轴的物理最大值为4096,即屏幕右下方的坐标为(4096,4096)。
  68. //由于4096超过了一字节的范围,所以需要用2字节的格式表示最大值
  69.     0x35, 0x00,    //Physical Minimum (0)
  70.     0x46, 0x00, 0x10, //Physical Maximum(4096)

  71. //这是一个全局条目,说明数据域的长度为16bit。
  72.     0x75, 0x10, //     REPORT_SIZE (16)

  73. //这是一个全局条目,说明数据域的个数为2个。
  74.     0x95, 0x02, //     REPORT_COUNT (2)

  75. //这是一个主条目。它说明这两个16bit的数据域是输入用的,
  76. //属性为:Data,Var,Abs。Data说明数据是可以变的,Var说明
  77. //这些数据域是独立的,Abs表示这些值是绝对值。
  78.     0x81, 0x02, //     INPUT (Data,Var,Abs)

  79. //下面这两个主条目用来关闭前面的集合用。
  80. //我们开了两个集合,所以要关两次。bSize为0,所以后面没数据。
  81.     0xc0,       //   END_COLLECTION
  82.     0xc0        // END_COLLECTION
  83. };
  84. //通过上面的报告描述符的定义,我们知道返回的输入报告具有5字节。
  85. //第一字节的低3位用来表示按键是否按下的,高5位为常数0,无用。
  86. //第二、三字节表示X轴的绝对坐标,第四、五字节表示Y轴的绝对坐标,
  87. //我们要按照上面的格式将实际的触摸屏数据通过中断端点1返回给电脑。


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




huaziforever 发表于 2013-10-9 17:22 | 显示全部楼层
56行(3bit)+68行(5bit)=1byte ; 102行(16bits*2个)=4bytes;所以上报数据就是5bytes;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

405

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部