1. 程式人生 > >自定義HID協議、應用說明

自定義HID協議、應用說明

基本框架:

    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