logo资料库

USB_HID协议中文版_USB接口HID设备.pdf

第1页 / 共48页
第2页 / 共48页
第3页 / 共48页
第4页 / 共48页
第5页 / 共48页
第6页 / 共48页
第7页 / 共48页
第8页 / 共48页
资料共48页,剩余部分请下载后查看
USB接口HID设备
HID设备简介
HID设备的特点
HID设备的硬件要求
HID固件的要求
HID设备描述符
HID设备的描述符
HID描述符
报表描述符
(1)项目
(2)项目的分类
报表描述符的项目
(1)Input、Outpot和Feature项目
(2)Collection和End Collection项目
(3)Usage Page和Usage项目
(4)Report ID项目
(5)Logical Minimum和Logical Maximum项目
(5)Physical Minimum和Physical Maximum项目
(6)Unit Exponent项目
(7)Unit项目
(8)Report Size和Report Count项目
(9)Push和Pop项目
(10)Usage、Usage Minimum和Usage Maximum项目
USB接口的键盘描述符范例
设备的描述符
配置描述符
接口描述符
HID描述符
端点描述符
字符串描述符
报表描述符
HID的特定请求
Get_Report请求
Set_Report请求
Set_Idle请求
Get_Idle请求
Get_Protocol请求
Set_Protocol请求
HID程序设计
HID访问使用的API函数
查找HID的过程
获得GUID
获得HID的结构数组
识别HID接口
获得设备路径
获得设备句柄
获得设备的厂商ID、产品ID和产品序列号
获得HID的能力
获得描述HID能力的数据结构
获得描述HID数值能力的数据结构
输出报表到设备
从设备输入出报表
特征报表的传送
关闭设备
HID实验
获得描述符
设备的初始化
HID测试程序的实现
第8章 USB 接口 HID 设备 HID(Human Interface Device,人机接口设备)是 USB 设备中常用的设备类型,是 直接与人交互的 USB 设备,例如键盘、鼠标与游戏杆等。在 USB 设备中,HID 设备的成 本较低。另外,HID 设备并不一定要有人机交互功能,只要符合 HID 类别规范的设备都是 HID 设备。 Wndows 操作系统最先支持的HID 设备。在windows 98 以及后来的版本中内置有 HID 设备的驱动程序,应用程序可以直接使用这些驱动程序来与设备通信。 在设计一个 USB 接口的计算机外部设备时,如果 HID 类型的设备可以满足需要,可以 将其设计为 HID 类型设备,这样可以省去比较复杂的 USB 驱动程序的编写,直接利用 Windows 操作系统对标准的 HID 类型 USB 设备的支持。 8.1 HID 设备简介 8.1.1 HID 设备的特点  交换的数据储存在称为报表(Report)的结构内,设备的固件必须支持 HlD 报表的 格式。主机通过控制和中断传输中的传送和请求报表来传送和接收数据。报表的格 式非常灵活。  每一笔事务可以携带小量或中量的数据。低速设备每一笔事务最大是 8B,全速设 备每一笔事务最大是 64B,高速设备每一笔事务最大是 1024B。一个 报表可以使用 多笔事务。  设备可以在未预期的时间传送信息给主机,例如键盘的按键或是鼠标的移动。所以 主机会定时轮询设备,以取得最新的数据。  HID 设备的最大传输速度有限制。主机可以保证低速的中断端点每 10ms 内最多 1 笔事务,每一秒最多是 800B。保证全速端点每 lms 一笔事务,每一秒最多是 64000B。保证高速端点每 125 us 三笔事务,每一秒最多是 24.576MB。  HID 设备没有保证的传输速率。如果设备是设置在 10ms 的时距,事务之间的时间 可能等于或小于 10ms。除非设备是设置在全速时在每个帧传输数据,或是在高速 时在每个微帧传输数据。这是最快的轮询速率,所以端点可以保证有正确的带宽可 供使用。 HID 设备除了传送数据给主机外,它也会从主机接收数据。只要能够符合 HlD 类别规 范的设备都可以是 HID 设备。 设备除了 HlD 接口之外,它可能同时还包含有其他的 USB 接口。例如影像显示设备 可能使用 HID 接口来做亮度、对比度的软件控制,而使用传统的影像接口来传送要显示的 数据。USB 扩音器可以使用实时传输来播放语音,同时使用 HID 接口来控制音量、低音等。 HID 类别设备的规范文件主要是以下两份:  Device Class Definition for Human interface Devices  HID Usage Tables 其中前者是 HID 的基本规范文件,后者可以是前者的附件,为开发人员提供实际的控 制类型的描述。文件是用来定义让主机了解以及使用 HID 数据的数值。这两份文件是由 USB Device Working Group 制定的,可以在网址 http://www.usb.org/developers/hidpage/ #Class _Definition 下载。
182 计算机高级接口实践 8.1.2 HID 设备的硬件要求 HID 接口必须符合 Device Class Definition for Human interface Devices 规范内所定 义的 HID 类别的需求。在此文件内描述了所需的描述符、传输的频率以及传输的类型等。 为了符合规范,HID 接口的端点与描述符都必须符合数个要求。 所有的 HID 传输都是使用默认控制管道或是一个中断管道,HID 设备必须有一个中断 输入端点来传送数据到主机,中断输出端点则不是必需的。 主机 HID 类别 驱动程序 默认控制管道 中断管道 外设 HID 类别 设备 传输 类型 控制 中断 图 8-1 HID 传输的传输类型 表 8-1 HID 设备的传输类型 数据来源 数据类型 设备(输入) 没有严格时间限制的数据 主机(输出) 没有严格时间限制的数据 设备(输入) 定时或低延迟的数据 主机(输出) 定时或低延迟的数据 或是没有中断输出管道时的任何数据 主机与设备之间所交换的数据,可以分成两种类型:  低延迟的数据,必须尽快地到达目的;  配置或其他的数据,没有严格时间限制的需求。 是否需 要管道 是 是 是 中断管道是控制管道之外的另一种数据交换的方式,特别适合使用在接收端需要定时 或是尽可能及时收到数据的时候。中断输入管道携带数据到主机,中断输出管道则是携带 数据到设备。在总线忙的时候,控制管道可能会被延迟,而中断管道保证会有可得到的带 宽。HID 不需要一定有中断输出管道。如果没有中断输出管道,主机会在控制管道上使用 HID 设备特有的 Set_Report 请求来传送所有的报表。 8.1.3 HID 固件的要求 主机的驱动程序要与 HID 设备通信,设备的固件必须符合下列需求:  设备的描述符必须识别该设备包含有 HID 接口。  除了默认控制管道外,固件必须另外支持一个中断输入管道。  固件必须包含一个报表描述符来定义要传送与接收的设备数据。 如果要传送数据,固件必须支持 Get_Report 控制传输与中断输入传输。如果要接收 数据,固件必须支持 Set_Report 控制传输与选择性的中断输出传输。 所有的 HID 数据都必须使用定义过的报表格式来定义报表中数据的大小与内容。设备 可以支持一个或多个报表。在固件中的一个报表描述符用来描述此报表,以及如何使用报 表数据的信息。
第 8 章 USB 接口 HID 设备 183 在每一个报表中的一个数值,定义此报表是一个输入(Input)、输出(Output)或是 特征(Feature)报表。主机在输入报表中接收数据,在输出报表中传送数据,特征报表可 以在任何方向传递。 Windows 98 以及后来版本的 HID 驱动程序使用中断传输来传递输入报表。输出报表 的传输类型要根据设备支持的端点与 Windows 的版本而定。Windows 98 Gold 只符合 HID 1.0 规范,它的 HID 驱动程序使用控制传输来传递输出报表。Windows 98 SE、Wndows 2000 符合 HID 1.1 规范,HID 驱动程序在有中断输出端点时使用中断传输,否则使用控制 传输来传递输出报表。特征报表都是使用控制传输。 8.2 HID 设备描述符 HID 设备连接到 USB 主机后,主机通过发送 Get_Descriptor 请求读取 HID 设备的描 述符,了解描述符对了解 USB 设备是至关重要的。 8.2.1 HID 设备的描述符 述符。这些描述符是: HID 设备除了支持 USB 设备的 5 种标准描述符之外,还支持 HID 设备特有的 3 种描  USB 标准描述符:设备、配置、接口、端点和字符串描述符。  HID 特有的描述符:HID、报表(Report)和实体(Physical)描述符。 从描述符的关联关系看,HID 描述符是关联于接口。所以如果一个 HID 设备有 2 个端 点,设备不需要每个端点有一个 HID 描述符。 接口描述符 Interface 端点描述符 Endpoint HID 描述符 Hid 报表描述符 Report 实体描述符 Physical HID、报表和实体描 述符是 HID 设备特 有的描述符 图 8-2 HID 描述符的关联关系 从前面的 USB 描述符可以看出一个规律,描述符的第一、二字节分别是描述符的长 度和类型,描述符的类型字段(bDescriptorType)表明描述符的种类,下表列出了不同描 述符的类型字段数值。 表 8-2 HID 的描述符
184 计算机高级接口实践 类型 描述符 应用 设备 Device 配置 Configuration 字符串 String 接口 Interface 端点 Endpoint 设备限定 Device_Qualiffier Other_Speed_Configuration Interface_power HID Hub 报表 Report 实体 Physical 所有设备必须有,只能一个 所有设备必须有,至少一个 可选择 每一个接口一个 除端点 0 之外的每个端点一个 同时支持全速与高速的设备必须有 一个 HID 设备必须有 HID 设备必须有 可选择的 标准 类别 HID 特定 数 值 01 02 03 04 05 06 07 08 21 29 22 23 对于一个 HID 设备,设备描述符与配置描述符没有 HID 特定的信息。其设备描述符的 bDeviceClass 和 bDeviceSubClass 字段的值为 0,接口描述符的 bInterfaceClass 字段值 为 03,表示设备的该接口是 HID 类别。在接口描述符中其他包含 HID 特定信息的字段还 有子类别码(blnterfaceSubClass)与协议码(blnterfaceProtocol 字段)。 在接口描述符中子类别码字段等于 1 表示此设备支持启动接口(Boot Interface)。如 果设备有启动接口,即便主机的 HID 没有加载驱动程序,设备也可以使用。这种情形可能 发生在计算机是由 DOS 直接启动,在启动时观看系统设置画面或使用 Windows 的安全模 式时。 含有启动接口的键盘或鼠标可以使用 BIOS 或许多主机支持的默认简单协议。HID 规 范定义了键盘与鼠标的启动接口协议。 如果设备没有启动接口,并且接口描述符中协议码字段是 1,表示设备支持键盘接口, 协议码字段是 2,表示支持鼠标接口。接口描述符中协议码字段是 0,表示设备不支持启 动协议。 在 HID Usage Tables 规范中定义了键盘与鼠标的启动描述符(Boot Descriptor)。 BIOS 不需要从设备中读取描述符,因为它知道启动协议,并且假设设备支持启动协议。 所以要启动的设备不需要在固件内包含启动接口描述符,它只要在主机尚未要求在报表描 述 符中的 定义协议 时支持 启动协 议即可。 在操作 系统加载 HlD 驱动 程序 后会使 用 Set_Protocol 请求,将设备由启动协议转换成报表协议。 8.2.2 HID 描述符 结构。 HID 描述符的主要作用是用来识别 HID 通信所使用的额外描述符。下表是 HID 描述符 表 8-3 HID 描述符结构 数值 类型 说明 偏移 量 0 1 2 4 5 6 7 字段 bLength bDescriptorType bcdHID bCountryCode bNumDescriptors bDescriptorType wDescriptorLength 字节 数 1 1 2 1 1 1 2 Numeric 描述符字节数 Constant 0x21 = HID 描述符 Numeric HID 规范版本号(BCD) Numeric 硬件设备所在国家的国家代码 Numeric 类别描述符数目(至少有一个报表描述符) Constant 类别描述符的类型 Numeric 报表描述符的总长度
第 8 章 USB 接口 HID 设备 185 [bDescriptorType]... [wDescriptorLength]... 9 10 bcdHID:设备与其描述符所遵循的 HID 规范的版本号码,此数值是 4 个 16 进位的 Constant 附加的描述符的类型,可选的 Numeric 附加的描述符的总长度,可选的 1 2 BCD 格式字符。例如版本 1.1 的 bcdHID 是 0110h。 bCountryCode:硬件目的国家的识别码。如果不说明,该字段为 0。 bDescriptorType:HID 描述符附属的描述符的类型(报表或实体)。每一个 HID 都 必须至少支持一个报表描述符。一个接口可以支持多个报表描述符,以及一个或多个实体 描述符。 HID 描述符的偏移量为 9 和 10 的 bDescriptorType 和 wDescriptorLength 可以重复存 在多个。 1. 报表描述符 报表描述符定义了执行设备功能的数据格式和使用方法。 报表描述符和 USB 的其他描述符是不一样的,它不是一个简单的表格,报表描述符 是 USB 所有描述符中最复杂的。报表描述符非常复杂而有弹性,因为它需要处理各种用 途的设备。报表的数据必须以简洁的格式来储存,这样才不会浪费设备内的储存空间以及 数据传输时的总线时间。 实际上可以这样理解,报表内容的简洁,是通过报表描述符全面的、复杂的数据描述 实现的。 报表描述符必须先描述数据的大小与内容。报表描述符的内容与大小因设备的不同而 不同,在进行报表传输之前,主机必须先请求设备的报表描述符,只有得到了报表描述符 才可正确解析报表的数据。 报表描述符是报表描述项目(Item)的集合,每一个描述项目都有相对统一的数据结 构,项目很多,通过编码实现。 (1)项目 报表描述符由描述 HID 设备的数据项目(Item)组成,项目的第一个字节(项目前缀) 由三部分构成,即项目类型(item type)、项目标签(item tag)和项目长度(item size)。 其中项目类型说明项目的数据类型,项目标签说明项目的功能,项目长度说明项目的数据 部分的长度。 HID 的项目有短项目和长项目两种,其中短项目的格式如下图。 位序 字段 Data (可以是 0、1、2、4 个字节) 7 6 5 4 3 2 1 0 bType bSize bTag 图 8-3 HID 报表短项目格式 短项目的数据字节数由 bSize 的值定义,bSize 为 0、1、2、3 时 Data 部分的字节数 分别为 0、1、2、4 个字节。短项目的项目类型由 bType 定义,bType 为 0、1、2 时分别 为 Main、Global 和 Local 类型。 长项目可以携带较多的数据,其格式如下图。
186 计算机高级接口实践 位序 字段 字节数 Data 1~255 bLongItemTag 7 6 5 4 3 2 1 0 bDataSize 1 1 1 1 1 1 1 0 1 1 1 图 8-4 HID 报表长项目格式 项目中的第一个字节为上图中的特定值时表明该项目是一个长项目。长项目中的 bDataSize 说明 Data 部分的字节数,bLongItemTag 在 HID 规范中没有定义。 下面是通过汇编实现的一个简单的报表描述符,描述符的每一行是一个项目,该描述 符描述了一个从设备接收 2 个字节的输入报表和发送 2 个字节到设备的输出报表。 HID_Report_desc_table: db 06h, A0h, FFh ; Usage Page(Vendor defined) 定义设备功能 db 09h, A5h db A1h, 01h db 09H, A6h db 09h, A7h db 15h, 80h db 25h, 7Fh db 75h, 08h db 95h, 02h db 81h, 02h db 09h, A9h db 15h, 80h db 25h, 7Fh db 75h, 08h db 95h, 02h db 91h, 02h db C0h ; Usage(Vendor Defined) 定义用法 ; Collection(Application) 开一个集合 ; Usage(Vendor defined) 定义用法 ; 输入报表 ; Usgae(Vendor defined) 定义用法 ; Logical Minimum 定义输入最小值=-128 ; Logical Maximum 定义输入最大值=+127 ; Report Size 定义报表数据项大小=8 ; Report Count 定义报表数据向个数=2 ; Input(Data,Variable,Absolute) 输入项目 ; 输出报表 ; Usgae(Vendor defined) 定义用法 ; Logical Minimum 定义输入最小值=-128 ; Logical Maximum 定义输入最大值=+127 ; Report Size 定义报表数据项大小=8 ; Report Count 定义报表数据向个数=2 ; Output(Data,Variable,Absolute) 输出项目 ; End Collection 关闭集合 (2)项目的分类 报表的项目有 Main、Global 和 Local 三大类,每一类都有多个不同的项目,实现不同 的描述。 Main 类项目用于定义报表描述符中的数据项。也可以组合其中的若干数据项成为一个 集合。Main 项目可以分为带数据的 Main 项目和不带数据的 Main 项目。带数据项的 Main 用于生成报表中的数据项,包括 Input、Output 和 Feature 项目。不带数据的 Main 项目不 生成报表中的数据项,包括 Collection 和 End Collection 项目。 Global 类项目实现对数据的描述,用来识别报表并且描述报表内的数据,包括数据的 功能、最大与最小允许值以及数据项的大小与数目等。改变由 Main 类项目生成的项目状 态表。Global 类项目描述对后续的所有项目有效,除非遇到有新的 Global 类项目。 Local 类项目定义控制的特征,这一类项目的作用域不超过下一个 Main 项目,所以在 每一 Main 项目之前可能有多个 Local 项目。Local 项目用于描述后面的 Input、Output 和 Feature 项目。
第 8 章 USB 接口 HID 设备 187 下表列出的是全部的项目的前缀字和简要功能说明。 表 8-4 HID 项目列表 功能说明 项目 类型 Main 类项 目 项目标志(Tag) Input Output Feature Collection 项目前缀,nn 为数据长度 1000 00 nn 1001 00 nn 1011 00 nn 1010 00 nn End Collection 1100 00 nn Usage Page 0000 01 nn 定义输入报表,主机利用该信息解析设备提供的数 据。主机向控制端口发送Get_Report实现输入 创建输出报表,通过向设备发送 Set_Report 实现输 出 定义送往设备的设置信息 定义 2 个以上数据(Input、Output 和 Feature)的 关系为集合,Collection 开始一个集合,之后的 End Collection 结束集合。Collection 项目的数据部分说 明 Collection 的类型 指定设备的功能 另外由于Usage项目有32位数据值,Usage Page 项目用于为Usage项目在报表描述符中占居存储 空间。用于存放后续的Usage项目的高16位。 Global 类项 目 Logical Minimum Logical Maximum Physical Minimum Physical Maximum Unit Exponent Unit Report Size Report ID Report Count Push Pop Local 类项 目 Usage Minimum Usage Maximum Designator Index Designator Minimum Designator Maximum String Index String Minimum String Maximum Delimiter 定义变量或数组项目的物理最小值和最大值,分别 和 Logical Minimum、Logical Maximum 对应 0001 01 nn 定义变量或数组项目的逻辑最小值和最大值 0010 01 nn 0011 01 nn 0100 01 nn 0101 01 nn 定义数值是基于 10 的指数 0110 01 nn 单位 0111 01 nn 指定报表数据区域所包含的位数 1000 01 nn 报表 ID,该项目在报表中插入一个字节的报表 ID 1001 01 nn 报表中数据域的数目 1010 01 nn 将 Global 项目状态表送入堆栈 1011 01 nn 从堆栈恢复 Global 项目状态表 1100 01 nn – 1111 01 nn 保留 用法索引值,表示对项目或集合建议的用法,用于 当一个项目描述多个控制,对每一个变量和数组元 素都有建议的用法 法 0001 10 nn 定义阵列或位图中控制操作的第一个和最后一个用 0010 10 nn 0011 10 nn 确定用于控制的实体,指向物理描述符中的目标 0100 10 nn 定义阵列或位图目标的起始和终止索引值 0101 10 nn 0111 10 nn 确定字符串描述符中的索引值 1000 10 nn 定义用于阵列或位图控制中字符串序列索引值的最 1001 10 nn 小值和最大值 定义一组 Local 项目的开始和结束,1=开始,0=结 束 1010 10 nn 1010 10 nn – 1111 10 nn 保留 Usage 0000 10 nn 在这些项目中,Usage Page 用来指定设备的功能,而 Usage 项目用来指定个别报表 的功能。Usage Page 项目相当于是 HID 的子集合,Usage 相当于是 Usage Page 的子集 合。 2. 报表描述符的项目
188 计算机高级接口实践 (1)Input、Outpot 和 Feature 项目 这 3 个项目用来定义报表中的数据字段。 Input 项目可以应用到任何控制、计数器读数或其他设备传给主机的信息。一个输入报 表包含一个或多个 Input 项目,主机使用中断输入传输来请求输入报表。 Ouput 项目用来定义主机传送给设备的信息。一个输出报表包含一个或多个 Output 项目。输出报表包含控制状态的数据。如果有中断输出管道,HID1.1 兼容主机使用中断输 出传输来传送输出报表,否则使用 Set_Report 控制请求。 Feature 项目应用到主机传送给设备的信息,或是主机从设备读取 Feature 项目。一 个特征报表包含一个或多个 Feature 项目,Feature 项目通常是包合影响设备与其组件整 体行为的配置。特征报表通常是控制可以使用实际的控制面板调整的设置,例如主机可以 使用虚拟控制面板来让用户选择控制特征。主机使用 Set_Report 与 Get_Report 请求来传 送与接收特征报表。 在每一个 Input、Output 和 Feature 项目的前缀字之后是 32 位描述数据,目前最多定 义了 9 个位,余的位则是保留。位 0~8 的定义中只有位 7 不能应用于 Input 项目,除此之 外其他的位定义都适应于 Input、Output 和 Feature 项目。 表 8-5 Input、Output 和 Feature 项目的数据项说明 含义说明 数据字段 位 值 名称 0 Data 1 Constant 0 0 Array 1 Variable 0 Absolute 1 Relative 0 No Wrap 1 Wrap 0 Linear 1 Non-Linear 0 Preferred 1 2 3 ① 4 ① 5 ① 6 ① 7 ② 数据:表示项目的内容是可更改的(读/写)。 常数:表示项目的内容是不可更改的(只读)。 数组:报告全部控制的状态。如在键盘报表中每一个键在报表中 占一位,报表传输全部键的状态,可以同时按下任意多个键。 变量:报告作用中的控制。如在键盘报表中只报告按下的键的编 号,可以同时按下的键的数目等于报表的计数(Global 类项目 Report Count) 绝对:表示数值以一个固定值为基准。游戏杆通常是报告绝对数 据(游戏杆目前的位置)。 相对:表示数据的改变以上一个读数为基准。鼠标通常是报告相 对数据(鼠标的移动位置)。 如果设置为 1 表示回转,当数值超过最小值到最大值的范围时将 回转,如果最小值是 0 而最大值是 10,超过最大值的下一个数 值是 0。 线形:表示测量的数据与报表的数据有线性的关系。 非线性:表示测量的数据与报表的数据没有线性的关系。 优选状态:表示控制在没有用户交互时会回到一个特定的状态。 如按钮就有优选状态,在无操作时保持未按下的状态。 非优选状态:它维持在上一个用户选择的状态。如交替的开关就 没有优选状态。 1 Non-Preferred 0 No Null Position 无空状态位置:表示控制永远在传送有效的数据。 1 Null State 0 Non-Volatile 空状态:表示控制支持一个没有传送有效数据的状态。如操纵杆 可能具有一个多方向的按钮开关,在没有按下时在空状态,这时 控制将传送一个在 Logical Minimum 与 Logical Maximum 范围 之外的数值来表示它在空状态。 不可变的:表示设备只有在主机请求时才改变数值。当主机传送 一个报表并且不要改变不可变项目时,如果该项目是定义成相对 (Relative)的,数值 0 表示不改变数据,如果不可变项目是定 义成绝对(Absolute)的,超出范围外的数值则表示不改变数据。
分享到:
收藏