USBHID設備報告描述符詳解.docx_第1頁
USBHID設備報告描述符詳解.docx_第2頁
USBHID設備報告描述符詳解.docx_第3頁
USBHID設備報告描述符詳解.docx_第4頁
USBHID設備報告描述符詳解.docx_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

轉載自:/273398/viewspace-130320.htmlUSB/HID設備報告描述符詳解USB描述符即USB設備的信息,系統(tǒng)設備列舉所要執(zhí)行的工作之一,即是取得這些有關于設各的相關信息,之后設備才能被系統(tǒng)識別使用。在圖的描述符中,設備描述符(device descriptor)、配置描述符(configurationdescriptor)、接口描述符(interface descriptor)以及端點描述符(endpoint descriptor)是必須具有的。而其他的描述符,如字符串描述符(strtng descriptor)、 數(shù)種不同的群組描述符(class descriptor)以及報告描述符(report descriptor)則可以根據(jù)不同的設備加以添加或刪減。報告描述符是HID用來數(shù)據(jù)傳輸(data transfer),是對這些傳輸?shù)臄?shù)據(jù)作用途(usage)上的說明。USB通訊協(xié)議的規(guī)范是以1ms產(chǎn)生一個USB幀(frame),USB設備可以每一個幀中發(fā)送和接收一個交換(transaction)。交換是由幾個封包(packet)組成,而傳輸是由一個或幾個交換來完成傳送一口中有效的數(shù)據(jù)。在這里,傳輸和報告的意思相類似。傳輸方式有四種,初始學一般只要了解控制型傳輸(control transfer)和中斷型傳輸(interrupt transfer)即可??刂菩蛡鬏斒钱斝枰獣r才執(zhí)行傳輸要求,是最一般的傳輸方式,組態(tài)、命令和狀態(tài)的通訊都可以使用控制型傳輸;控制型傳輸主要用于消 息型數(shù)據(jù)(message-type data)。中斷型傳輸目的在做重復的數(shù)據(jù)更新(recurring data)傳輸,精確一點而言,即是在每個有限有周期內(bounded period)作至少一次的小量數(shù)據(jù)發(fā)送或接收;所以適用于流動型數(shù)據(jù)(stream-type data),注意這里所謂的周期時間就是在端點描述符中的輪詢間隔時間。報告有三種:input,output,和Feature.后面將作進一步介紹。中 斷型輸入管線(interrupt in pipe)僅可以傳送input報告;中斷型輸出管線(interrupt out pipe)僅可以傳送output報告;但是控制型管線(control pipe)可以傳送input,output和feature報告。端點描述符有聲明所使用的端點為何種管線。數(shù)據(jù)本身沒有任何意義,要賦于用途才能明確其為控制什么(control);例如設 備上的按鈕指示燈和X與Y軸的位移等都通稱控制,數(shù)據(jù)則為按鈕和指示燈的開關狀態(tài)或X與Y軸的位移量。為了這個目的應運而生報告描述符,其將數(shù)據(jù)的操控與 它的用途作一對一的對應,所以解讀報告后就可以知道每個數(shù)據(jù)作何種操作。所以“傳輸?shù)臄?shù)據(jù)”和“操作”只是一事件的兩種描述方式。用途是以一個32位卷標 (稱作usage tag)來表示,高16位稱作usage page(用途類頁),低16位稱為usage ID(用途識別名):Usage = (usage page:usage ID)舉例說明:二個字節(jié)分別為x和y軸的位移數(shù)據(jù),因此第一個字節(jié)的usage= (generic desktop:X),而第二個字節(jié)的usage = (generic desktop:Y),其中generic desktop為用途的大類別(稱作用途類頁)之一,x和y軸的操作用途屬于此用途類頁。文件universal serial Bus HID Usage Table完整列出所有的usage pages(用途類頁)和usage ID(用途識別名),使用者必須遵照文件的規(guī)范來聲明操作的用途。該文件的附錄A有十多個報告描述符的范例,值得研究下。表1、報告描述符的標簽主項目全域項目區(qū)域項目標簽代碼標簽代碼標簽代碼InputX08?Usage Page0x0?Usage0x0?Output0x9?Logical Minimum0x1?Usage Minimum0x1?Feature0x0b?Logical Maximum0x2?Usage Maximum0x2?Physical Minimum0x3?Designator Minimum0x3?Collection0xa1Physical Maximum0x4?Designator Minimum0x4?End Collection0xc0Unit Exponent0x5?Designator Maximum0x5?Unit0x6?String0x7?Report Size0x7?Sreing Minimum0x8?Report ID0x8?String Maximum0x9?Report Coumt0x9?Delimiter0xa?Push0xA?Pop0xb?標簽:用途卷標只是報告描述符諸多標簽的一個。表1列出所有的卷標,利用這些卷標取可以清 楚完整的描述符操作的用途。報告描述符的語法不同于USB標準描述符,它是以項目(items)方式排列而成,無一定的長度;項目有一個前輟 (prefix),然后跟著一個括號,內為該項目的數(shù)據(jù):item = prefix(data)。項目分成三種類別:主項目,全局項目,區(qū)域項目。主項目中的input,ouput,feature三個卷標用來表示報告中數(shù)據(jù)的種類,這些是報告描述符中最主要的項目,其他項目都是用來修飾這三種項目。主要項目中其他二個卷標后面再作詳細的介紹。Input 項:表示設備操作輸入到主機的數(shù)據(jù)模式。這個數(shù)據(jù)格式就形成一個輸入報告,雖然輸入報告可以用控制型管線以get report(input)來傳輸,但是通常用中斷型輸入管線來傳輸以確保在每一固定周期內都能將更新的輸入報告?zhèn)鹘o主機。Output 項:表示由主機輸出到裝置操作的數(shù)據(jù)格式。這個數(shù)據(jù)格式就形成一個輸出報告。輸出報告通常不適用輪詢的方式來傳送給設備,而是由應用軟件依實際需求以傳令 方式要求送出輸出報告,所以大多用控制型管線以set report(output)指令來將報告送到設備。當然也可以選擇用中斷型輸出管線來傳送,只是通常不建議這樣用。Feature項:表示由主機送到設備的組態(tài)所需數(shù)據(jù)的數(shù)據(jù)格式。這個數(shù)據(jù)模式就形成一個特征報告。特征報告只能用控制型管線以get report(feature)和set report(feature)指令分別來取得和設定設備的特征值。范 例:考慮一個2X16字的顯示裝置,它的列數(shù)、行數(shù)、字寬、和字高為固定值屬于feature報告;顯示狀態(tài)例如“就緒”和“輸入字錯誤”則屬于 input報告;光標位置和顯示的字需可讀寫,所以屬于另一個feature報告;更新顯示的字則為output報告。為了區(qū)別兩個deatures,要 用到全局項目中的report ID,每個feature報告有一個不同的report ID,因而主機請求指令要加上report ID的值:get report(feature,report ID)和Set report(feature,report ID)。主項目用來定義報告中數(shù)據(jù)的種類和格式,而說明主項目之意義與用途為全局項 目和區(qū)域項目。顧名思義,區(qū)域性項目只能適用于列于其下的第一個主項目,不適用于其他主項目,若一個主項目之上有幾個不同的卷標的區(qū)域性項目,則這些區(qū)域 性項目皆適用于描述該主項目。相反,全局性項目適用于其下方的所有主項目,除非另一個相同卷標的全局性項目出現(xiàn)。為了清楚說明報告描述符,將使用“項目狀 態(tài)表”(item state table)用來表示在某位址處適用的全局性項目的組合。圖1顯示全局性項目和區(qū)域性項目與所描述的主項目之對應關系。區(qū)域性項目卷標:簡單地說,區(qū)域性項目(見表1)只是說明用途而已。Designator是要搭配實體描述符使用的,這里不對實體描述符進行介紹,所以略過這些designator標簽。標簽Usage 實際上應該稱作Usage ID,它搭配全域項目的Usage Page 卷標才形成前文所定義的用途usage但是報告描述符允許在區(qū)域項目的Usage 卷標直接用32位的方式來指定用途,這種方式稱作擴充式用途指定法(extended usage)以示區(qū)別。例如:Usage(Generic Desktop:Mouse),Usage Minimum(Keyboard:0),和Usage Maximum(Keyboard:101)。很明顯的,擴充式用途指定法會取代項目狀態(tài)表中的Usage Page。還有,使用擴充式用途指定法時,數(shù)據(jù)的高16 個位為用途類頁Usage Page,低16 個位則為用途識別名Usage ID。往往一個報告數(shù)據(jù)會對應到幾個操作,因而會有幾個用途,例如101 按鍵的鍵盤利用不同代碼代表不同的鍵,每一個鍵是一個操作,有自己的用途,要將所有Usage ID 列出不太現(xiàn)實,所以就需要Usage Minimum 和Usage Maximum 二個標簽。以鍵盤為例,主項目之上只要二個區(qū)域項目:Usage Minimum (0), Usage Maximum (101)。如此一來,則無鍵按下(Usage ID 為0)和101 鍵中任一鍵被按下(Usage ID 為1 至101)的用途都被賦于到一個報告數(shù)據(jù)上,后面會有一個范例進一步解說。卷標String Index 類似卷標Usage,而卷標String Minimum 和String Maximum 則類似標簽Usage Minimum 和Usage Maximum。如果希望某個操作對應到一個字串,則用String Index 來描述該操控的報告數(shù)據(jù),這個字符串在字符串描述符中,StringIndex (data)項目中的data 是這個字符串在字符串描述符中的位置索引。如果需要用到幾個字符串,則可以使用String Minimum 來指向字符串描述符中被用到字符串的最先位置索引,和String Maximum 來指向最后位置索引。標簽Delimiter 很少用到,請參考Universal Serial Bus HID Usage Tables 文件中Appendix B 的范例詳細說明。全局項目卷標全局項目的卷標事實上只要Usage Page,Logical Minimum,Logical Maximum,Report Size,Report ID,Report Count 就足夠了。表2 列了二個音量操作的例子(音量增減鍵和音量旋鈕)將用來輔助說明這些卷標,不過主項目括號內的數(shù)據(jù)會在后文中再做說明。表2、音量操作舉例音量減鍵音量旋鈕Usage Page(consumer)Usage Page(Consumer)Usage(Volume)Usage(Volume)Logical Minimum(-1)Logical Minimum(0)Logical Maximum(-1)Logical Maximum(100)Report Size(2)Report Size(7)Report Count(1)Report Count(1)Input(Data,Variable,Relative)Input(Data,Variable,Absolute,No Wrap,Linear,No Relative)查閱Universal Serial Bus HID Usage Tables文檔,這兩個例子的用途需要令為(Consumer: Volume)。Usage Page 前面已經(jīng)介紹過了。Report Size 用來設定主項目(Input,Output,F(xiàn)eature)的報告字段大小,它的單位是位。主項目會對每個操作產(chǎn)生一個報告字段,字段大小則由 Report Size 決定。而Report Count 用來設定主項目之報告字段的數(shù)目,其等于操作的數(shù)目。音量增減鍵的例子中ReportCount (1)表示主項目Input 只產(chǎn)生一個字段,所以可知只有一個音量增減鍵而Report Size (2)表示這個字段為2 位。另一個音量旋鈕例子也是只有一個旋鈕,所以用Report Count (1)但是因為Report Size (7),所以該旋鈕的數(shù)據(jù)字段為7位,可以表示0到127之數(shù)值。再舉一例,如果是鼠標的三個按鍵,每個按鍵占用一個一位的字段,則Report Size (1), Report Count (3)那么這個報告長度為三個位,可以同時呈現(xiàn)出三個按鍵的狀態(tài)(原狀或被按下)。Logical Minimum 和Logical Maximum 在說明每個報告字段的數(shù)值范圍,這是純數(shù)值所以稱為邏輯數(shù)值(logical value)。音量增減鍵的例子中Logical Minimum (-1),Logical Maximum (1)表示只會出現(xiàn)-1, 0, 1 三種數(shù)值,所以用到二位(即ReportSize(2)),0b11 代表-1,0b00 代表0,0b01 代表1。在音量旋鈕例子中,雖然用7 位作一字段,但是旋鈕僅會產(chǎn)生0 到100 的數(shù)值,因為Logical Minimum (0)和Logical Maximum (100)。假如實體程序錯誤產(chǎn)生超出邏輯數(shù)值的范圍,則主機將會忽略該數(shù)值,這種數(shù)值稱作null value。當要將同一種報告分成數(shù)個部分,則每一個部分要給予一個識別值,這時就需用到卷標 Report ID,其數(shù)據(jù)值必須從1起算,不可使用0。沒有賦予Report ID 標簽的報告,主機有可能會將其Report ID 視為0,所以Report ID (0)被要求不能使用。這個標簽對控制型管線才有意義,因為它可以在請求報告時指定Report ID的值。對于中斷型管線,其為周期性傳輸報告,所以每次都會將所屬報告?zhèn)魍?,沒有僅傳輸部分之必要,所以Report ID 標簽就無意義。其它的全局項目卷標可分為輔助工具(Push 和Pop)和物理量說明(Physical Minimum,Physical Maximum,Unit Exponent,和Unit)。Push 卷標將項目狀態(tài)表存放到緩存器(stack),而Pop 卷標反過來將緩存器最頂層的項目狀態(tài)表取回來取代目前之狀態(tài)表。這二個標簽對很長的報告描述符才有用處,因為其可以節(jié)省多列一些全局項目。讀者當要使 用到時,參考Universal Serial Bus HIDUsage Tables文件的Appendix A.7 節(jié)中范例則可獲得正確使用方式。不同廠家的鼠標有不同的分辨率,若要讓主機知道鼠標的分辨率,就必須用到物理量的標簽。不使用也不會影響到鼠標的功能,只是使用者無法由主機的驅動程式得知分辨率而已。但是量測裝置(例如溫度計)的應用程序必須知道物理量,則這些標簽就必備了。分辨率r的算法如下 r = (lM-lm)/(PM-Pm)X10iUnit其中l(wèi)m= Logical Minimum,lM= Logical Maximum,pm= Physical Minimum,pM= Physical Maximum,i= Unit Exponent。以400-dpi 的鼠標為例如表3。表3:解析度的范例Logical Minimum(-127)R = (127-(-127)/(3175-(-3175)X10-4= 400counts per inchLogical Minimum(127)Physical Minimum(-3175)Physical Minimum(3175)給定Logical值,計算出physical值:(PM-Pm)/2)/10i=(127-(-127)/400)/2=0.3173|PM|=|Pm|=3175,i=4Unit Exponent(-4)Unit(inch)注意,若是Unit Exponent 未定義,則視為i= 0若是Physical Minimum和Physical Maximum有一個以上未定義,則視為PM=lM和pm=lm。 所以標簽Physical Minimum和Physical Maximum 一定要同時定義,否則無意義。這些卷標的括號內數(shù)字為有符號的整數(shù),可以是一個字節(jié)或二至四個字節(jié),字節(jié)數(shù)目會在卷標代碼的最低二位定義,詳情后文會敘 述。卷標Unit 的括號內數(shù)據(jù)比較復雜,總共用了7 個四位(nibbles)來描述,各個四位之意義如表4,其中第8 個四位未被使用到。表4:標簽Unit的信息格式Nibbe765432100Luminous IntensityCurrentTemperatureTimeMassLengthSystemHID 共享了四種單位系統(tǒng),最低的四位就是決定使用的單位系統(tǒng)(System),不同的系統(tǒng)中當然物理量的單位也不一樣。單位和系統(tǒng)間的對應關系如表5。表5:物理量的單位之編碼法NoneSI LinearSI RotationEnglish LinearEnglish RotationSystem0x00x10x20x30x4LengthNone公分徑度英寸角度MassNone公克公克SlugSlugTimeNone秒秒秒秒TemperatureNone凱氏(絕對溫度)凱氏(絕對溫度)華氏華氏CurrentNone安培安培安培安培Luminous intensityNoneCandelaCandelaCandelaCandela除了最低四位的值用來選擇單位系統(tǒng)外,其余每個四位皆表示該單位的冪次方,每個四位(nibble)都是有符號的整數(shù),可表示的范圍為-8 至+7:-8-7-6-5-4-3-2-10123456708h09h0ah0bh0ch0dh0eh0fh00h01h02h03h04h05h06h07h因此長度的單位若為公分則Unit (data)中data 的碼為0x11,若為英吋則為0x13,這二者中Length 的四位值皆為1 表示幕次方為1,即cm1 或in1 。質量單位為公克之碼為0x0101,加速度單位為公分除以平方秒之碼為0xE011,其中E 代表-2。所以力量單位為質量(公克)乘于加速度(公分/平方秒)的碼為0xE111。能量單位焦爾為力量乘于長度之碼為0xE121,其等義于s?2g cm2 和單位系統(tǒng)為SI Linear。主項目主項目中產(chǎn)生報告數(shù)據(jù)格式的三個卷標(Input,Output,和 Feature)具有共通的數(shù)據(jù)定義,這些數(shù)據(jù)和其代碼列于表6中。目前用到9個位來表示這些數(shù)據(jù)。如果第九位(bit 8)為0,則僅需用一個字節(jié)來表示該數(shù)據(jù),即忽略第九位。如果第九位為1,就需用到二個字節(jié)來表示該數(shù)據(jù)。表6:主項目的信息代碼Bit8765432100Bit FieldNon VolatileNo Null PositionPreferred StateLinearNo WrapAbsoluteArrayData1Buffered BytesVolatileNull StateNo PreferredNon LinearWrapRelativeVariableConstantData/Constant:主項目之數(shù)據(jù)為可變值(設為Data),或為固定不可變值(設為Constant)。Constant 都用于Feature 的報告,或是用于填充位(padding),使報告長度以字節(jié)為單位。Array/Variable:主項目之數(shù)據(jù)的每個字段可以表示幾個不同的操作的其 中一個被觸發(fā)(設為Array),或是每個字段僅表示一個操作(設為Variable)。如果是Variable,則Report Count 的數(shù)據(jù)值等于報告數(shù)據(jù)的字段數(shù)。若是Array,則Report Count 的數(shù)據(jù)值表示可以同時被觸發(fā)的最多操作數(shù)目。后文中鍵盤之例會解說Array 的用法。Absolute/Relative:主項目的數(shù)據(jù)是以相對于固定的基準點方式提供絕對數(shù)值(設為Absolute),或是提供相對于前次報告的相對值(設為Relative)?!痉独f明】前文中的音量操控范例,因為都是Data 和Variable,二者的操作值皆為變化值,且一個字段僅表示一個操作。但是音量增減鍵的例子為Relative,所以若報告值由0 變成+1,則音量增大一個刻度,反之由0 變作-1 則音量減小一個刻度,因而音量大小因輸入值而作相對的變化。然而音量旋鈕的例子為Absolute,當輸入值為最小值0 時,為靜音,而輸入值為最大值100 時,為最大音量,其余值作百分比的音量調整,輸入值和音量成絕對關系。No Wrap/Wrap:主項目的數(shù)據(jù)值達到極值后會轉為極低值,反之亦同,稱作卷繞(設為Wrap)。例如一個轉鈕可以做360旋轉,輸出值從0 至10,若設定為Wrap,則值達10 后,在同方向旋轉則值變?yōu)?,反之若達到0,再轉就得到10。Linear/Nonlinear:主項目的數(shù)據(jù)與操作刻度為線性關系(設為Linear),或為非線性(設為Nonlinear)。Preferred State/No Preferred:主項目對應的操作再不被觸發(fā)時會自動恢復到初始狀態(tài)(設為Preferred State),或是不會恢復原狀(設為No Preferred)。例如鍵盤的按鍵和會自動置中(self-centering)的游戲桿,皆為Preferred State。【范例說明】再以音量操作為例,音量增減鍵的例子都沒標注No Wrap,Linear,Preferred State,但是沒有標注即認定其屬于默認值,所以等同于是這些設定,只是這些設定對此例的操作無意義,所以不標出。音量旋鈕的例子明確指出其為No Wrap, Linear, No Preferred,可見旋鈕不是循環(huán)旋轉,輸出值與旋轉角呈線性關系,旋鈕釋放開時會停留在釋放前位置(因為No Preferred)。No Null Position/Null State:主項目對應的操和有一個狀態(tài),其不會送出有意義的數(shù)據(jù),即數(shù)據(jù)將不在Logical Minimum 和Logical Maximum 之間,這種操控要標注Null State,否則為No Null Position。例如幾個按鍵,而無鍵被按下的用途沒有聲明在Usage 之列,則可以在主項目的數(shù)據(jù)中設Null State,將無鍵被按下的狀態(tài)排除在Logical Minimum 和Logical Maximum區(qū)間之外,進一步請參看Universal Serial Bus HID Usage Tables文件的Appendix A.3 節(jié)中范例。Non Volatile/Volatile:主項目Feature 的數(shù)據(jù)不允許被主機改變(設為Non Volatile),或是允許被主機改變(設為Volatile)。注意主項目Input 和Output,此標注設定無意義,所以bit 7 的代碼必須為0。Bit Field/Buffered Bytes:主項目的數(shù)據(jù)格式要以字節(jié)為單位,不足構成字節(jié)時自動填充成字節(jié)則設Buffered Bytes。最后來談談主項目的其它二個卷標:Collection 和End Collection。以鼠標而言,在實體上是一個指針(pointer),只是應用為計算機鼠標而這個指針含有三個按鍵和二個平移軸X 和Y。所以指針的報告是由不同格式的數(shù)據(jù)所構成,因而需要用到Collection 和End Collection 將幾個Input 項目集結成一組,其用途為指針,再用Collection 和End Collection 將指針括起來說明其應用為鼠標。卷標End Collection 沒有跟隨任何資料。但是卷標Collection 跟隨一個字節(jié)的數(shù)據(jù),例如指針的數(shù)據(jù)名為Physical,而鼠標的為Application。所有Collection的數(shù)據(jù)名稱與代碼如表7:表7:報告集合的名稱與代碼PhysicalApplicationLogicalReportNamed ArraryUsage ModifierUsage SwitchReservedVendor-defined代碼0x000x010x020x030x040x050x060x07-0x7f0x80-0xff用途CPCACLNaryUSUMCollection 的數(shù)據(jù)名稱很難有一個準則來給定,Universal Serial Bus HID Usage Tables文檔 中將各種用途的用途種類(usage type)列出,使用者必須依據(jù)用途種類來指定Collection 的數(shù)據(jù)名稱,例如鼠標,鍵盤和游戲桿的用途種類為CA,所以要用Collection (Application),而指針為CP,所以用Collection (Physical)。編碼報告描述符的項目編碼有二種:短項目和長項目。長項目僅是保留給未來使用,所以不作介紹。短項目的編碼形式如下:Bits 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0datadatabTagbTypebSizeBytes 2 1 0最低字節(jié)分別標注項目大小(bSize),項目類別(bType),和項目卷標(bTag)其中bTag 占4個位,其余二者各占2個位。BSize 用來指出項目的數(shù)據(jù)所需字節(jié)的數(shù)目,該數(shù)目僅可以為0(當bSize=0),1(當bSize=1),2(當bSize=2),和4(當 bSize=3)注意不可以為3個字節(jié)。大部分的卷標僅需一個字節(jié)的數(shù)據(jù)全局項目的卷標Unit 比較特殊有可能最多用到4 個字節(jié)來表示其資料。標簽代碼bTag 已經(jīng)于前章的表1 中描述,例如Input 的標簽代碼0x8?中8 即為bTag 之值再如標簽Feature 之bTag=11,而Unit 之bTag=6。主項目之bType=0,全局項目之bType=1,而區(qū)域項目之bType= 2。所以在前章的表1 中的主項目卷標代碼中的?可以改為00nnB,全局項目的可以改為01nnB,而區(qū)域項目的可以改為10nnB,其中nn 代表bSize。實際范例這里舉一個Device Class Definition for Human Interface Device文 件的附錄E 中的整合鼠標的鍵盤裝置的范例。這個裝置只有一個組態(tài)描述符,但是這個組態(tài)具有二個接口,一個為鍵盤接口(接口編號為0x00),另一個為鼠標接口(接口 編號為0x01)。每一個接口都有一個自己的中斷型輸入端點,輸出則都靠內定的控制型端點0。這個整合鼠標的鍵盤裝置的標準描述符,請參考附件中的 USB 標準描述符之技巧文件。在該文中所使用的范例即為整合鼠標的鍵盤裝置,只是僅列出一個接口描述符(即編號為0x00 的鍵盤接口),另一個編號為0x01 的鼠標接口在該文中沒有列出,讀者可以自行參考本文所附的描述符程序代碼descriptor.asm(即在標記為 interface_descriptor01,hid_descriptor01,和endpoint_descriptor01 處)。表8:范例的輸入報告格式鍵盤(輸入報告)鼠標(輸入報告)Byte76543210Byte765432100Modifier keys0PadButtons1Reserved1X displacement2Keycode 12Y displacement3Keycode 24Keycode 35Keycode 46Keycode 57Keycode 6表9:范例的輸出報告格式鍵盤輸出報告Byte765432100PadLEDs這個范例有輸入報告和輸出報告,其中輸入報告有二組,一組屬于鍵盤接口,另一組屬于 鼠標接口。表8 列出輸入報告的數(shù)據(jù)格式。而輸出報告只有鍵盤接口需要,表9 為輸出報告的數(shù)據(jù)格式。因為有二個接口,所以有二個報告描述符,分屬于不同的界面,二個報告描述元都列于表10 中。鍵盤的報告描述元中整個報告集合的用途為(Generic Desktop: Keyboard),由于鍵盤用途屬于應用性,所以標簽Collection 的資料名為Application。由于單獨鍵本身的用途類頁不再是Generic Destop,而是Keyboard(注意Keyboard 也可為用途類頁),所以在項目Collection(Application)下重新聲明用途頁Usage Page (Keyboard)。根據(jù)Universal Serial Bus HID Usage Tables文 件,鼠標是指針的一種,只是應用為計算機的鼠標,所以報告的內層集合的用途為(Generic Desktop: Pointer),外層的應用性集合的用途為(Generic Desktop: Mouse)。注意鼠標的按鈕和位移軸又分屬不同的用途類頁,所以在內層集合中還要重新聲明用途類頁。按鈕的用途類業(yè)為Buttons,而二個位移軸所屬 的用途類業(yè)為Generic Desktop。表10:報告描述符范例鍵 盤鼠 標項 目編 碼項 目編 碼Usage Page (Generic Desktop),0x0105Usage Page (Generic Desktop),0x0105Usage (Keyboard),0x0609Usage (Mouse),0x0209Collection (Application),0x01A1Collection (Application),0x01A1Usage Page (Keyboard),0x0705Usage (Pointer),0x0109Usage Minimum (224),0xE019Collection (Physical),0x00A1Usage Maximum (231),0xE729Usage Page (Buttons),0x0905Logical Minimum (0),0x0015Usage Minimum (1),0x0119Logical Maximum (1),0x0125Usage Maximum (3),0x0329Report Size (1),0x0175Logical Minimum (0),0x0015Report Count (8),0x0895Logical Maximum (1),0x0125Input (Data, Variable, Absolute),0x0281Report Size (1),0x0175Report Size (8),0x0875Report Count (3),0x0395Report Count (1),0x0195Input (Data, Variable, bsolute),0x0281Input (Constant),0x0181Report Size (5),0x0575Usage Minimum (0),0x0019Report Count (1),0x0195Usage Maximum (101),0x6529Input (Constant),0x0181Logical Minimum (0),0x0015Usage Page (Generic Desktop),0x0105Logical Maximum (101),0x6525Usage (X),0x3009Report Size (8),0x0875Usage (Y),0x3109Report Count (6),0x0695Logical Minimum (-127),0x8115Input (Data, Array),0x0081Logical Maximum (127),0x7F25Usage Page (LEDs),0x0805Report Size (8),0x0875Usage Minimum (1),0x0119Report Count (2),0x0295Usage Maximum (5),0x0529Input (Data, Variable, Relative),0x0681Logical Minimum (0),0x0015End Collection,0xC0Logical Maximum (1),0x0125End Collection0xC0Report Size (1),0x0175Report Count (5),0x0595Output (Data, Variable,Absolute),0x0291Report Size (3),0x0375Report Count (1),0x0195Output (Constant),0x0191End Collection0xC0從表8 看出,鍵盤的輸入報告中最低的8位分別代表鍵盤上的8個修飾鍵(亦即左和右邊的Control 鍵、Shift 鍵、Alt 鍵、和Windows 鍵),平常每位的值為0,當對應的修飾鍵被壓下時則位值為1。鍵盤報告描述符中第一個Input 項目必須聲明這8位的格式。這8個修飾鍵為用途類頁Key Codes 中的第224 個鍵到第231 鍵,所以用Usage Minimum (224)和Usage Maximum (231)來聲明。每一個按鍵的邏輯值不是0 就是1,所以用Logical Minimum(0)和Logical Maximum (1)來聲明。很顯然的,每一個鍵占用一個數(shù)據(jù)位,而共需8個位,因此 ReportSize ( 1),而Report Count (8)。請?zhí)貏e注意,最低位對應到Usage Minimum 的聲明,而最高位所對應的為Usage Maximum 的數(shù)據(jù)內容。這8 個位值是可變的數(shù)據(jù),每一個位是獨立的變量,提供的值不須與前次的值有相對關系??偨Y而言,該8位的主項目必須為Input (Data, Variable, Absolute)。鍵盤的輸入報告中次高的字節(jié)被保留,該字節(jié)的值無意義,也不需更新,所以用 Input (Constant)來填充(padding)。而最高的6 個字節(jié)則是最近同時被壓下的6 個按鍵之代碼。這個鍵盤裝置有101 個鍵,而報告格式的最高的6 個位組中任何一個字節(jié)都可以代表101 個鍵之任一鍵,所以這101 鍵再加上無鍵被壓下狀態(tài)(代碼為0x00)構成一組操作數(shù)組,這個裝置允許同時壓下6個鍵。鍵盤報告描述符中Input (Data, Array)即在聲明這6個字節(jié)的數(shù)據(jù)格式,注意這個數(shù)據(jù)格式的邏輯值聲明和用途代碼聲明具有相同的數(shù)據(jù)值(即0 和101)。鍵盤有一個輸出報告,長度為1個字節(jié),但是只用到最低5個位來代表五個LED 的操控,所以最高的3個位需要用Output (Constant)項目來填充。輸出報告的用途類頁不再是Key Codes,而是Page of LEDs,所以要重新聲明Usage Page,而主項目為Output (Data, Variable, Absolute)。這個項目的數(shù)據(jù)內容如同輸入報告的最低8位所聲明的主項目之

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論