hid
参考文献:Device Class Definition for Human Interface Devices(HID)
用于描述HID功能特征的有三个值:Class SubClass Interfaces
Subclass Code Description
0 No Subclass
1 Boot Interface Subclass
2 - 255 Reserved
Protocol Code Description
0 None
1 Keyboard
2 Mouse
3 - 255 Reserved
- The bInterfaceProtocol member of an Interface descriptor only has meaning if the bInterfaceSubClass
member declares that the device supports a boot interface, otherwise it is 0.
HID设备的特性
HID设备与HID驱动只能通过控制传输或者中断传输来连接,且端点0在USB设备中通常是作为控制管道。
在HID中,一次传输就是一个报告。
HID 支持在运行时忽略报表中某些字段的功能,这通过定义报告符长度大于实际生成的报告符长度来实现
HID设备通过HID描述符、报告描述符和物理描述符进行描述,其中物理描述符是可选的
HID设备的描述符分层图:
由图可看出,HID Descriptor是与Interface Descriptor并行的描述符,其Class、SubClass和Protocol属性都是在接口描述符中配置,如下:
- bInterfaceClass —— 3(HID Class)
- bInterfaceSubclass —— 0(Have no subclass) / 1(Boot Device)
- bInterfaceProtocol —— 0(Have no Protocol, only valid when Subclass is Boot Device)
同时,Device Descriptor 中的bDeviceClass需配置成0x00
HID Descriptor的组成:
bLength bDescriptorType bcdHID bCountryCode bNumDescriptors bDescriptorType bDescriptorLength...
HID Report Descriptor
如果报告描述符中有出现Report ID,则表示有多个Report,否则就只有一个Input、Output和Feature结构体存在,她们即代表所有的设备数据。
报告描述符中由不同的item组成,一个Item是关于设备的一块信息,所有Item都有1字节的卷标,卷标里包含Tag,type,size
相应的HID Driver里面有一个Item 解析器,对报告符中的Item进行解析,Item解析器一般会解析到Main Item、Pop Item和Push Item并进行相应的操作。
Report Descriptor中的Item解读
Item由三种类型:Main(主项目)、Global(全局项目)、local(区域项目),后两者主要用于修饰Main Item
Local Item只适用于列下的第一个主项目,而Global Item则适用于其下方的所有主项目
1、Main Item的主要数据格式
- input:设备操作输入到主机的数据格式,该数据格式会形成一个输入报告。获取输入报告的方式有两种:1、用Control pipe以get report(input)来传输;2、用Interrupt pipe在每一周期固定更新输入报告给主机
- Output:主机输出到装置的数据格式,形成一个输出报告,以Control pipe用set report(output)将报告送到设备,通常不建议用Interrupt pipe.
- Feature:主机送到设备的组态所需数据的数据格式,特征报告只能用Control pipe以get report(feature)和set report(feature)来取得和送出。
- Collection:Input、Output和Feature的集合,如Mouse、Keyboard等(代码类型有:Physical、APPlication、Logical、Report、Named Array、Usage Switch、Usage Modify、Reserved)
- End Collection:Collection集合结束
2、Global Item的主要数据格式(不完全)
- Usage Page
- Report Count
- Report Size
3、Local Item的主要数据格式(不完全)
- Usage
Usages(用途)是报告符中的一部分,主要用于确认设备的具体操作信息,一个报告符中可以含有多个Usage tags。
Usage和Control的关系是一一对应的
Usage是一个32位的无符号整型,高16位定义用途页(Usage Page),低16位定义用途ID(Usage ID)
-
Usage Mininum
-
Usage Maximum
一般的Items 数据格式分两个部分:前缀和数据
例如:USAGE_PAGE(0x05,0x01) 前者表示前缀,后者表示数据
0x01表示用途页为通用桌面设备
0x05——00000101
D0~D1表示这个前缀后面跟的数据长度
D2~D3表示前缀的类型,0-main 1-global 2-local 3-reserved
D4~D7表示前缀的tag,一般有input、output、feature、collection、end collection
HID规范中指出:HID为发送输入报告必须拥有一个中断输入端点。中断IN端点使HID能够在非可预期的时间内向主机发送信息,主机驱动程序将使用中断事务来周期性的轮询设备以获得数据。
因此,对于设备来说,其发送端点(对于主机来说是输入端点)必须为中断端点,这是由HID的类驱动程序所决定的,主机的类驱动程序不会读取HID接口的其它类型的端点的数据。这样设计也是为了保证数据传输的带宽。
而对于HID接口的输出端点(对于设备来说是接收端点),可以使用其它的类型,比如批量端点。
相关阅读
1.设备分类 Uvmm中管理的设备分为两类:透传设备和虚拟设备(模拟设备)。在虚拟机中通过Device_repository类管理,其结构类图如下: 2.
Linux 主机的硬件配备lspci 找到的是目前主机上面的硬件配备[root@www ~]# lspci [-vvn]选项与参数:-v :显示更多的 PCI 接
本文主要介绍Linux环境下FC磁盘管理相关只是,主要内容包括FC驱动介绍、Linux SCSI磁盘永久命名、FC磁盘添加与删除、FC磁盘路径添
问题描述如下: 这个设备(服务)的驱动程序已被禁用。另一个驱动程序可以提供这个功能。 (代码 32) 设备 USB\VID_13FE&PID_4100
集线器端口上的电涌:一个USB设备超过其集线器端口的电源限制花了三个小时查阅了大量资料,终于把这个问题大致弄清楚了,差点全盘格式