您的位置:首页 > 其它

自定义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
可能的配置数
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
 
 
 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息