自定义HID协议、应用说明

来源:互联网 发布:网络协议大全 编辑:程序博客网 时间:2024/06/01 08:39

基本框架:

    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

可能的配置数

2、配置描述符

    设备描述符里决定了该设备有多少种配置,每种配置都有一个配置描述符。配置描述符主要记录的信息有:配置所包含的接口数、配置的编号、供电方式、是否支持远程唤醒、电流需求量等。

 

偏移量

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

设备耗电电流

3、接口描述符

    在每个配置描述符中又定义了该配置有多少个接口,每个接口都有一个接口描述符。接口描述符主要记录的信息有:接口的编号、接口的端点数、接口所使用的类、子类、协议等。

 

偏移量

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

接口描述符说明字符串索引

4、类描述符

    该描述符不是必须的,如果配置的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

中断端点轮训时间间隔

6、字符串描述符

    字符串描述符主要是提供一些方便人们阅读的信息,它不是必需的。

 

偏移量

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描述符长度

2、      报告描述符

    报告描述符比较复杂,它是以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

 

 

 

 

 

原创粉丝点击