内容发布更新时间 : 2024/11/17 4:31:25星期一 下面是文章的全部内容请认真阅读。
3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49-7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94-9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9-AF B0 B1 B2 B3 B4 B5 B6 B7 B8-FFFF 第8章 USB接口HID设备 191 Byte Count DV Motion Wakeup OSC Start OOC 4.3 Select OOC Reserved Vx DV Vy DV Vz DV Vbrx DV 4.3.1 Vbry DV Vbrz DV Vno DV Feature Notification DV,DF 4.8 Resolution Multiplier DV Reserved CA System Control 4.5 System Power Down OSC System Sleep OSC 4.5.1 System Wake Up OSC System Context Menu OSC System Main Menu OSC System App Menu OSC System Menu Help OSC System Menu Exit OSC 4.5 System Menu Select OSC System Menu Right RTC System Menu Left RTC System Menu Up RTC System Menu Down RTC System Cold Restart OSC 4.5.1 System Warm Restart OSC D-pad Up OOC D-pad Down OOC 4.7 D-pad Right OOC D-pad Left OOC Reserved System Dock OSC System Undock OSC 4.5.1 System Setup OSC System Break OSC System Debugger Break OSC 4.9 Application Break OSC Application Debugger Break OSC System Speaker Mute OSC 4.5.1 System Hibernate OSC Reserved System Display Invert OSC System Display Internal OSC System Display External OSC System Display Both OSC 4.10 System Display Dual OSC System Display Toggle Int/Ext OSC System Display Swap OSC Primary/Secondary System Display LCD Autoscale OSC Reserved 192 计算机高级接口实践
用法(Usage)定义了各种各样设备特性,对于Usage Page的每一项都定义了常用的各种用法。
用法说明了3种信息,即控制、集合和数据。控制说明设备的状态,如on/off、Enable/Disable等。集合说明控制和数据的组合关系。
上表中的用法类型(Usage Type)描述了应用程序如何处理由Main类型项目生成的数据,具体的定义和详细说明请参阅HID Usage Tables。
(4)Report ID项目
Report ID放在信息包中报表数据之前,设备可以支持多个相同类型的报表,每一个报表包含不同的数据与其特有的ID。
在报表描述符中,Report ID项目作用于其后续所有的项目,直到遇到下一个Report ID为止。如果报表描述符中没有Report ID项目,默认的ID值是0,描述符不能定义一个为0的Report ID,输入报表、输出报表与特征报表可以分享同一个Report ID。
在Set_Report和Get_Report请求传输中,主机在设置事务的 wValue字段的低字节中指定一个Report ID。在中断传输中如果接口支持一个以上的 Report ID,Report ID必须是传送报表中的第一个字节。如果接口只支持数值为0的默认Report ID,此Report ID不应该在中断传输中随着报表一起传送。
(5)Logical Minimum和Logical Maximum项目
Logical Minimum与 Logical Maximum项目定义报表的变量(Variable)或阵列(Array)数据的限制范围,此限制范围以逻辑单位来表示。例如设备报表的一个电流值读数是500mA,而一个单位是2mA,则 Logical Maximum值等于250。
负数值以2的补码来表示。如果Logical Minimum与Logical Maximum都是正数,就不需要有正负号位。不管 Logical Minimum与Logical Maximum是以有正负号或是无正负号的数值来表示,设备都可以正确地传输数据。数据的接收者必须知道数据是否可以是负值。
(5)Physical Minimum和Physical Maximum项目
Physical Minimum和Physical Maximum项目定义数值的限制范围,该限制范围使用Unit项目定义的单位来表示。上例中设备报表的一个电流值读数是500mA,单位是2mA, Logical Maximum值等于250,而Physical Maximum值是500。
Logical Minimum与 Logical Maximum值说明了设备返回数值的边界,可以根据Physical Minimum和Physical Maximum值对数据进行偏移和比例变换。
(6)Unit Exponent项目
Unit Exponent项目定义了在使用逻辑范围和实际范围将设备的返回数值转换成实际数值时,使用10的多少次方对数值进行定标。Unit Exponent的值的编码为4位补码,代表10的指数范围是-8~+7。
表8-8 Unit Exponent 数值表 代码 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 0Ch 0Dh 0Eh 0FH 1 2 3 4 5 6 7 -8 -7 -6 -5 -4 -3 -2 -1 数值 0 根据以上5个项目的值可以换算出报表传送数据(逻辑数据)与物理数据的转换关系。
物理数据值 = 逻辑数据值÷分辨率
分辨率 = (LogicalMaximum - LogicalMinimum)÷
((PhysicalMaximum - PhysicalMinimum)×10UnitExponent)
第8章 USB接口HID设备 193
(7)Unit项目
Unit项目指定报表数据在使用Physical与Unit Exponent项目转换后使用什么度量单位,以及单位的幂指数值。Unit的数值部分可以长达4字节,按照4位为一段分段,可以分为8个半字节段,由高到低分别为半字节7、半字节6、…、半字节0。每一个半字节对应不同的基本单位,其数值表示单位的指数值,采用4位2的补码表示,取值范围是-8~+7之间。
从半字节0~6由下表给出了具体的定义,其中半字节0表示测量系统,半字节7保留。例如在半字节0数值为1(表示采用线性公制测量系统)的条件下,半字节1表示长度(单
2
位为厘米),如果其数值为1表示厘米,数值为2表示(厘米),成为面积单位。半字节3表示时间(单位为秒),如果其数值为-2,表示(秒)-2。
半字节 序号 0 1 2 3 4 5 6 7 测量 项目 测量系统 长度 质量 时间 温度 电流 亮度 保留 0 表8-9 Unit 单位的定义 数值含义 1 2 3 4 线性、公制 角度、公制 线性、英制 角度、英制 厘米 半径 英寸 度 克 石拉(slug) 秒 开式度(Kelvin) 华式度 安培 烛光 无 虽然表中只是定义了有限的基本单位,但可以通过这些基本单位的组合派生出大多数其它的常用单位。
例如报表使用一个字节传送一个从-20到110华氏度温度值,可以定义以下报表描述项目:
Logical Minimum = -128 Logical Maximum = 127 Physical Minimum = -20 Physical Maximum = 110 Unit Exponent = 0 Unit = 30003h
Unit的半字节0=3选择英制线性测量系统,半字节4=3选择华氏温度单位。
130(110+20)华氏度的数值范围线性分布到了256和有效数值区域,每一位相当于0.51华氏度,这样就提高了分辨率。
(8)Report Size和Report Count项目
Report Size项目指定Input、Output与Feature项目字段的大小,以位为单位。 Report Count项目指定Input、Output与Feature项目包含的字段数目。 例如两个8位的字段,Report Size等于8,而Report Count等于2。8个1位的字段,Report Size等于1,而 Report Count等于8。
Input、Output与Feature项目报表可以有多个项目,每一个项目可以有自己的Report Size和Report Count项目。
(9)Push和Pop项目
Push项目将一个Global项目状态表格的副本压入CPU的堆栈内。GIobal项目状态表格包含所有之前定义的Gobal项目的目前设置。
Pop项目恢复之前压入堆栈的Global项目状态的储存状态。
194 计算机高级接口实践
(10)Usage、Usage Minimum和Usage Maximum项目
这3个项目输入Local类型项目。
Usage项目和Global类型的Usage Page项目协同描述项目或集合的功能。 一个报表可以指定一个Usage给许多个控制,或是指定不同的Usage给每一个控制。如果一个报表项目之前有一个Usage,此Usage应用到该项目的所有控制。如果一个报表项目之前有一个以上的Usage,每一个Usage应用到一个控制,Usage与控制是按顺序结合的。
例如下面报表描述符的一个局部,报表含有2个输入字节,第一个字节的用法是x,第2个字节是y。
Report Size (8) Report Count (2) Usage (x) Usage (y) Input (Data, Variable, Absolute)
如果一个报表项目之前有一个以上的Usage,而且控制的数目多于Usage的数目,每一个Usage与一个控制对应,最后一个Usage则应用到所有剩余的控制。
例如在下面报表包含16个字节输入数据,第一个字节对应用法x,第2个字节对应用法y,剩余的14个字节对应厂商定义的用法。
Usage (x) Usage (y) Usage (Vendor defined) Report Size (8) Report Count (16) Input (Data, Variable, Absolute)
Usage Minimum和Usage Maximum可以指定一个 Usage给多个控制或是数组项目。将从Usage Minimum到Usgae Maximun定义的用法顺序对应到多个控制中。
例如在一个键盘描述符中定义的标准键盘的左、右修饰键的输入项目中,使用一个字节的8位分别输入键盘的左、右Ctrl键、Shift键、Alt键和GUI键,从HID Usage tables文档中的第10节可以查到关于键盘用法的定义,其中上述8个修饰键的用法定义值为224到231。以下是报表描述符的修饰键部分描述。
Usage Page (1) ; 1 = Generic Desktop Controls Usage (6) ; 6 = Keyboard Collection (1) ; 1 = Application Usage Page (7) ; 7 = Keyboard/Keypad Usage Minimum (224) Usage Maximum (231) Logical Minimum (0) Logical Maximum (1) Report Size (1) Report Count (8) Input (Data, Variable, Absolute) ……
8.3 USB接口的键盘描述符范例
第8章 USB接口HID设备 195
下面作为一个例子,介绍一个USB接口的101键盘的全部描述符。该键盘固件部分由一个微处理器实现全部控制功能,下面列出的代码为微处理器汇编实现描述符定义。
8.3.1 设备的描述符
设备描述符的代码如下。
;========================================= ; Device descriptor 设备描述符
;========================================= DEVICE_DESC_DATA: DB 0x12 ; bLength = 18,该描述符长度为18字节 DB 0x01 ; bDescriptorType = 01,表明是设备描述符 DB 0x10, 0x01 ; bcdUSB,USB设备版本号=1.1 DB 0x00 ; DeviceClass,设备类码,HID设备为0,类别在接口描述符中定义 DB 0X00 ; DeviceSubClass,设备子类码,DeviceClass为0时该字段必须为0 DB 0X00 ; bDevicePortocol,协议码,DeviceClass为0时该字段必须为0 DB 0x08 ; bMaxPacketSize0,端点0的最大包尺寸 DB 0xFF, 0xFF ; bVendor,厂商ID,由USB实现者论坛确定的 DB 0x01, 0x00 ; bProduct,产品ID
DB 0x00, 0x01 ; bcdDevice,设备版本号为1.00 DB 0x04 ; iManufacturer,厂商字符串的索引值,见字符串描述符 DB 0x0E ; iProduct,产品字符串的索引值,见字符串描述符 DB 0x30 ; iSerialNumber,产品序列号字符串的索引值,见字符串描述符 DB 0X01 ; bNumConfigurations,配置数目只有1个
8.3.2 配置描述符
配置描述符的代码如下。
;========================================= ; Configuration descriptor 配置描述符 ;========================================= CONFIG_DESC_DATA: DB 0x09 ; bLength=9,该描述符长度为9字节 DB 0x02 ; bDescriptorType = 02,表明是配置描述符 DB 0x3B, 0x00 ; wTotalLength = 59,配置、接口、端点和HID描述符的总和字节数 DB 0x02 ; bNumInterfaces = 2,本配置支持的接口数目为2个 DB 0x01 ; bConfigurationValue = 1,本配置描述符的标识符 DB 0x00 ; iCongfiguration = 0,配置描述符说明字符串的索引值,0表示无 DB 0XA0 ; bmAttributes,电源及唤醒设置,USB1.1版中D7=1,D6=0表示总线供电 ; D5=1表示支持远程唤醒 DB 0X32 ; MaxPower = 50,本设备最大耗电为50X2mA=100mA 需要说明的是wTotalLength的值,该数值为配置描述符长度(9)加上后续的键盘的接口描述符长度(9)、端点描述符长度(7)、HID描述符长度(9),以及该配置下的鼠标的接口描述符长度(9)、端点描述符长度(7)、HID描述符长度(9),共59个字节。关于鼠标的相关描述符在下面的叙述中省略了。