USB之人性化介面裝置的報告描述元(2)
作者: 林錫寬
e-mail: u.edu.tw
(原文刊於e科技雜誌vol. 31,2003年7月號)
上期的第一篇文章提到報告描述元的語法是以項目方式排列而成,無一定的長度﹔項目有一個前稱,然後跟著一個括號,內為該項目的資料,即item = prefix (data)。項目又分三種型別:主項目,全域項目,區域項目。第一篇已經介紹了區域項目,本篇將繼續介紹主項目和全域項目。下期的第三篇文章將以一個實際例子來介紹使用方法。閱讀本篇時,請隨時參考第一篇的表1。
全域項目標籤
全域項目的標籤事實上只要Usage Page,Logical Minimum,Logical Maximum,Report Size,Report ID,Report Count就足夠了。表2列了二個音量操控例(音量增減鍵和音量旋鈕)將用來輔助說明這些標籤,不過主項目括號內的資料會在後文中再做說明。
表2  音量操控例
音量增減鍵音量旋鈕
Usage Page (Consumer) Usage (V olume)
Logical Minimum (-1) Logical Maximum (1) Report Size (2)
Report Count (1)
Input (Data, Variable, Relative) Usage Page (Consumer)
Usage (V olume)
Logical Minimum (0)
Logical Maximum (100)
Report Size (7)
Report Count (1)
Input (Data, Variable, Absolute, No Wrap, Linear, No Preferred)
查閱Universal Serial Bus HID Usage Tables文件,這兩個例子的用途需要令為(Consumer: V olume)。Usage Page已經介紹過了。Report Size用來設定主項目(Input,Output,Feature)的報告欄位大小,它的單位是位元。主項目會對每個操控產生一個報告欄位,欄位大小則由Report Size決定。而Report Count用來設定主項目之報告欄位的數目,其等於操控的數目。音量增減鍵的例子中Report Count (1)表示主項目Input只產生一個欄位,所以可知只有一個音量增減鍵﹔而
Report Size (2)表示這個欄位為2位元。另一個音量旋鈕例子也是只有一個旋鈕,所以用Report Count (1)﹔但是因為Report Size (7),所以該旋鈕的數據欄位為7位元,可以表示0到127之數值。再舉一例,如果是滑鼠的三個按鍵,每個按鍵佔用一個一位元的欄位,則Report Size (1), Report Count (3)﹔那麼這個報告長度為三個位元,可以同時呈現出三個按鍵的狀態(原狀或被按下)。
Logical Minimum 和Logical Maximum 在說明每個報告欄位的數值範圍,這是純數值所以稱為邏輯數值(logical value)。音量增減鍵的例子中Logical Minimum (-1), Logical Maximum (1)表示只會出現-1, 0, 1三種數值,所以用到二位元(即Report Size(2)),0b11代表-1,0b00代表0,0b01代表1。在音量旋鈕例子中,雖然用7位元作一欄位,但是旋鈕僅會產生0到100的數值,因為Logical Minimum (0)和Logical Maximum (100)。假如韌體程式錯誤產生超出邏輯數值的範圍,則主機將會忽略該數值,這種數值稱作null value 。
當要將同一種報告分成數個部分,則每一個部分要給予一個識別值,這時就需用到標籤Report ID ,其資料值必須從1起算,不可使用0。沒有賦予Report ID 標籤的報告,主機有可能會將其Report ID 視為0,所以Report ID (0)被要求不能使用。這個標籤對控制型管線才有意義,因為它可以在請求報告時指定Report ID 的值。對於中斷型管線,其為週期性傳輸報告,所以每次都會將所屬報告傳完,沒有僅傳輸部分之必要,所以Report ID 標籤就無意義。
其他的全域項目標籤可分為輔助工具(Push 和Pop )和物理量說明(Physical Minimum ,Physical Maximum ,Unit Exponent ,和Unit )。Push 標籤將『項目狀態表』存放到暫存器(stack),而Pop 標籤反過來將暫存器最頂層的『項目狀態表』取回來取代目前之狀態表。這二個標籤對很長的報告描述元才有用處,因為其可以節省多列一些全域項目。讀者當要使用到時,再去參考Universal Serial Bus HID Usage Tables 文件的Appendix A.7節中範例則可獲得正確使用方式。
不同廠牌的滑鼠有不同的解析度,若要讓主機知道滑鼠的解析度,就必須用到物理量的標籤。不使用也不會影響到滑鼠的功能,只是使用者無法由主機的驅動程式得知解析度而已。但是量測裝置(例如溫度計)的應用程式必須知道物理量,則這些標籤就必備了。解析度r 的算法如下
i m
M m M p p l l r 10×−−=Unit 其中=m l Logical Minimum ,=M l Logical Maximum ,=m p Physical Min
imum ,=M p Physical Maximum ,=i Unit Exponent 。以400-dpi 的滑鼠為例如表3。
注意,若是Unit Exponent未定義,則視為=
i0﹔若是Physical Minimum和Physical Maximum有一個以上未定義,則視為P M=l M和p m=l m。所以標籤Physical Minimum 和Physical Maximum一定要同時定義,否則無意義。這些標籤的括號內數字為有符號的整數,可以是一個位元組或二至四個位元組,位元組數目會在標籤代碼的最低二位元定義,詳情後文會敘述。標籤Unit的括號內資料比較複雜,總共用了7個四位元(nibbles)來描述,各個四位元之意義如表4,其中第8個四位元未被使用到。
表4  標籤Unit的資料格式
nibble 7    6    5    4    3    2    1 0
0 Luminous
Intensity
Current Temperature Time Mass Length System
HID共用了四種單位系統,最低的四位元就是決定使用的單位系統(System),不同的系統中當然物理量的單位也不一樣。單位和系統間的對應關係如表5。
表5物理量的單位之編碼法
None SI Linear SI Rotation English
Linear English Rotation
System
0x0
0x1 0x2 0x3
0x4 Length None
公分徑度英吋角度
Mass None
公克公克slug Slug Time None
秒秒秒秒Temperature None 凱氏(絕對溫度)凱氏(絕對溫度)華氏華氏
Current None
安培安培安培安培
Luminous intensity None
Candela Candela Candela
Candela
除了最低四位元的值用來選擇單位系統外,其餘每個四位元皆表示該單位的冪次
方,每個四位元(nibble)都是有符號的整數,可表示的範圍為-8至+7:
-8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 08h 09h 0Ah 0Bh 0Ch 0Dh 0Eh 0Fh 00h 01h 02h 03h 04h 05h 06h 07h
因此長度的單位若為公分則Unit (data)中data 的碼為0x11,若為英吋則為0x13,這二者中Length 的四位元值皆為1表示幕次方為1,即1cm 或1in 。質量單位為公克之碼為0x0101,加速度單位為公分除以平方秒之碼為0xE011,其中E 代表-2。所以力量單位為質量(公克)乘於加速度(公分/平方秒)的碼為0xE111。能量單位焦爾為力量乘於長度之碼為0xE121,其等義於22cm  g s −和單位系統為SI Linear 。
主項目
主項目中產生報告數據格式的三個標籤(Input ,Output ,和Feature )具有共通的資料定義,這些資料和其代碼列於表6中。目前用到9個位元來表示這些資料。如果第九位元(bit 8)為0,則僅需用一個位元組來表示該資料,即忽略第九位元。如果第九位元為1,就需用到二個位元組來表示該資料。
表6 主項目的資料代碼
Bit 8 7    6    5    4    3    2    1 0
0 Bit Field Non V olatile No Null Position Preferred State Linear No Wrap
Absolute Array Data
absolute relative
1 Buffered Bytes V olatile Null State No Preferred Non Linear
Wrap Relative Variable Constant
Data/Constant :主項目之數據為可變之值(設為Data ),或為固定不可變之值(設
為Constant)。Constant 都用於Feature 的報告,或是用於填充位元
(padding),使報告長度以位元組為單位。
Array/Variable :主項目之數據的每個欄位可以表示數個不同的操控的其中一個被
觸動(設為Array ),或是每個欄位僅表示一個操控(設為Variable )。如果是Variable ,則Report Count 之資料值等於報告數據的欄位數。若是Array ,則Report Count 之資料值表示可以同時被觸動的最多操控數目。後文中鍵盤之例會解說Array 的用法。
Absolute/Relative :主項目之數據是以相對於固定的基準點方式提供絕對數值
(設為Absolute ),或是提供相對於前次報告的相對值(設為Relative )。
【範例說明】前文中的音量操控範例,因為都是Data 和Variable ,二者的操控值皆為變化值,且一個欄位僅表示一個操控。但是音量增減鍵之例為Relative ,所以若報告值由0變成+1,則音量增大一個刻度,反之由0變作-1則音量減小一
個刻度,因而音量大小因輸入值而作相對的變化。然而音量旋鈕之例為Absolute,當輸入值為最小值0時,為靜音,而輸入值為最大值100時,為最大音量,其餘值作百分比的音量調整,輸入值和音量成絕對關係。
No Wrap/Wrap:主項目之數據之值達到極值後會轉為極低值,反之亦同,稱作捲繞(設為Wrap)。例如一個轉鈕可以做360°旋轉,輸出值從0至10,若設定為Wrap,則值達10後,在同方向旋轉則值變為0,反之若達到0,再轉就得到10。
Linear/Nonlinear:主項目之數據與操控刻度為線性關係(設為Linear),或為非線性(設為Nonlinear)。
Preferred State/No Preferred:主項目對應之操控再不被觸動時會自動恢復到初始狀態(設為Preferred State),或是不會恢復原狀(設為No Preferred)。例如鍵盤的按鍵和會自動置中(self-centering)的搖桿,皆為Preferred State。
【範例說明】再以音量操控為例,音量增減鍵之例都沒標註No Wrap,Linear,Preferred State,但是沒有標註即認定其屬於預設值,所以等同於是這些設定,只是這些設定對此例之操控無意義,所以不標出。音量旋鈕之例明確指出其為No Wrap, Linear, No Preferred,可見旋鈕不是循環旋轉,輸出值與旋轉角呈線性關係,旋鈕釋放開時會停留在釋放前位置(因為No Preferred)。
No Null Position/Null State:主項目對應之操控有一個狀態,其不會送出有意義的數據,即數據將不在Logical Minimum和Logical Maximum之間,這種操控要標註Null State,否則為No Null Position。例如數個按鍵,而無鍵被按下之用途沒有宣告在Usage之列,則可以在主項目的資料中設Null
State,將無鍵被按下的狀態排除在Logical Minimum和Logical Maximum 區間之外,請進一步參看Universal Serial Bus HID Usage Tables文件的
Appendix A.3節中範例。
Non V olatile/V olatile:主項目Feature的數據不予許被主機改變(設為Non V olatile),或是予許被主機改變(設為V olatile)。注意主項目Input和
Output,此標註設定無意義,所以bit 7的代碼必須為0。
Bit Field/Buffered Bytes:主項目之數據格式要以位元組為單位,不足構成位元組時自動填充成位元組
則設Buffered Bytes。
最後來談主項目的其他二個標籤:Collection和End Collection。以滑鼠而言,在實體上是一個指向器(pointer),只是應用為電腦滑鼠﹔而這個指向器含有三個按鍵和二個平移軸X和Y。所以指向器的報告是由不同格式的數據所構成,因而需要用到Collection和End Collection將數個Input項目集結成一組,其用途為指向器,再用Collection和End Collection將指向器括起來說明其應用為滑鼠。
標籤End Collection沒有跟隨任何資料。但是標籤Collection跟隨一個位元組的