概述:
报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途(usage)上的说明。
USB通讯协议的规范是以1ms产生一个USB帧(frame),USB设备可以每一个帧中发送和接收一个交换(transaction)。交换是由几个封包(packet)组成,而传输是由一个或几个交换来完成传送一口中有效的数据。在这里,传输和报告的意思相类似。传输方式有四种,初始学一般只要了解控制型传输(control transfer)和中断型传输(interrupt transfer)即可。控制型传输是当需要时才执行传输要求,是最一般的传输方式,组态、命令和状态的通讯都可以使用控制型传输;控制型传输主要用于消息型数据(message-type data)。中断型传输目的在做重复的数据更新(recurring data)传输,精确一点而言,即是在每个有限有周期内(bounded period)作至少一次的小量数据发送或接收;所以适用于流动型数据(stream-type data),注意这里所谓的周期时间就是在端点描述符中的轮询间隔时间。报告有三种:input,output,和Feature.后面将作进一步介绍。中断型输入管线(interrupt in pipe)仅可以传送input报告;中断型输出管线(interrupt out pipe)仅可以传送output报告;但是控制型管线(control pipe)可以传送input,output和feature报告。端点描述符有声明所使用的端点为何种管线。
数据本身没有任何意义,要赋于用途才能明确其为控制什么(control);例如设备上的按钮指示灯和X与Y轴的位移等都通称控制,数据则为按钮和指示灯的开关状态或X与Y轴的位移量。为了这个目的应运而生报告描述符,其将数据的操控与它的用途作一对一的对应,所以解读报告后就可以知道每个数据作何种操作。所以“传输的数据”和“操作”只是一事件的两种描述方式。用途是以一个32位卷标(称作usage tag)来表示,高16位称作usage page(用途类页),低16位称为usage DI(用途识别名):
Usage = (usage page:usage ID)
举例说明:二个字节分别为x和y轴的位移数据,因此第一个字节的usage=(generic desktop:X),而第二个字节的usage = (generic desktop:Y),其中generic desktop为用途的大类别(称作用途类页)之一,x和y轴的操作用途属于此用途类页。文件universal serial Bus HID Usage Table完整列出所有的usage pages(用途类页)和usage ID(用途识别名),使用者必须遵照文件的规范来声明操作的用途。该文件的附录A有十多个报告描述符的范例,值得研究下。
表1、报告描述符的标签
主项目 |
全域项目 |
区域项目 | |||
标签 |
代码 |
标签 |
代码 |
标签 |
代码 |
Input |
X08? |
Usage Page |
0x0? |
Usage |
0x0? |
Output |
0x9? |
Logical Minimum |
0x1? |
Usage Minimum |
0x1? |
Feature |
0x0b? |
Logical Maximum |
0x2? |
Usage Maximum |
0x2? |
|
|
Physical Minimum |
0x3? |
Designator Minimum |
0x3? |
Collection |
0xa1 |
Physical Maximum |
0x4? |
Designator Minimum |
0x4? |
End Collection |
0xc0 |
Unit Exponent |
0x5? |
Designator Maximum |
0x5? |
|
|
Unit |
0x6? |
String |
0x7? |
|
|
Report Size |
0x7? |
Sreing Minimum |
0x8? |
|
|
Report ID |
0x8? |
String Maximum |
0x9? |
|
|
Report Coumt |
0x9? |
Delimiter |
0xa? |
|
|
Push |
0xA? |
|
|
|
|
Pop |
0xb? |
|
|