日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HID类

發(fā)布時間:2023/12/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HID类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 簡述

? ? ? ? USB HID類是USB設(shè)備的一個標(biāo)準(zhǔn)設(shè)備類,包括的設(shè)備非常多。HID類設(shè)備定義它屬于人機交互操作的設(shè)備,用于控制計算機操作的一些方面,如USB鼠標(biāo)、USB鍵盤、USB游戲操縱桿等。但HID設(shè)備類不一定要有人機接口,只要符合HID類別規(guī)范的設(shè)備都是HID設(shè)備。

   USB HID設(shè)備的一個好處就是操作系統(tǒng)自帶了HID類的驅(qū)動程序,而用戶無需去開發(fā)驅(qū)動程序,只要使用API系統(tǒng)調(diào)用即可完成通信。

官方的資料下載詳見:

http://www.usb.org/developers/hidpage

其中包含最主要的兩個說明:

1. 《Device Class Definition for human interface device (HID)》

2. 《Universal Serial Bus HID Usage Tables》

其中的 1 文檔中描述了 HID 的基本組成和格式,2 文檔中是對文檔 1 的補充,將各種不同的 HID 設(shè)備的基本組成列舉出來。

?

2. HID 協(xié)議

在上一章介紹基本的 USB 協(xié)議的基礎(chǔ)之上,本章針對 HID 的人機交互的類進行著重介紹。(默認(rèn)有 USB 通信基本協(xié)議基礎(chǔ))

?

2.1?USB HID設(shè)備類的通信管道

所有的HID設(shè)備通過USB的控制管道(默認(rèn)管道,即端點0)和中斷管道(端點1或端點2)與主機進行通信。

  管道        要求      說明

  控制(端點0)    必須      傳輸USB描述符、類請求代碼以及供查詢的消息數(shù)據(jù)

  中斷輸入      必須      傳輸從設(shè)備到主機的輸入數(shù)據(jù)

  中斷輸出      可選      傳輸從主機到設(shè)備的輸出數(shù)據(jù)

注:USB主機為PC,USB設(shè)備如鼠標(biāo)等。中斷端點的描述中,指定了主機輪詢的時間 Interval。即,主機會隔一段時間來“要”數(shù)據(jù)。

控制管道主要用于下面3個方面

  • 接收/響應(yīng)USB主機的控制請求以及相關(guān)的類數(shù)據(jù)
  • 在USB主機查詢時傳輸數(shù)據(jù)(如響應(yīng)Get_Report請求等)
  • 接收USB主機的數(shù)據(jù)

中斷管道主要用于下面兩個方面

  • USB主機接收USB設(shè)備的異步傳輸數(shù)據(jù)
  • USB主機發(fā)送有實時性要求的數(shù)據(jù)給USB設(shè)備

從USB主機到USB設(shè)備的中斷輸出數(shù)據(jù)傳輸是可選的,當(dāng)不支持中斷輸出數(shù)據(jù)時,USB主機通過控制管道將數(shù)據(jù)傳輸給USB設(shè)備。

?

2.2?與 USB HID 設(shè)備有關(guān)的描述符

HID設(shè)備的描述符除了5個USB的標(biāo)準(zhǔn)描述符(設(shè)備描述符、配置描述符、接口描述符、端點描述符、字符串描述符)外,還包括三個HID設(shè)備類特定的描述符:HID描述符、報告描述符(Report)、實體描述符(Physical)。

他們之間的層次關(guān)系如圖:

可以看到,在 Interface desc 層,就對 HID desc 有指定。

