1,報告描述符概述
1.1) 報表描述符
報表描述符和USB的其他描述符是不一樣的,它不是一個簡單的表格,報表描述符是USB所有描述符中最復雜的。報表描述符非常復雜而有彈性,因為它需要處理各種用途的設備。
報表的數據必須以簡潔的格式來儲存,這樣才不會浪費設備內的儲存空間以及數據傳輸時的總線時間。實際上可以這樣理解,報表內容的簡潔,是通過報表描述符全面的、復雜的數據描述實現的。
報表描述符必須先描述數據的大小與內容。報表描述符的內容與大小因設備的不同而不同,在進行報表傳輸之前,主機必須先請求設備的報表描述符,只有得到了報表描述符才可正確解析報表的數據。
報表描述符是報表描述項目(Item)的集合,每一個描述項目都有相對統一的數據結構,項目很多,通過編碼實現。
1.2) 項目(Item)
HID的項目有短項目和長項目兩種。
其中 短項目:項目的第一個字節(項目前綴)由三部分構成,即項目類型(item type)、項目標志(item tag)和項目長度(item size)。
其中項目類型說明項目的數據類型,項目標簽說明項目的功能,項目長度說明項目的數據部分的長度。
短項目的數據字節數由bSize的值定義,bSize為0、1、2、3時Data部分的字節數分別為0、1、2、4個字節。短項目的項目類型由bType定義,bType為0、1、2時分別為Main、Global和Local類型。
長項目:
項目中的第一個字節為上圖中的特定值時表明該項目是一個長項目。長項目中的bDataSize說明Data部分的字節數,bLongItemTag在HID規范中沒有定義。
1.3) 項目(Item) 類型
報表的項目有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項目。
在這些項目中,Usage Page用來指定設備的功能,而Usage項目用來指定個別報表的功能。Usage Page項目相當於是HID的子集合,Usage相當於是Usage Page的子集合。
1.4) 鼠標的報告描述符的實現
Usage Page (Generic Desktop),
Usage (Mouse),
Collection (Application),
Usage (Pointer),
Collection (Physical),
Report Count (3),
Report Size (1),
Usage Page (Buttons),
Usage Minimum (1),
Usage Maximum (3),
Logical Minimum (0),
Logical Maximum (1),
Input (Data, Variable, Absolute),
Report Count (1),
Report Size (5),
Input (Constant),
Report Size (8),
Report Count (2),
Usage Page (Generic Desktop),
Usage (X),
Usage (Y),
Logical Minimum (-127),
Logical Maximum (127),
Input (Data, Variable, Relative),
End Collection,
End Collection
(1)Input、Outpot和Feature項目
這3個項目用來定義報告(Report)中的數據字段。
Input項目可以應用到任何控制、計數器讀數或其他設備傳給主機的信息。一個輸入報告(Report)包含一個或多個Input項目,主機使用中斷輸入傳輸來請求輸入報告(Report)。
Ouput項目用來定義主機傳送給設備的信息。一個輸出報告(Report)包含一個或多個Outpot項目。輸出報告(Report)包含控制狀態的數據。如果有中斷輸出管道,HID1.1兼容主機使用中斷輸出傳輸來傳送輸出報告(Report),否則使用Set_Report控制請求。
Feature項目應用到主機傳送給設備的信息,或是主機從設備讀取Feature項目。一個特征報告(Report)包含一個或多個Feature項目,Feature項目通常是包合影響設備與其組件整體行為的配置。特征報告(Report)通常是控制可以使用實際的控制面板調整的設置,例如主機可以使用虛擬控制面板來讓用戶選擇控制特征。主機使用Set_Report與Get_Report請求來傳送與接收特征報告(Report)。
在每一個Input、Output和Feature項目的前綴字之后是32位描述數據,目前最多定義了9個位,余的位則是保留。位0~8的定義中只有位7不能應用於Input項目,除此之外其他的位定義都適應於Input、Output和Feature項目。
注:①:該位不能應用到數組。
②:只應用於Output和Feature項目,對於Input項目該位保留。
(2)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。在設備報告多個傳感器的位置的時候,使用Physical Collection指明不同的數據來自不同的傳感器。
Logical Collection形成一個數據結構,包含由Collection所連結的不同類型的項目。例如數據緩沖區的內容以及緩沖區內字節數目的計數。
(3)Usage Page和Usage項目
Usage page項目的數據部分為1~2個字節,目前的定義全部都是一個字節。Usage Page定義了常用的設備功能,關於Usage Page(以及其他項目)的具體定義內容,可以查閱HID Usage tables(http://www.usb.org/developers/hidpage/#Class_Definition),下表是來自HID Usage tables的Usage Page定義。
關於Usage Page的每一個有效定義項,都有一個相應的下一級定義,如Usage Page的數據項數值為1,則設備定義為Generic Desktop Controls,關於該類設備的具體功能可以在HID Usage Tables中查到具體的定義。下表是HID Usage Tables中對Generic Desktop Controls設備的功能定義。
(4)Report ID項目
Report ID放在信息包中報表數據之前,設備可以支持多個相同類型的報表,每一個報表包含不同的數據與其特有的ID。
在報表描述符中,Report ID項目作用於其后續所有的項目,直到遇到下一個Report ID為止。如果報表描述符中沒有Report ID項目,默認的ID值是0,描述符不能定義一個為0的Report ID,輸入報表、輸出報表與特征報表可以分享同一個Report ID。
在Set_Report和Get_Report請求傳輸中,主機在設置事務的wValue字段的低字節中指定一個Report ID。在中斷傳輸中如果接口支持一個以上的Report ID,Report ID必須是傳送報表中的第一個字節。如果接口只支持數值為0的默認Report ID,此Report ID不應該在中斷傳輸中隨着報表一起傳送。
(5)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。
Input、Output與Feature項目報表可以有多個項目,每一個項目可以有自己的Report Size和Report Count項目。
(6)Logical Minimum和Logical Maximum項目
Logical Minimum與Logical Maximum項目定義報表的變量(Variable)或陣列(Array)數據的限制范圍,此限制范圍以邏輯單位來表示。例如設備報表的一個電流值讀數是500mA,而一個單位是2mA,則Logical Maximum值等於250。
負數值以2的補碼來表示。如果Logical Minimum與Logical Maximum都是正數,就不需要有正負號位。不管Logical Minimum與Logical Maximum是以有正負號或是無正負號的數值來表示,設備都可以正確地傳輸數據。數據的接收者必須知道數據是否可以是負值。
(7)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值對數據進行偏移和比例變換。
(8)Usage、Usage Minimum和Usage Maximum項目
這3個項目輸入Local類型項目。
Usage項目和Global類型的Usage Page項目協同描述項目或集合的功能。一個報表可以指定一個Usage給許多個控制,或是指定不同的Usage給每一個控制。如果一個報表項目之前有一個Usage,此Usage應用到該項目的所有控制。如果一個報表項目之前有一個以上的Usage,每一個Usage應用到一個控制,Usage與控制是按順序結合的。
例如下面報表描述符的一個局部,報表含有2個輸入字節,第一個字節的用法是x,第2個字節是y。
如果一個報表項目之前有一個以上的Usage,而且控制的數目多於Usage的數目,每一個Usage與一個控制對應,最后一個Usage則應用到所有剩余的控制。例如在下面報表包含16個字節輸入數據,第一個字節對應用法x,第2個字節對應用法y,剩余的14個字節對應廠商定義的用法。
Usage Minimum和Usage Maximum可以指定一個Usage給多個控制或是數組項目。將從Usage Minimum到Usgae Maximun定義的用法順序對應到多個控制中。例如在一個鍵盤描述符中定義的標准鍵盤的左、右修飾鍵的輸入項目中,使用一個字節的8位分別輸入鍵盤的左、右Ctrl鍵、Shift鍵、Alt鍵和GUI鍵,從HID Usage tables文檔中的第10節可以查到關於鍵盤用法的定義,其中上述8個修飾鍵的用法定義值為224到231。以下是報表描述符的修飾鍵部分描述。