生活随笔
收集整理的這篇文章主要介紹了
HID报表描述符(目前最全的解析,也是USB最复杂的描述符)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
報表描述符定義了執行設備功能的數據格式和使用方法。 報表描述符和 USB 的其他描述符是不一樣的,它不是一個簡單的表格,報表描述符是 USB 所有描述符中最復雜的。報表描述符非常復雜而有彈性,因為它需要處理各種用途的設備報表的數據必須以簡潔的格式來儲存,這樣才不會浪費設備內的儲存空間以及數據傳輸時的總線時間。 實際上可以這樣理解,報表內容的簡潔,是通過報表描述符全面的、復雜的數據描述實現的。 報表描述符必須先描述數據的大小與內容。報表描述符的內容與大小因設備的不同而不同,在進行報表傳輸之前,主機必須先請求設備的報表描述符,只有得到了報表描述符才可正確解析報表的數據。 報表描述符是報表描述項目(Item)的集合,每一個描述項目都有相對統一的數據結構,項目很多,通過編碼實現。
項目
報表描述符由描述 HID 設備的數據項目(Item)組成,項目的第一個字節(項目前綴)由三部分構成,即項目類型(item type)、項目標簽(item tag)和項目長度(item size)。 其中項目類型說明項目的數據類型,項目標簽說明項目的功能,項目長度說明項目的數據部分的長度。 HID 的項目有短項目和長項目兩種,其中短項目的格式如下圖:短項目的數據字節數 由 bSize 的值定義,bSize 為 0、1、2、3 時 Data 部分的字節數分別為 0、1、2、4 個字節。 短項目的項目類型由 bType 定義, bType 為 0、1、2 時分別為 Main、Global 和 Local 類型。 長項目可以攜帶較多的數據,其格式如下圖: HID 報表長項目格式 目中的第一個字節為上圖中的特定值時表明該項目是一個長項目。 長項目中的bDataSize 說明 Data 部分的字節數, bLongItemTag 在 HID 規范中沒有定義。 下面是通過匯編實現的一個簡單的報表描述符,描述符的每一行是一個項目,該描述符描述了一個從設備接收 2 個字節的輸入報表和發送 2 個字節到設備的輸出報表。 HID_Report_desc_table: db 06h, A0h, FFh ; Usage Page(Vendor defined) 定義設備功能 db 09h, A5h ; Usage(Vendor Defined) 定義用法 db A1h, 01h ; Collection(Application) 開一個集合 db 09H, A6h ; Usage(Vendor defined) 定義用法 ; 輸入報表 db 09h, A7h ; Usgae(Vendor defined) 定義用法 db 15h, 80h ; Logical Minimum 定義輸入最小值=-128 db 25h, 7Fh ; Logical Maximum 定義輸入最大值=+127 db 75h, 08h ; Report Size 定義報表數據項大小=8 db 95h, 02h ; Report Count 定義報表數據向個數=2 db 81h, 02h ; Input(Data,Variable,Absolute) 輸入項目 ; 輸出報表 db 09h, A9h ; Usgae(Vendor defined) 定義用法 db 15h, 80h ; Logical Minimum 定義輸入最小值=-128 db 25h, 7Fh ; Logical Maximum 定義輸入最大值=+127 db 75h, 08h ; Report Size 定義報表數據項大小=8 db 95h, 02h ; Report Count 定義報表數據向個數=2 db 91h, 02h ; Output(Data,Variable,Absolute) 輸出項目 db C0h ; End Collection 關閉集合
項目的分類
報表的項目有 Main、Global 和 Local 三大類,每一類都有多個不同的項目,實現不同的描述。 Main 類項目用于定義報表描述符中的數據項。也可以組合其中的若干數據項成為一個
集合。Main 項目可以分為帶數據的 Main 項目和不帶數據的 Main 項目。帶數據項的 Main
用于生成報表中的數據項,包括 Input、Output 和 Feature 項目。不帶數據的 Main 項目不
生成報表中的數據項,包括 Collection 和 End Collection 項目。 Global 類項目實現對數據的描述,用來識別報表并且描述報表內的數據,包括數據的
功能、最大與最小允許值以及數據項的大小與數目等。改變由 Main 類項目生成的項目狀
態表。Global 類項目描述對后續的所有項目有效,除非遇到有新的 Global 類項目。 Local 類項目定義控制的特征,這一類項目的作用域不超過下一個 Main 項目,所以在
每一 Main 項目之前可能有多個 Local 項目。Local 項目用于描述后面的 Input、Output 和
Feature 項目 下表列出的是全部的項目的前綴字和簡要功能說明 HID項目列表 如上圖所示:在這些項目中,Usage Page 用來指定設備的功能,而 Usage 項目用來指定個別報表的功能。Usage Page 項目相當于是 HID 的子集合,Usage 相當于是 Usage Page 的子集合。 下面來解析 下項目列表的用法:這書上沒有提及我給大家解釋一下,舉兩個特例大家應該就明白了,如下圖
再進一步解析項目之間的分類如下圖所示(舉例為短項目,長項目我覺得應該是類似的,認真看看就明白了,這個看明白了 我覺得USB描述符不在話下):
報表描述符的項目
Input、Outpot 和 Feature 項目 這 3 個項目用來定義報表中的數據字段。 Input 項目可以應用到任何控制、計數器讀數或其他設備傳給主機的信息。一個輸入報
表包含一個或多個 Input 項目,主機使用中斷輸入傳輸來請求輸入報表。 Ouput 項目用來定義主機傳送給設備的信息。一個輸出報表包含一個或多個 Output
項目。輸出報表包含控制狀態的數據。如果有中斷輸出管道,HID1.1 兼容主機使用中斷輸
出傳輸來傳送輸出報表,否則使用 Set_Report 控制請求。 Feature 項目應用到主機傳送給設備的信息,或是主機從設備讀取 Feature 項目。一
個特征報表包含一個或多個 Feature 項目,Feature 項目通常是包合影響設備與其組件整
體行為的配置。特征報表通常是控制可以使用實際的控制面板調整的設置,例如主機可以
使用虛擬控制面板來讓用戶選擇控制特征。主機使用 Set_Report 與 Get_Report 請求來傳
送與接收特征報表。 在每一個 Input、Output 和 Feature 項目的前綴字之后是 32 位描述數據,目前最多定義了 9 個位,余的位則是保留。位 0~8 的定義中只有位 7 不能應用于 Input 項目,除此之外其他的位定義都適應于 Input、Output 和 Feature 項目。下圖是關于這三個項目的數據定義:
? Input、Output 和 Feature 項目的數據項說明標題 下面就來解析下 Input,后面兩項大家以此類推就好啦 請看下圖: ?
Collection 和End Collection 項目
所有的報表類型都可以使用 Collection 與 End Collection 項目來將相關的 Main 類型項目組成群組。 這兩個項目分別用于打開和關閉集合。所有在 Collection 與 End Collection項目之間的 Main 類型項目都是 Collection 的一部分。Collection 有 3 種類型:Application、Physical 與 Logical ,其項目的數據項的值分別為 1、0 和 2。廠商也可以自己定義 Collection 類型,數據項的值為 80h~FFh 保留給廠商定義。End Collection 項目無數據項。Application Collection 包含有共同用途的項目或執行單一功能的項目。例如鍵盤的開機描述符將鍵盤的按鍵與 LED 指示燈數據集合成一個 Application Collection。 所有的報表必須在一個 Application Collection 內。 Physical Collection 包含在一個單一幾何點上的數據項目,可以將每個位置的數據集合成一個 Physical Collection。在設備報告多個傳感器的位置的時候,使用 PhysicalCollection 指明不同的數據來自不同的傳感器。 Logical Collection 形成一個數據結構,包含由 Collection 所連結的不同類型的項目。例如數據緩沖區的內容以及緩沖區內字節數目的計數。
Usage Page 和Usage 項目
Usage page 項目的數據部分為 1~2 個字節,目前的定義全部都是一個字節。UsagePage 定義了常用的設備功能,關于 Usage Page(以及其他項目)的具體定義內容,可以查閱 HID Usage tables(http://www.usb.org/developers/hidpage/#Class_Definition),下表是來自 HID Usage tables 的 Usage Page 定義。如下圖
?
Usage Page定義 關于Usage Page的每一個有效定義項,都有一個相應的下一級定義 。如Usage Page的數據項數值為1,則設備定義為Generic Desktop Controls,關于該類設備的具體功能可以在HID Usage Tables中查到具體的定義。下表是HID Usage Tables中對GenericDesktop Controls設備的功能定義。比如 Usage Page = 1 (Generic Desktop Controls) 如上圖的 PageID= 01 然后這個集合里面又可以分下面那么多種設備 如下圖: ?
?
Generic Desktop Controls 用法定義 因此? HID報表描述符功能真的很強大,很靈活。
用法(Usage)定義了各種各樣設備特性,對于 Usage Page 的每一項都定義了常用的各種用法。
上表中的用法類型(Usage Type)描述了應用程序如何處理由 Main 類型項目生成的數據,具體的定義和詳細說明請參閱 HID Usage Tables。
Report ID 項目
Report ID 放在信息包中報表數據之前,設備可以支持多個相同類型的報表,每一個報表包含不同的數據與其特有的 ID。 在報表描述符中,Report ID 項目作用于其后續所有的項目,直到遇到下一個 Report ID為止。如果報表描述符中沒有 Report ID 項目,默認的 ID 值是 0,描述符不能定義一個為0 的 Report ID (以我的理解額 報告ID為0 就不要定義,定義報告ID的話就不要為0)。輸入報表、輸出報表與特征報表可以分享同一個 Report ID。 在 Set_Report 和 Get_Report 請求傳輸中,主機在設置事務的 wValue 字段的低字節中指定一個 Report ID。在中斷傳輸中如果接口支持一個以上的 Report ID,Report ID 必須是傳送報表中的第一個字節。 如果接口只支持數值為 0 的默認 Report ID,此 Report ID不應該在中斷傳輸中隨著報表一起傳送。
Logical Minimum 和 Logical Maximum 項目
Logical Minimum 與 Logical Maximum 項目定義報表的變量(Variable)或陣 列(Array)數據的限制范圍,此限制范圍以邏輯單位來表示。例如設備報表的一個電流值讀數是500mA,而一個單位是 2mA,則 Logical Maximum 值等于 250。(其實是用來描述一個字節的上下限) 負數值以 2 的補碼來表示。如果 Logical Minimum 與 Logical Maximum 都是正數,就不需要有正負號位。不管 Logical Minimum 與 Logical Maximum 是以有正負號或是無正負號的數值來表示,設備都可以正確地傳輸數據。數據的接收者必須知道數據是否可以是負值 。
Physical Minimum 和 Physical Maximum 項目
Physical Minimum 和 Physical Maximum 項目定義數值的限制范圍,該限制范圍使用Unit 項目定義的單位來表示 。上例中設備報表的一個電流值讀數是 500mA,單位是 2mA,Logical Maximum 值等于 250,而 Physical Maximum 值是 500。 Logical Minimum 與 Logical Maximum 值說明了設備返回數值的邊界,可以根據Physical Minimum 和 Physical Maximum 值對數據進行偏移和比例變換。
Unit 項目
Unit 項目指定報表數據在使用 Physical 與 Unit Exponent 項目轉換后使用什么度量單位,以及單位的冪指數值。Unit 的數值部分可以長達 4 字節,按照 4 位為一段分段,可以分為 8 個半字節段,由高到低分別為半字節 7、半字節 6、…、半字節 0。每一個半字節對應不同的基本單位,其數值表示單位的指數值,采用 4 位 2 的補碼表示,取值范圍是-8~+7之間。 從半字節 0~6 由下表給出了具體的定義,其中半字節 0 表示測量系統,半字節 7 保留。例如在半字節 0 數值為 1(表示采用線性公制測量系統)的條件下,半字節 1 表示長度(單位為厘米),如果其數值為 1 表示厘米,數值為 2 表示(厘米)2,成為面積單位。半字節3 表示時間(單位為秒),如果其數值為-2,表示(秒)-2。 Unit 單位的定義 雖然表中只是定義了有限的基本單位,但可以通過這些基本單位的組合派生出大多數其它的常用單位。 例如報表使用一個字節傳送一個從-20 到 110 華氏度溫度值,可以定義以下報表描述
項目:
Logical Minimum = -128
Logical Maximum = 127
Physical Minimum = -20
Physical Maximum = 110
Unit Exponent = 0
Unit = 30003h Unit 的半字節 0=3 選擇英制線性測量系統,半字節 4=3 選擇華氏溫度單位。
130(110+20)華氏度的數值范圍線性分布到了 256 和有效數值區域,每一位相當于
0.51 華氏度,這樣就提高了分辨率。 ?
Report Size 和 Report Count 項目
Report Size 項目指定 Input、Output 與 Feature 項目字段的大小,以位為單位。 Report Count 項目指定 Input、Output 與 Feature 項目包含的字段數目。 例如兩個 8 位的字段,Report Size 等于 8,而 Report Count 等于 2。8 個 1 位的字段,Report Size 等于 1,而 Report Count 等于 8。3 Input、Output 與 Feature 項目報表可以有多個項目Size 和 Report Count 項目。
Usage、Usage Minimum 和 Usage Maximum 項目
這 3 個項目輸入 Local 類型項目。 Usage 項目和 Global 類型的 Usage Page 項目協同描述項目或集合的功能。一個報表可以指定一個 Usage 給許多個控制,或是指定不同的 Usage 給每一個控制。如果一個報表項目之前有一個 Usage,此 Usage 應用到該項目的所有控制。如果一個報表項目之前有一個以上的 Usage,每一個 Usage 應用到一個控制,Usage 與控制是按順序結合的。 例如下面報表描述符的一個局部,報表含有 2 個輸入字節,第一個字節的用法是 x,
第 2 個字節是 y。 Report Size (8)
Report Count (2)
Usage (x)
Usage (y)
Input (Data, Variable, Absolute) ?
如果一個報表項目之前有一個以上的 Usage,而且控制的數目多于 Usage 的數目,每一個 Usage 與一個控制對應,最后一個 Usage 則應用到所有剩余的控制。 例如在下面報表包含 16 個字節輸入數據,第一個字節對應用法 x,第 2 個字節對應用法 y,剩余的 14 個字節對應廠商定義的用法。Usage (x)
Usage (y)
Usage (Vendor defined)
Report Size (8)
Report Count (16)
Input (Data, Variable, Absolute) ?
Usage Minimum 和 Usage Maximum 可以指定一個 Usage 給多個控制或是數組項目。將從 Usage Minimum 到 Usgae Maximun 定義的用法順序對應到多個控制中。 例如在一個鍵盤描述符中定義的標準鍵盤的左、右修飾鍵的輸入項目中,使用一個字
節的 8 位分別輸入鍵盤的左、右 Ctrl 鍵、Shift 鍵、Alt 鍵和 GUI 鍵,從 HID Usage tables
文檔中的第 10 節可以查到關于鍵盤用法的定義,其中上述 8 個修飾鍵的用法定義值為 224
到 231。以下是報表描述符的修飾鍵部分描述。 Usage Page (1) ; 1 = Generic Desktop Controls
Usage (6) ; 6 = Keyboard
Collection (1) ; 1 = Application
Usage Page (7) ; 7 = Keyboard/Keypad
Usage Minimum (224)
Usage Maximum (231)
Logical Minimum (0)
Logical Maximum (1)
Report Size (1)
Report Count (8)
Input (Data, Variable, Absolute)
…… 自此,本章結束了,有不懂的一起探討!
總結
以上是生活随笔 為你收集整理的HID报表描述符(目前最全的解析,也是USB最复杂的描述符) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。