自定义HID协议、应用说明
2017-06-24 13:21
495 查看
基本框架:
HID设备支持USB标准描述符中的五个:设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符。除此之外,HID设备还有三种特殊的描述符:HID描述符、报告描述符、物理描述符。一个USB设备只能支持一个HID描述符,但可以支持多个报告描述符,而物理描述符则可以有也可以没有。USB描述符:
1、设备描述符一个USB设备只有一个设备描述符。设备描述符主要记录的信息有:设备所使用的USB协议版本号、设备类型、端点0的最大包大小、厂商ID(VID)和产品ID(PID)、设备版本号、厂商字符串索引、产品字符串索引、设备序列号索引、可能的配置数等。
偏移量 | Demo值 | 域 | 大小/字节 | 说明 |
0 | 0x12 | bLength | 1 | 该描述符的长度(0x12=18字节) |
1 | 0x01 | bDescriptorType | 1 | 描述符类型(0x01设备描述符) |
2 | 0x00,0x02 | bcdUSB | 2 | 本设备使用的USB协议版本 |
4 | 0x00 | bDeviceClass | 1 | 类代码 |
5 | 0x00 | bDeviceSubClass | 1 | 子类代码 |
6 | 0x00 | bDeviceProtocol | 1 | 协议码 |
7 | 0x40 | bMaxPacketSize | 1 | 端点0最大包长 |
8 | 0x0483 | idVendor | 2 | 厂商ID |
10 | 0x5750 | idProduct | 2 | 产品ID |
12 | 0x00,0x02 | bcdDevice | 2 | 设备版本号 |
14 | 0x01 | iManufacturer | 1 | 描述厂商的字符串索引 |
15 | 0x02 | iProduct | 1 | 描述产品的字符串索引 |
16 | 0x03 | iSerialNumber | 1 | 产品序列号的字符串索引 |
17 | 0x01 | bNumConfigurations | 1 | 可能的配置数 |
设备描述符里决定了该设备有多少种配置,每种配置都有一个配置描述符。配置描述符主要记录的信息有:配置所包含的接口数、配置的编号、供电方式、是否支持远程唤醒、电流需求量等。
偏移量 | Demo值 | 域 | 大小 | 说明 |
0 | 0x09 | bLength | 1 | 该描述符的长度(0x09字节) |
1 | 0x02 | bDescriptorType | 1 | 描述符类型(0x02配置描述符) |
2 | 0x29,0x00 | wTotalLength | 2 | 配置、接口、端点和类描述符字节总和 |
4 | 0x01 | bNumInterfaces | 1 | 支持接口数 |
5 | 0x01 | bConfigurationValue | 1 | 本配置描述符标识 |
6 | 0x00 | iConfiguration | 1 | 配置描述符说明字符串索引 |
7 | 0xC0 | bmAttributes | 1 | 电源及唤醒 |
8 | 0x32 | MaxPower | 1 | 设备耗电电流 |
在每个配置描述符中又定义了该配置有多少个接口,每个接口都有一个接口描述符。接口描述符主要记录的信息有:接口的编号、接口的端点数、接口所使用的类、子类、协议等。
偏移量 | Demo值 | 域 | 大小/字节 | 说明 |
0 | 0x09 | bLength | 1 | 该描述符的长度(0x09字节) |
1 | 0x04 | bDescriptorType | 1 | 描述符类型(0x04接口描述符) |
2 | 0x00 | bInterfaceNumber | 1 | 本接口描述符标识 |
3 | 0x00 | bAlternateSetting | 1 | 可改变的设置 |
4 | 0x02 | bNumEndpoints | 1 | 接口端点数 |
5 | 0x03 | bInterfaceClass | 1 | 接口类代码(0x03 HID) |
6 | 0x00 | bInterfaceSubClass | 1 | 启动类型1=BOOT, 0=No BOOT |
7 | 0x00 | bInterfaceProtocol | 1 | 0=None, 1=Keyboard, 2=Mouse |
8 | 0x00 | iInterface | 1 | 接口描述符说明字符串索引 |
该描述符不是必须的,如果配置的USB类型有类特殊描述符(如HID类),它跟在相应的接口描述符之后。具体数值参见HID类描述符。
5、端点描述符
在接口描述符里又定义了该接口有多少个端点,每个端点都有一个端点描述符。端点描述符主要记录的信息有:端点号及方向、端点的传输类型、最大包长度、查询时间间隔等。
偏移量 | Demo EP1 | Demo EP2 | 域 | 字节 | 说明 |
0 | 0x07 | 0x07 | bLength | 1 | 该描述符的长度(0x07字节) |
1 | 0x05 | 0x05 | bDescriptorType | 1 | 描述符类型(0x5端点描述符) |
2 | 0x81 | 0x01 | bEndpointAddress | 1 | 端点地址 |
3 | 0x03 | 0x03 | bmAttributes | 1 | 端点类型(0x03 中断端点) |
4 | 0x40,0x00 | 0x40,0x00 | wMaxPacketSize | 2 | 端点发送接收最大包长 |
6 | 0x05 | 0x05 | bInterval | 1 | 中断端点轮训时间间隔 |
字符串描述符主要是提供一些方便人们阅读的信息,它不是必需的。
偏移量 | Demo值 | 域 | 大小/字节 | 说明 |
0 | 0x04 | bLength | 1 | 该描述符的长度(0x04/0xXX字节),第一个字符串描述符0x04 |
1 | 0x03 | bDescriptorType | 1 | 描述符类型(0x3字符串描述符) |
2 | 1033 | wLANGID | 2/XX | 第一个字符串描述符时2字节,表示语言编码,其他自定义 |
HID描述符:
为了把一个设备识别为HID类别,设备在定义描述符的时候必须遵守HID规范。除了USB标准定义的一些描述符外,HID设备还必须定义HID描述符。另外设备和主机的通信是通过报告的形式来实现的,所以还必须定义报告描述符;而物理描述符不是必需的。HID描述符是关联于接口(而不是端点)的,所以设备不需要为每个端点都提供一个HID描述符。详情参看《USB HID协议中文版_USB HID 设备》
1、 HID类描述符
HID描述符是HID类特有的描述符,保证设备正确识别,遵循规定的格式。
偏移量 | Demo值 | 域 | 大小/字节 | 说明 |
0 | 0x09 | bLength | 1 | 该描述符的长度(0x09字节) |
1 | 0x21 | bDescriptorType | 1 | 描述符类型(0x21 HID类) |
2 | 0x11,0x01 | bcdHID | 2 | HID规范版本 |
4 | 0x00 | bCountryCode | 1 | 国家代码 |
5 | 0x01 | bNumDescriptors | 1 | 支持的描述符个数 |
6 | 0x22 | bDescriptorType | 1 | 支持的描述类型(0x22是报表) |
7 | 0x34,0x00 | wDescriptorLength | 2 | Report描述符长度 |
报告描述符比较复杂,它是以item形式排列组合而成,无固定长度。为了准确描述来自主机的数据,一个报告描述符必须包括以下内容:
偏移量 | 域 | 大小/字节 | 说明 |
0 | USAGE_PAGE | 2 | |
2 | USAGE | 2 | |
4 | COLLECTION | 2 | |
| | | |
6 | USAGE ID | 2 | |
8 | LOGICAL_MINIMUM | 2 | |
10 | LOGICAL_MAXIMUM | 3 | |
13 | REPORT_SIZE | 2 | |
15 | REPORT_COUNT | 2 | |
17 | INPUT/OUTPUT | 2 | |
| …上述重复 | | |
| | | |
XX | END_COLLECTION | | |
报表描述符是报表描述项目(Item)的集合,每一个描述项目都有相对统一的数据结构,项目很多,通过编码实现项目的第一个字节(项目前缀)由三部分构成,即项目类型(itemtype)、 项目标签(itemtag)和项目长度(itemsize),其中短项目的格式如下图:
其中bTag占4个位,其余二者各占2个位。短项目的数据字节数由 bSize 的值定义, bSize 为0、 1、 2、 3 时 Data 部分的字节数分别为0、 1、 2、 4 个字节。短项目的项目类型由 bType 定义, bType 为 0、 1、 2 时分别为 Main、 Global和 Local 类型。
bTag于下表中描述,例如Input 的标签代码『0x8?』中8 即bTag=8,再如标签Feature 之bTag=11,而Unit之bTag=6。Main Item的bType=0,Global Item的bType=1,而Local Item 的bType= 2。Main Item卷标代码中的『?』可以改为『00nnB』,Global Item的可以改为『01nnB』,而Local Item的可以改为『10nnB』,其中nn 代表bSize。
Main Item | Global Item | Local Item | |||
Item | Prefix Code | Item | Prefix Code | Item | Prefix Code |
Input | 0x8? | Usage Page | 0x0? | Usage | 0x0? |
Output | 0x9? | Logical Minimum | 0x1? | Usage Minimum | 0x1? |
Feature | 0x0b? | Logical Maximum | 0x2? | Usage Maximum | 0x2? |
| | Physical Minimum | 0x3? | Designator_Index | 0x3? |
Collection | 0xa1 | Physical Maximum | 0x4? | Designator Minimum | 0x4? |
End Collection | 0xc0 | Unit Exponent | 0x5? | Designator Maximum | 0x5? |
| | Unit | 0x6? | String_Index | 0x6? |
| | Report Size | 0x7? | String Minimum | 0x7? |
| | Report ID | 0x8? | String Maximum | 0x8? |
| | Report Count | 0x9? | Delimiter | 0xa? |
| | Push | 0xA4 | | |
| | Pop | 0xB4 | | |
相关文章推荐
- QQ-自定义协议说明
- 【Win 10开发】协议-上篇:自定义应用协议
- 一种RS-485总线自定义通信协议及其应用(转)
- 移动网络应用开发中,使用 HTTP 协议比起使用 socket 实现基于 TCP 的自定义协议有哪些优势?
- 【Win10应用开发】协议-下篇:自定义多个协议
- 关于“幽灵架构”的补充说明4:协议的应用场景与局限性
- Windows与自定义USB HID设备通信说明.
- 自定义通信协议设计之TLV编码应用
- Java注解应用,自定义注解映射实现方案说明.
- SourceInSight自定义命令说明与应用
- Netty自定义协议解析原理与应用
- 【Win10应用开发】协议-下篇:自定义多个协议
- Netty自定义协议解析原理与应用
- 移动网络应用开发中,使用 HTTP 协议比起使用 socket 实现基于 TCP 的自定义协议有哪些优势?
- 【Win 10开发】协议-上篇:自定义应用协议
- Windows与自定义USB HID设备通信说明
- 移动网络应用开发中,使用 HTTP 协议比起使用 socket 实现基于 TCP 的自定义协议有哪些优势?
- 让基于CEF的应用支持自定义协议
- 蛙蛙推荐:第一个实际应用中开发的自定义web服务器控件
- java(j2ee)应用-简单自定义标签开发全过程----之一(Inber)——JAVA夜未眠