天天看點

基于STM32F103的USB學習筆記11 - 報表描述符

報表描述符是HID裝置中的一個描述符,是描述一個報表以及報表裡面的資料是用來幹什麼的。通過它,USB Host可以解析出報表裡面的資料所表示的含義。它通過控制輸入端點0傳回,Host使用擷取報表描述符指令來擷取報表描述符,注意這個請求是發送到Interface,而不是裝置。一個報表描述符可以描述多個報表,不同的報表通過Report ID來區分,Report ID在報表最前面,即第一個byte。而當報表描述符中沒有規定Report ID時,報表中就沒有ID字段,開始就是資料。

報表描述符是報表描述項目(Item)的集合,每一個描述項目都有相對統一的資料結構,項目很多,通過編碼實作。

1.項目

a)短項目,

基于STM32F103的USB學習筆記11 - 報表描述符

第一個位元組為項目頭,分3個部分:bSize/bType/bTag。

bSize: 短項目的資料位元組數由bSize的值定義,bSize為0、1、2、3時Data部分的位元組數分别為0、1、2、4個位元組。

bType: 短項目的項目類型由bType定義,bType為0、1、2時分别為Main、Global和Local類型。

bTag: 用來表示該項目的功能.

例如一個短項目

0x05,          

0x01,

位元組0x05表示bSize = 1, bType = 1(Global), bTag = 0,位元組0x01就是1個位元組的資料。

b)長項目

基于STM32F103的USB學習筆記11 - 報表描述符

2. 項目類型bType

Main類項目用于定義報表描述符中的資料項。也可以組合其中的若幹資料項成為一個集合。Main項目可以分為帶資料的Main項目和不帶資料的Main項目。帶資料項的Main用于生成報表中的資料項,包括Input、Output和Feature項目。不帶資料的Main項目不生成報表中的資料項,包括Collection和End Collection項目。

0x81,          

0x02,

Global類項目實作對資料的描述,用來識别報表并且描述報表内的資料,包括資料的功能、最大與最小允許值以及資料項的大小與數目等。改變由Main類項目生成的項目狀态表。Global類項目描述對後續的所有項目有效,除非遇到有新的Global類項目。

    0x05,          

    0x01,

    0x09,          

    0x02,

    0xA1,          

    0x01,

    0x09,          

    0x01,

    0xA1,          

    0x00,

    0x05,          

    0x09,

Local類項目定義控制的特征,這一類項目的作用域不超過下一個Main項目,是以在每一Main項目之前可能有多個Local項目。Local項目用于描述後面的Input、Output和Feature項目。

    0x05,          

    0x01,

    0x09,          

    0x02,

    0xA1,          

    0x01,

    0x09,          

    0x01,

    0xA1,          

    0x00,

基于STM32F103的USB學習筆記11 - 報表描述符
基于STM32F103的USB學習筆記11 - 報表描述符

在這些項目中,Usage Page用來指定裝置的功能,而Usage項目用來指定個别報表的功能。Usage Page項目相當于是HID的子集合,Usage相當于是Usage Page的子集合。

USB官網有一個HID描述符的生成工具,dt.exe(https://www.usb.org/document-library/hid-descriptor-tool)。裡面有很多HID的例子,打開joystk.hid.

基于STM32F103的USB學習筆記11 - 報表描述符

可以點選菜單中的“Parse Descriptor”,彈出的界面有各個資料的意義

基于STM32F103的USB學習筆記11 - 報表描述符

然後使用Save As可以生成H檔案。(注意:STM32 USB例程JoyStick是用滑鼠的描述符改的)。

報表描述符不是USB的标準描述符,是以擷取該描述符的動作不是在Device_Property裡面,需要在Device_Property的usbClassDataSetup中擷取。