除了HID的三個特定描述符組成對HID設(shè)備的解釋外,5個標(biāo)準(zhǔn)描述符中與HID設(shè)備有關(guān)的部分有:

  • 設(shè)備描述符中:bDeviceClass, bDeviceSubClass, bDeviceProtocol三個值必須為 0
  • 接口描述符中:bInterfaceClass 的值必須是 0x03, bInterfaceSubClass 的值為 0 或 1, 為1表示HID設(shè)備是一個啟動設(shè)備(BootDevice, 一般對PC機有意義,意思是BIOS啟動時能識別您使用的HID設(shè)備,切只有標(biāo)準(zhǔn)鼠標(biāo)或者鍵盤才能稱為BootDevice),為0表示HID設(shè)備是操作系統(tǒng)啟動厚才能識別使用的設(shè)備。bInterfaceProtocol?的取值含義如下:
  • 設(shè)備描述符中
    bDeviceClass0
    bDeviceSubClass0
    bDeviceProtocol0
    接口描述符中
    bInterfaceClass?0x03
    bInterfaceSubClass?

    0 — No Sub Class

    1 — Boot Interface?SubClass

    2~255? Reserved

    bInterfaceProtocol

    0 —?NONE

    1 — Keyboard(鍵盤)

    2 —?Mouse (鼠標(biāo))

    3~255? Reserved

    ?

    2.2.1??HID 描述符

      HID描述符關(guān)聯(lián)于接口描述符,因而如果一個設(shè)備只有一個接口描述符,則無論它有幾個端點描述符,HID設(shè)備只有一個HID描述符。HID設(shè)備描述符主要描述HID規(guī)范的版本號, HID通信所使用的額外描述符, 報表描述符的長度等。下表為HID描述符的結(jié)構(gòu)。

    HID 描述符
    偏移量大小(Byte)描述
    0bLength1數(shù)字此描述符的長度,以字節(jié)為單位
    1bDescriptorType1常量描述符種類(此處 0x21為HID類)
    2bcdHID2數(shù)字HID規(guī)范版本號(BCD碼),采用4個16進制的BCD格式編碼
    4bCountryCode1數(shù)字硬件目的國家的識別碼
    5bNumDescriptors1數(shù)字支持的附屬描述符數(shù)目
    6bDescriptorType1常量HID相關(guān)描述符的類型,見下表
    7wDescriptorLength2數(shù)字報告描述符的總長度
    9bDescriptorType1常量用于識別描述符類型的常量,使用有一個以上描述符的設(shè)備
    10wDescriptorLength2數(shù)字描述符總長度,使用在有一個以上描述符的設(shè)備?
    HID相關(guān)描述符類型定義 描述符類型值

    HID相關(guān)描述符類型

    0x21

    HID描述符

    0x22報表描述符
    0x23實體描述符

    在 USB 標(biāo)準(zhǔn)請求里,當(dāng)使用了獲取配置描述符的時候,會按照下面的順序進行返回,即 HID 描述符也會被返回。

    HID描述符里又包含了其附屬的描述符的類型和長度(如報告描述符),然后主機再根據(jù)HID描述符的信息請求其相關(guān)的描述符。也就是說,主機通過獲取描述符,就知道該設(shè)備是一個 HID 設(shè)備。

    典型的,在一個請求配置描述符,并獲取全部描述符的流程中,選擇 “Class 0x01”:

    其中 Request 的 value 為上述內(nèi)容。

    ?

    2.2.2? 報告(Report)描述符

    報告描述符是 USB 的所有描述里面最復(fù)雜的一個,因為他和其他的不一樣,沒有固定的長度和表。是一個可變而且變化比較多樣的一類描述符。

    報告描述符,其實就是告訴主機,通過中斷端點傳輸?shù)臄?shù)據(jù),哪些位或者哪些 Bytes ,代表著什么含義。這樣講,可能會比較抽象,但是看完后面的描述后,在回頭看來,會覺得比較清晰。

    要了解報告描述符,需要兩份 USB 官方的 HID 資料:

    《Device Class Definition for human interface device (HID)》

    《Universal Serial Bus HID Usage Tables》

    一份是說明 HID 的描述符的協(xié)議,另一個說明 HID 的報表描述符的內(nèi)容定義。

    ?

    報表描述符由一個一個的 Item 構(gòu)成,Item 分為了兩種,格式分別如下:

    1. Short?Item

    ?

    2. Long Item

    上述中,這里主要講述 Short Item,用得最多的是 Short Item

    在 Short Item 中,起始的 1 Byte 代表了這個 Item 的用途:

    bSize? :代表后面的數(shù)據(jù),最大 4 bytes。

    bType? :代表了這個 Item 是什么類型的 Item,這里有三種大的類型:Main(0x00)、Global(0x01)、Local(0x02)。

    bTag? ? :代表在對應(yīng)的 Item 下的更加細(xì)的分類。

    ? ? | —— Main? ? ? 分為:Input、Output、Feature、Collection、End Collection。

    ? ? | —— Global? ? 分為:Usage Page、 Logical Minimum、Logical Maximum、等等。

    ? ? | —— Local? ? ?分為 :Usage 、Usage?Minimum、Usage?Maximum、String 等等。

    ?

    對于?bSize +?bType +?bTag 的 1 Byte 的組合詳見下表:

    表中列出了所有的配合,其中的 “?” 代表了低 4 bits 的值,打個比方,一個 Short Item:

    0x05(Prefix), 0x01(Data), // USAGE_PAGE (Generic Desktop)

    其中,0x05表示前綴,0x01為數(shù)據(jù)部分。

    0x05 =》00000101?可以分解出:bSize = 1;bType = 1(Global);bTag = 0(Usage Page)

    上述解讀,來自?《Device Class Definition for human interface device (HID)》 文件,后面跟的那個 0x01 是帶的 1 Byte 的數(shù)據(jù),這個數(shù)據(jù)的具體含義,需要查找 :《Universal Serial Bus HID Usage Tables》?中,可以找到,含義是:Generic Desktop。

    即,根據(jù)【bSize +?bType +?bTag】的信息知道 Tag 的具體含義,在結(jié)合 Table 表和具體的 Tag,查找后面跟的數(shù)據(jù)對應(yīng)的含義,這樣,達到解讀報告描述符的目的。

    下面來分析一下幾個重要的 Tag 的作用和含義。

    ?

    Main

    ? ? |—— Input :表示設(shè)備操作輸入到主機的數(shù)據(jù)模式。這個數(shù)據(jù)格式就形成一個輸入報告,雖然輸入報告可以用控制型管線以get report(input)來傳輸,但是通常用中斷型輸入管線來傳輸以確保在每一固定周期內(nèi)都能將更新的輸入報告?zhèn)鹘o主機。

    ? ? |——?Output :?表示由主機輸出到裝置操作的數(shù)據(jù)格式。這個數(shù)據(jù)格式就形成一個輸出報告。輸出報告通常不適用輪詢的方式來傳送給設(shè)備,而是由應(yīng)用軟件依實際需求以傳令方式要求送出輸出報告,所以大多用控制型管線以set report(output)指令來將報告送到設(shè)備。當(dāng)然也可以選擇用中斷型輸出管線來傳送,只是通常不建議這樣用。

    ? ? |——?Feature :?表示由主機送到設(shè)備的組態(tài)所需數(shù)據(jù)的數(shù)據(jù)格式。這個數(shù)據(jù)模式就形成一個特征報告。特征報告只能用控制型管線以get report(feature)和set report(feature)指令分別來取得和設(shè)定設(shè)備的特征值。

    Main (后面帶的數(shù)據(jù)格式以及含義)中產(chǎn)生報告數(shù)據(jù)格式的三個卷標(biāo)(Input,Output,和Feature)具有共通的數(shù)據(jù)定義,這些數(shù)據(jù):

    Bit

    8

    7

    6

    5

    4

    3

    2

    1

    0

    0

    Bit Field

    Non Volatile

    No Null Position

    Preferred State

    Linear

    No Wrap

    Absolute

    Array

    Data

    1

    Buffered Bytes

    Volatile

    Null State

    No Preferred

    Non Linear

    Wrap

    Relative

    Variable

    Constant

    Data/Constant:主項目之?dāng)?shù)據(jù)為可變值(設(shè)為Data),或為固定不可變值(設(shè)為Constant)。Constant 都用于Feature 的報告,或是用于填充位(padding),使報告長度以字節(jié)為單位。

    Array/Variable:主項目之?dāng)?shù)據(jù)的每個字段可以表示幾個不同的操作的其中一個被觸發(fā)(設(shè)為Array),或是每個字段僅表示一個操作(設(shè)為Variable)。如果是Variable,則Report Count 的數(shù)據(jù)值等于報告數(shù)據(jù)的字段數(shù)。若是Array,則Report Count 的數(shù)據(jù)值表示可以同時被觸發(fā)的最多操作數(shù)目。

    Absolute/Relative:主項目的數(shù)據(jù)是以相對于固定的基準(zhǔn)點方式提供絕對數(shù)值(設(shè)為Absolute),或是提供相對于前次報告的相對值(設(shè)為Relative)。

    No Wrap/Wrap:主項目的數(shù)據(jù)值達到極值后會轉(zhuǎn)為極低值,反之亦同,稱作卷繞(設(shè)為Wrap)。例如一個轉(zhuǎn)鈕可以做360°旋轉(zhuǎn),輸出值從0 至10,若設(shè)定為Wrap,則值達10 后,在同方向旋轉(zhuǎn)則值變?yōu)?,反之若達到0,再轉(zhuǎn)就得到10。

    Linear/Nonlinear:主項目的數(shù)據(jù)與操作刻度為線性關(guān)系(設(shè)為Linear),或為非線性(設(shè)為Nonlinear)。

    Preferred State/No Preferred:主項目對應(yīng)的操作再不被觸發(fā)時會自動恢復(fù)到初始狀態(tài)(設(shè)為Preferred State),或是不會恢復(fù)原狀(設(shè)為No Preferred)。例如鍵盤的按鍵和會自動置中(self-centering)的游戲桿,皆為Preferred State。

    No Null Position/Null State:主項目對應(yīng)的操和有一個狀態(tài),其不會送出有意義的數(shù)據(jù),即數(shù)據(jù)將不在Logical Minimum 和Logical Maximum 之間,這種操控要標(biāo)注Null State,否則為No Null Position。例如幾個按鍵,而無鍵被按下的用途沒有聲明在Usage 之列,則可以在主項目的數(shù)據(jù)中設(shè)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ù)不允許被主機改變(設(shè)為Non Volatile),或是允許被主機改變(設(shè)為Volatile)。注意主項目Input 和Output,此標(biāo)注設(shè)定無意義,所以bit 7 的代碼必須為0。

    Bit Field/Buffered Bytes:主項目的數(shù)據(jù)格式要以字節(jié)為單位,不足構(gòu)成字節(jié)時自動填充成字節(jié)則設(shè)Buffered Bytes。

    ?

    Collection 和 End Collection。以鼠標(biāo)而言,在實體上是一個指針(pointer),只是應(yīng)用為計算機鼠標(biāo)﹔而這個指針含有三個按鍵和二個平移軸X 和Y。所以指針的報告是由不同格式的數(shù)據(jù)所構(gòu)成,因而需要用到Collection 和End Collection 將幾個Input 項目集結(jié)成一組,其用途為指針,再用Collection 和End Collection 將指針括起來說明其應(yīng)用為鼠標(biāo)。卷標(biāo)End Collection 沒有跟隨任何資料。但是卷標(biāo)Collection 跟隨一個字節(jié)的數(shù)據(jù),例如指針的數(shù)據(jù)名為Physical,而鼠標(biāo)的為Application。所有Collection的數(shù)據(jù)名稱與代碼如表:

    ?

    Physical

    Application

    Logical

    Report

    Named Arrary

    Usage Modifier

    Usage Switch

    Reserved

    Vendor-defined

    代碼

    0x00

    0x01

    0x02

    0x03

    0x04

    0x05

    0x06

    0x07-0x7f

    0x80-0xff

    用途

    CP

    CA

    CL

    ?

    Nary

    US

    UM

    ?

    ?

    Collection 的數(shù)據(jù)名稱很難有一個準(zhǔn)則來給定,Universal Serial Bus HID Usage Tables文檔中將各種用途的用途種類(usage type)列出,使用者必須依據(jù)用途種類來指定Collection 的數(shù)據(jù)名稱,例如鼠標(biāo),鍵盤和游戲桿的用途種類為CA,所以要用Collection (Application),而指針為CP,所以用Collection (Physical)。

    ?

    ?

    Local

    Designator是要搭配實體描述符使用的,這里不對實體描述符進行介紹,所以略過這些designator標(biāo)簽。

    標(biāo)簽 Usage 實際上應(yīng)該稱作Usage ID,它搭配 Global 的 Usage Page 卷標(biāo)才形成前文所定義的用途 {usage}。

    但是報告描述符允許在區(qū)域項目的 Usage 卷標(biāo)直接用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ù)會對應(yīng)到幾個操作,因而會有幾個用途,例如101 按鍵的鍵盤利用不同代碼代表不同的鍵,每一個鍵是一個操作,有自己的用途,要將所有 Usage ID 列出不太現(xiàn)實,所以就需要Usage Minimum 和Usage Maximum 二個標(biāo)簽。以鍵盤為例,主項目之上只要二個區(qū)域項目:Usage Minimum (0), Usage Maximum (101)。如此一來,則無鍵按下(Usage ID 為0)和101 鍵中任一鍵被按下(Usage ID 為1 至101)的用途都被賦于到一個報告數(shù)據(jù)上。

    卷標(biāo)String Index 類似卷標(biāo)Usage,而卷標(biāo)String Minimum 和String Maximum 則類似標(biāo)簽Usage Minimum 和Usage Maximum。如果希望某個操作對應(yīng)到一個字串,則用String Index 來描述該操控的報告數(shù)據(jù),這個字符串在字符串描述符中,StringIndex (data)項目中的data 是這個字符串在字符串描述符中的位置索引。如果需要用到幾個字符串,則可以使用String Minimum 來指向字符串描述符中被用到字符串的最先位置索引,和String Maximum 來指向最后位置索引。

    標(biāo)簽Delimiter 很少用到,請參考Universal Serial Bus HID Usage Tables 文件中Appendix B 的范例詳細(xì)說明。

    ?

    Global

    全局項目的卷標(biāo)事實上只要Usage Page,Logical Minimum,Logical Maximum,Report Size,Report ID,Report Count 就足夠了。表2 列了二個音量操作的例子(音量增減鍵和音量旋鈕)將用來輔助說明這些卷標(biāo),不過主項目括號內(nèi)的數(shù)據(jù)會在后文中再做說明。

    音量減鍵

    音量旋鈕

    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)

    Logical Minimum 和?Logical Maximum 代表了該特報告字段的取值范圍。

    Report Size :代表了用多少個 bit 來表征特性。

    Report Count : 代表有多少個這樣的結(jié)構(gòu)。

    比如:音量增減鍵的例子中ReportCount (1)表示主項目Input 只產(chǎn)生一個字段,所以可知只有一個音量增減鍵﹔而Report Size (2)表示這個字段為2 位。另一個音量旋鈕例子也是只有一個旋鈕,所以用Report Count (1)﹔但是因為Report Size (7),所以該旋鈕的數(shù)據(jù)字段為7位,可以表示0到127之?dāng)?shù)值。再舉一例,如果是鼠標(biāo)的三個按鍵,每個按鍵占用一個一位的字段,則Report Size (1), Report Count (3)﹔那么這個報告長度為三個位,可以同時呈現(xiàn)出三個按鍵的狀態(tài)(原狀或被按下)。

    注意:當(dāng)要將同一種報告分成數(shù)個部分,則每一個部分要給予一個識別值,這時就需用到卷標(biāo)Report ID,其數(shù)據(jù)值必須從1起算,不可使用0。沒有賦予Report ID 標(biāo)簽的報告,主機有可能會將其Report ID 視為0,所以Report ID (0)被要求不能使用。這個標(biāo)簽對控制型管線才有意義,因為它可以在請求報告時指定Report ID的值。對于中斷型管線,其為周期性傳輸報告,所以每次都會將所屬報告?zhèn)魍?#xff0c;沒有僅傳輸部分之必要,所以 Report ID 標(biāo)簽就無意義。

    ?

    2.3 報告(Report)描述符的組成以及解析

    2.3.1?報告(Report)描述符的組成

    根據(jù)官方的給出的資料,報告描述符的組成結(jié)構(gòu)如下:

    由一個 App Collection 開始,如果有多個 Report 結(jié)構(gòu),則增加 Collection 進行組合。

    首先需要描述他的 Usage 然后依次描述 Logical Minimum 、Logical Maximum、Report Size 、Report Count 等等。

    ?

    2.3.2?報告(Report)描述符的解析,解讀,構(gòu)建

    首先,要解讀,解析,構(gòu)建報告描述符,則需要了解并清楚他們之間的順序:

    Main 用來描述一個主項目,其他的都是用來修飾主項目的。Main 的作用域,一直到下一個 Main為止。

    Global 既然是全局的意思,可以把它理解成為一個全局變量,遇到下一個同樣的全局變量的定義時刻,此定義失效,并啟用下一個定義的值。

    Local 理解成為本地變量,用來修飾這一次的 Main 項目的。

    比如:官方的例子:

    從上到下,可以看到,首先,定義了一個 Input,Size 是 3,Count 是 2,即 2 個 3 bits 的 Input;

    接著 Size 修改為 8,即 數(shù)據(jù)成為了 8bits,但是數(shù)據(jù)個數(shù)還是之前的沒變,定義了 含有 2 個 8 bits 的一個 Input;

    接著定義了 Output,沿用了之前的含有 2 個 8 bits 的屬性;

    ?

    NOTE: 在閱讀 Report 的時候,都是上面的內(nèi)容,來修飾下面的一個 Main。

    ?

    2.3.3?報告(Report)描述符的例子

    下面是一個鍵盤和鼠標(biāo)的報告描述符:

    鍵???? 盤

    鼠????? 標(biāo)

    項? 目

    編 碼

    項?? 目

    編 碼

    Usage Page (Generic Desktop),

    0x0105

    Usage Page (Generic Desktop),

    0x0105

    Usage (Keyboard),

    0x0609

    Usage (Mouse),

    0x0209

    Collection (Application),

    0x01A1

    Collection (Application)

    0x01A1

    Usage Page (Keyboard),

    0x0705

    Usage (Pointer),

    0x0109

    Usage Minimum (224),

    0xE019

    Collection (Physical),

    0x00A1

    Usage Maximum (231),

    0xE729

    Usage Page (Buttons),

    0x0905

    Logical Minimum (0),

    0x0015

    Usage Minimum (1),

    0x0119

    Logical Maximum (1),

    0x0125

    Usage Maximum (3),

    0x0329

    Report Size (1),

    0x0175

    Logical Minimum (0),

    0x0015

    Report Count (8),

    0x0895

    Logical Maximum (1),

    0x0125

    Input (Data, Variable, Absolute),

    0x0281

    Report Size (1),

    0x0175

    Report Size (8),

    0x0875

    Report Count (3),

    0x0395

    Report Count (1),

    0x0195

    Input (Data, Variable, bsolute),

    0x0281

    Input (Constant),

    0x0181

    Report Size (5),

    0x0575

    Usage Minimum (0),

    0x0019

    Report Count (1),

    0x0195

    Usage Maximum (101),

    0x6529

    Input (Constant),

    0x0181

    Logical Minimum (0),

    0x0015

    Usage Page (Generic Desktop),

    0x0105

    Logical Maximum (101),

    0x6525

    Usage (X),

    0x3009

    Report Size (8),

    0x0875

    Usage (Y),

    0x3109

    Report Count (6),

    0x0695

    Logical Minimum (-127),

    0x8115

    Input (Data, Array),

    0x0081

    Logical Maximum (127),

    0x7F25

    Usage Page (LEDs),

    0x0805

    Report Size (8),

    0x0875

    Usage Minimum (1),

    0x0119

    Report Count (2),

    0x0295

    Usage Maximum (5),

    0x0529

    Input (Data, Variable, Relative),

    0x0681

    Logical Minimum (0),

    0x0015

    End Collection,

    0xC0

    Logical Maximum (1),

    0x0125

    End Collection

    0xC0

    Report Size (1),

    0x0175

    ?

    ?

    Report Count (5),

    0x0595

    ?

    ?

    Output (Data, Variable,Absolute),

    0x0291

    ?

    ?

    Report Size (3),

    0x0375

    ?

    ?

    Report Count (1),

    0x0195

    ?

    ?

    Output (Constant),

    0x0191

    ?

    ?

    End Collection

    0xC0

    ?

    ?

    這里先簡述一下鼠標(biāo)的情況:

    鼠標(biāo)的報告描述符的輸入數(shù)據(jù)格式中最低的一個字節(jié)只有最低3個位有意義,其分別對應(yīng)到鼠標(biāo)上的三個按鈕,用途類頁為Buttons。其它二個字節(jié)的用途為(Generic Desktop: X)和(Generic Desktop: X),分別對應(yīng)到鼠標(biāo)X 軸和Y 軸的位移操控。這二個位移值得邏輯范圍為-127 到127,即一個字節(jié)可以表示最大范圍。位移的數(shù)值是相對值,所以主項目為Input (Data, Variable, Relative)。

    下面是官方給出的一個鼠標(biāo)的報告描述符:

    ?

    2.3.4?報告(Report)和報告描述符

    報告描述等于是告訴了 Host 端,將以什么樣的形式進行數(shù)據(jù)傳送,報告描述符賦予了數(shù)據(jù)的意義,讓 HOST 能夠在收到裸的數(shù)據(jù)的時候,根據(jù)報告描述符進行分解到正確的數(shù)據(jù),并根據(jù) Usage 來進行正確的操作。

    比如:上述例子中,以 3 個 Bytes 進行上報:(沒有報告ID)

    如果鼠標(biāo)左鍵按下,則返回 01 00 00(十六進制值)

    如果鼠標(biāo)右鍵按下,則返回 02 00 00

    如果鼠標(biāo)中鍵按下,則返回 04 00 00

    如果三個鍵同時按下,則返回07 00 00。

    如果鼠標(biāo)往右移動則,第二字節(jié)返回正值,值越大移動速度越快。其它的類推。

    ?

    2.4 USB Device 支持 Class Request

    支持 HID ,設(shè)備除了支持基本的請求以外,還需要支持 HID 的幾個特定的請求:

    通過 get report 返回報告描述符。等等。具體參考 HID 文檔。

    ?

    工具:

    USB 協(xié)會提供了一個HID 描述符編輯工具稱作HID Descriptor Tool,其執(zhí)行程序為DT.exe。這個工具軟件可以在USB 網(wǎng)站上取得。雖然稱作HID 描述符工具,事實上,僅提供編撰報告描述符之用。

    ?

    總結(jié)

    以上是生活随笔為你收集整理的HID类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。