HID 全局条目(Global Item)
全局项目主要用来选择用途页(Usage Page),定义数据域的长度(Report Count)、数量(Report Size)、报告ID(ReportId)等。
全局项目描述对后续的所有项目有效,除非遇到有新的全局项目。
常见的全局项目有:
- Usage Page(用途页)
- Logical Minimum(逻辑最小值)
- Logical Maxinum(逻辑最大值)
- Physical Minimum(物理最小值)
- Physical Maximum(物理最大值)
- Report Size:数据域大小,表示每个数据域有多少位
- Report Count:数据域有多少个数据域。
- ReportId:报告ID
- Unit Exponent
- Unit:单位
- PUSH:将全局项状态表的副本放置在堆栈上
- POP:用堆栈中的顶部结构替换项状态表。
Logical Minimum 和 Logical Maximum
Logical Minimum与 Logical Maximum项目定义报表的变量(Variable)或阵列(Array) 数据的限制范围,此限制范围以逻辑单位来表示。例如设备报表的一个电流值读数是 500mA,而一个单位是 2mA,则 Logical Maximum 值等于 250。
如果逻辑最小范围和逻辑最大范围都定义为正值(0或大于0的值),则可以假定报告字段为无符号值。否则,所有整数值都是以2的补码格式表示的有符号值。
Physical Minimum 和 Physical Maximum
Physical Minimum和Physical Maximum项口定义数值的限制范围,该限制范围使用Unit项H定义的单位来发小。上例中设备报表的一个电流值读数是500mA,单位是2mA, Logical Maximum等于 250,而 Physical Maximum 值是 500。
Logical Minimum与Logical Maximum值说明了设备返回数值的边界,可以根据 Physical Minimum和Physical Maximum值对数据进行偏移和比例变换。
在报告描述符中声明物理最小值和物理最大值之前,HID解析器假定它们分别等于逻辑最小值和逻辑最大值。在将它们声明为输入、输出或Feature)main item之后,它们将继续影响所有后续主项。如果物理最小范围和物理最大范围均等于0,则它们将恢复为默认解释。
- Logical Minimum 和 Logical Maximum表示了设备返回的值的边界。
- Physical Minimum 和 Physical Maximum 给示通过允许报告值进行偏移和缩放,赋予这些真实的边界以意义。
- 例如,温度计的逻辑范围可能为0和999度,但物理范围可能为32和212度
Unit Exponent
Unit Exponent项目定义了使用逻辑范围和实际范围将设备的返回数值转换成实际数值时,使用10的多少次方对数值进行定标。Unit Exponent的值的编码为4位补码,代表10的指数范围是-8~+7。
根据以以上5个项目的值可以换算:出报表传送数据(逻辑数据)与物理数据的转换关系。
物理数据值=逻辑数据值/分辨率
分辨率 =(LogicalMaximum - LogicalMinimum) /((PhysicalMaximum - PhysicalMinimum) X 10^UnitExponent)
Unit
单位项限定了下表中所述的值.
分辨率的计算:
if ((Physical Maximum == UNDEFINED)
|| (Physical Minimum == UNDEFINED)
|| ((Physical Maximum == 0) && (Physical Minimum == 0)))
{
Physical Maximum = Logical Maximum;
Physical Minimum = Logical Minimum;
}
If (Unit Exponent == UNDEFINED)
Unit Exponent = 0;
Resolution = (Logical Maximum – Logical Minimum) / ((Physical Maximum – Physical Minimum) * (10^Unit Exponent))
例如一个400DPI的鼠标,它的报告描述符的参数为:
参数 | 值 |
---|---|
Logical Minimum | -127 |
Logical Maximum | 127 |
Physical Minimum | -3175 |
Physical Maximum | 3175 |
Unit Exponent | -4 |
Unit | Inches |
那么它的分辨率计算公式为:
Resolution = (127-(-127)) / ((3175-(-3175)) * 10^-4) = 400 counts per inch
dpi是dots per inch的缩写,意思是每英寸的像素数.cpi是count per inch的缩写,意思是每英寸的采样率。dpi和cpi都可以用来表示鼠标的分辨率,但是dpi反应的是个静态指标,用在打印机或扫描仪上显得更为合适。由于鼠标移动是个动态的过程,用cpi来表示鼠标的分辨率更为恰当。
当我们把鼠标向左移动一英寸时,400cpi的鼠标会向计算机发出400次“左移”信号,而800cpi的鼠标就发送800次。做个假设,我们把鼠标移动1/800英寸,那么800cpi的鼠标会向计算机传送一次移动信号,而400cpi的鼠标却没有反应,我们必须再移动1/800英寸它才会传送移动信号。
Report Size 和 Report Count 项目
Report Size项目指定Input、Output与Feature项目字段的大小,以bit为单位。
Report Count 项目指定 lnput、Output、Feature包含的字段数。
例加两个8位的字段,Report Size等于8,而Report Count等于2。8个1位的字段,Report Size 等于 1,而 Report Count 等于 8。
Input、Output与Feature项目报表可以有多个项目,每一个项目可以有自己的Report Size 和 Report Count。
对于数组,Report Count确定报告中可能包含的控件的最大数量,从而确定可同时按下的键或按钮的数量以及每个元素的大小。例如,一个最多支持三次同时按键的数组,其中每个字段为1字节,如下所示:
Report Size (8),
Report Count(3),
对于变量,Report Count指定报告中包含多少控件。例如,八个按钮可能如下所示:
Report Size (1),
Report Count (8),
Push 和 Pop 项目
Push项口将一个Global项口状态表格的副本压入CPU的堆栈内。Global项口状态表格包含所有之前定义的Gobal项I斗的目前设置。
Pop项目恢复之前压入堆栈的Global项目状态的储存状态。