USB-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

猜你喜欢

转载自blog.csdn.net/yhl_sophia/article/details/81503046