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