《USBHID协议.docx》由会员分享,可在线阅读,更多相关《USBHID协议.docx(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、操作的某些方面,如 USB 鼠标、USB 键盘、USB 玩耍操作杆、USB 触摸板、USB HID 类设备属于人机交互操作的设备,是一个比较大的类,用于掌握计算机USB 轨迹球、 拨号设备、VCR 遥控等等设备。另外,使用 HID 设备的一个好处就是操作系统自带了 HID 类的驱动程序,用户无需开发很麻烦的驱动程序,只有直接使用 API 调用即可完成通信,全部很多简洁的 USB 设备宠爱枚举成 HID设备,这样就可以不用安装驱动而直接使用。1、HID 设备描述符当插入 USB 设备后,主时机向设备恳求各种描述符来识别设备。为了把一个设备识别为 HID 类,设备在定义描述符的时候必需遵守 HID
2、 标准.HID 设备的描述符除了 5 个 USB 的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符外,还包括 3 个 HID 设备类特定描述符:HID 描述符、报告描述符、物理描述符。HID 描述符是关联于接口(而不是端点的,所以设备不需要为每个端点都供给一个 HID 描述符。设备和主机的通信是通过报告的形式来实现的。而物理描述符不是必需的。5 个标准描述符中与 HID 设备有关的局部有:设备描述符中 bDeviceClass、bDeviceSubClass 和 bDeviceProtocol 三个字段的值必需为 0。接口描述符中 bInterfaceClass 的值
3、必需为 0x03,bInterfaceSubClass 的值为 0 或 1,为 1 表示 HID 设备是一个启动设备Boot Device,一般对PC 机而言才有意义,意思是 BIOS 启动时能识别并使用您的 HID 设备,且只有标准HID 接口描述符中 bInterfaceProtocol 的含义bInterfaceProtocol 的取值含0N1键2鼠3255保USB HID 类描述符的构造鼠标或键盘类设备才能成为 Boot Device。假设为 0 则只有在操作系统启动后才能识别并使用您的 HID 设备).1.1 HID 描述符HID 描述符关联于接口描述符,因而假设一个设备只有一个接口
4、描述符,则无论它有几个端点描述符,HID 设备只有一个HID 描述符.HID 设备描述符主要描述 HID 标准的版本号、HID 设备所用的额外描述符、报告描述符的长度等。偏移量域大小描述0bLength1描述符的字节数1bDescriptorType1描述符类型,HID 类描述符为 0x212bcdHID2HID 版本号,如 1.0 版本的 BCD 码为 0x000,版本 1。1 的 BC4bCountryCode1硬件目的国家的识别码BCD 码5bNumDescrioptors1支持的附属描述符数目6bDescrioptorType1HID 相关描述符的类型0x21:HID 描述符0x22:
5、报告描述符0x23:物理描述符7wDescriptorLength2报告描述符总长度9bDescriptorType1用于识别描述符类型的常量,使用一个以上描述符的设备101。2wDescrioptorLength报告描述符2描述符总长度,使用一个以上描述符的设备HID 设备的报告描述符比较简单也比较难理解。它以 item 形式排列组合而成,无固定长度,用户可以自定义长度以及每一bit 的含义。HID 报告描述符已经不是简简洁单地描述某个值对应某个固定意义了,它已经能够组合出很多种状况,并且需要 PC 上的 HID 驱动程序供给 parser 解释器来对描述的设备情形进展重解释,进而组合生成出
6、本 HID 硬件设备独特的数据流格式,所以可以把它理解为“报告描述符脚本语言”更为贴切.我们使用“报告描述符”专用脚本语言,让用户来自己定义他们的 HID 设备都有什么数据以及这些数据各 bit 都有什么意义.USB 协会供给了一个 HID 描述符编辑工具 HIDDescrioptor Tool,用它可以便利生成报告描述符.item 类型分为三种:main, global 和 local。其中 main 类型又可以分为5 种 tag:input item tag:指的是从设备的一个或多个类似掌握管道得到的数据output item tag:指的是发送给一个或多个类似掌握管道的数据feature
7、 item tag:表示设备的输入输出不面对最终用户collection item tag:一个有意义的 input, output 和 feature 的组合工程end collection item tag:指定一个 collectionitem 的终止每一个 mainitem taginput,output,feature都说明白来自一个特定管道的数据的大小,数据相对还是独立,以及其他相关信息。在此之前, global 和local item 定义了数据的最大值和最小值 ,等等。local item 仅仅描述下一个main item 定义的数据域,而 global item 是这一个报告
8、描述符中全部后续数据段的默认属性。一个报告描述符可能包含多个 main item,为了准确描述来自一个掌握管道的数据,一个报告描述符必需包括以下内容:inputoutput,featureusageusage 下面用一个三键鼠标举例说明:Usage (Generic Desktop;/global itemUsageMouse;/global itemCollectionApplication);/Start MousecollectionUsage(Pointer;/Collection(Physical);/Start Pointer collectionUsage Buttons)Usa
9、geMinimum 1),UsageMaximum (3,LogicalMinimum (0),LogicalMaximum (1 ;/Fields return valuesfrom 0 to 1ReportCount 3,ReportSize (1);/Create three 1 bit fields(button 1, 2, 3Logical MinimumLogical MaximumReport SizeReport CountInputData, Variable, Absolute);/Addfields to the input report. ReportCount (1,
10、ReportSize (5;/Create 5 bit constant field InputConstant), ;Add field to the input report Usage (Generic Desktop, UsageX,UsageY, LogicalMinimum (127,Logical Maximum(127);/Fields return values from127 to 127 ReportSize (8,ReportCount 2; /Create two 8 bit fieldsX Y position InputData, Variable, Relati
11、ve); /Addfields to the input report EndCollection; /Close Pointer collectionEndCollection; /Close Mouse collectionitem 的数据格式有两种,分别是短 item 和长 item. 短 item 格式bSize0:0 个字节1:1 个字节2:2 个字节3:3 个字节bType0:main1:global2:local3:保存bTagitem 类型8:input9:outputA:collectionB: featureC:end collectionbDataSize0:0 个字节1
12、:1 个字节2:2 个字节3:3 个字节bLongItemTag0:main1:global2:local3:保存data1。3 物理描述符数据物理描述符被用来描述设备的行为特性,物理描述符是可选的,HID 设备可以依据其本体的设备特性选择是否包含物理描述符。下表是 HID 的物理描述符构造。HID 物理描述符的构造长 item,其 bType 位值为 3,bTag 值为 F偏移量域大小描述0bDesignator1用来指定本体的哪一局部影响工程1bFlags1位指定标志位 04:Effort位 57:QualifierbDesignator 取值含义表取值含义取值0x00无0x150x01手
13、0x160x02眼球0x170x03眉0x180x04眼皮0x190x05耳0x1A0x06鼻0x1B0x07嘴0x1C0x08上唇0x1D0x09下唇0x1E0x0A颚0x1F0x0B颈0x200x0C上臂0x210x0D手肘0x220x0E前臂0x230x0F手腕0x240x10手掌0x250x11拇指0x260x12食指0x270x13中指0x280xFF0x14无名指Qualifier 取值含义取值含义取值含义0x00无0x04其中之一0x01右0x05中间USB HID 标准定义的 HID 设备可用端点管道要求说明掌握端点必需传输 USB 描述符、类恳求代码以及供查询的消息数据等中断
14、输入必需传输从设备到主机的输入数据中断输出可选传输从主机到设备的输出数据0x02左0x06保存0x03同时0x07保存2、HID 类可承受的通信管道全部的 HID 设备通过 USB 的掌握管道默认管道,即端点 0)和中断管道与主机通信。掌握管道主要用于以下 3 个方面:接收/响应 USB 主机的掌握请示及相关的类数据在 USB 主机查询时传输数据(如响应 Get_Report 恳求等)接收 USB 主机的数据中断管道主要用于以下两个方面:USB 主机接收 USB 设备的异步传输数据从 USB 主机到 USB 设备的中断输出数据传输是可选的,当不支持中断输出HID 类恳求命令包格式偏移量域大小描
15、述0bmRequestType1D7数据传输方向0=从 USB HOST 到 USB 设备1=从 USB 设备到 USB HOSTD6:5类型01=恳求类型为设备类恳求D4:0接收端0001=恳求对象为接口因而针对 HID 的设备类恳求,仅仅 10100001 和 001000011bRequest1HID 类恳求USB 主机发送有实时性要求的数据给 USB 设备数据传输时,USB 主机通过掌握管道将数据传输给 USB 设备。3、HID 设备类特定的命令(恳求HID 设备类特定的命令恳求有 6 个,它们分别是 Get_Report, Get_Idle,Get_Protocol,Set_Repo
16、rt, Set_Idle 和 Set_Procotol.HID 类恳求命令)数据包格式如下表所示:HID 类恳求 bRequest3。1 GET_REPORT2wValue2高字节说明描述符的类型0x21:HID 描述符0x22:报告描述符0x23:物理描述符4wIndex2低字节非 0 时被用来选定物理描述符依据不同的 bRequest 有不同的意义6wLength2该恳求的数据段长度数值HID 类恳求描述符注释0x01GET_REPORT主机用掌握传输从设备接收数据,全部HID 类设备都要支持这个恳求0x02GET_IDLE主机读取设备当前的空闲速率,设备可以不支持此恳求;0x03GET_
17、PROTOCOL仅仅适应于支持启动功能的 HID 设备(Boot Device)0x09SET_REPORT设备用掌握传输接收主机的数据,设备可以不支持此恳求;0x0ASET_IDLE设置闲置状态,设备可不支持此恳求;0x0BSET_PROTOCOL仅仅适应于支持启动功能的 HID 设备(Boot Device主机通过掌握端点猎取一个 Report域值bmRequestType0xA1bRequest0x01wValue高字节表示报告类型0x01: input 0x02: output 0x03: feature Other: reserved低字节表示 ReportID,如不使用设为 0wI
18、ndexHID 的 interface 索引值wLengthReport 长度DataReport 内容3.2 SET_REPORT域值bmRequestType0x21主机发送一个 Report 给设备,用以设置 input,output 或者 featurebRequest0x09wValue高字节表示报告类型0x01: input 0x02: output 0x03: feature Other: reserved低字节表示 ReportID,如不使用设为 0wIndexHID 的 interface 索引值wLengthReport 长度DataReport 内容3。3 GET_IDL
19、E域值bmRequestType0xA1bRequest0x02wValue高字节 0低字节表示 ReportID,如不使用设为 0wIndexHID 的 interface 索引值wLength1Data空闲速率3。4 SET_IDLE域值bmRequestType0x21bRequest0x0AwValue高字节的速率低字节表示 ReportID,如不使用设为 0wIndexHID 的 interface 索引值wLength0Data无3。5 GET_PROTOCOL域值bmRequestType0xA1bRequest0x03wValue0wIndexHID 的 interface 索引值wLength1Data0=Boot Protocol3。6 SET_PROTOCOL1=Report Protocol域值bmRequestType0x21bRequest0x0BwValue0=Boot Protocol1=Report ProtocolwIndexHID 的 interface 索引值wLength0Data无
限制150内