HID笔记
USB-HID一些筆記
HID(Human Interface Deviece)協議是USB協議中的一個子協議。指的是直接與人進行交互的設備。
一、簡述一些概念
1.0 USB設備描述符
USB是個通用的總線,硬件端口是統一的,而USB設備卻有很種,為了區分這些不同的設備,就得要用到不同設備各自的描述符。
1.1USB標準描述符
USB設備的信息存儲在USB設備的固件中,當USB設備接入PC機啟動后,主機會通過USB的標準請求,對存儲在USB設備的固件信息進行讀取分析。
USB有5種標準設備描述符,分別是:設備描述符、配置描述符、字符串描述符、接口描述符、端點描述符。
另外還有:HID描述符、報告描述符等各個類特有的描述符。
更詳細的內容請查找USB協議的相關資料。
1.2HID描述符
由于USB HID設備的接口中標識了設備類型,但同一種設備類型因為廠商或實現機制的原因,數據格式不統一,所以雖然是同一種設備,但固件上報的數據格式甚至長度可能五花八門,那么通過什么方式來實現使USB主機端識別并解析這些數據呢?答案就是報告描述符。
USB HID描述符包括兩種報表描述符,分別為物理描述符集合和報告描術符,也叫報表描述符。
- 物理描述符集合是可選的描述符,提供用于激活設備控件的人體一個或多個部分的信息。
- 報告描述符用于描述符USB HID設備上報的數據信息格式。
二、HID報告描述符/報表描述符
報表描述符用于描述USB_HID設備與主機之間數據交互的格式。根據數據的傳輸方向,分為輸入報告和輸出報告。
USB HID設備與主機傳輸的是數據,這些原始的數據就像內存里的數據一樣,如果沒有人告訴我們這些字節干什么的,也許我們永遠也不知道的。USB報表描述符的功能就是用于描述這些報告數據格式。當主機或設備收到報告數據后,會根據報告描述符的內容解析并理解這些數據的含義
2.0輸出報告
輸出報告主要是由主機給HID設備發送數據,例如鍵盤上的LED燈的開關命令。在我的開發里面,輸出報告使用的比較少,這里不加以描述。
2.1輸入報告
輸入報告主要是由HID設備發送給主機數據的報告,大部分HID設備主要實現的也是輸入報告。例如鼠標的點擊,移動,滾輪等操作。都是發送的輸入報告。
2.2報表描述符的格式
在進行報表傳輸之前,主機必須先請求設備的報表描述符,只有得到了報表描述符才可正確解析報表的數據。
HID的報表描述符并不像USB設備描述符一樣,包含描述符的長度和描述符類型的信息。HID描述符是由一個個項目(item)組成。每一個項目具有其項目的信息。
HID定義了兩種項目,一種是長項目,另一種是短項目。報告描述符里面的長項目一般不使用,一般短項目使用較多。這里就只介紹短項目。
2.2.0長項目(long item)
長項目可以攜帶更多的數據,當第一個字節為上圖中的特定值時表明該項目是一個長項目。
2.2.1短項目(short item)
-
bSize為0、1、2、3時Data部分的字節數分別為0、1、2、4個字節。
0 = 0 bytes
1 = 1 bytes
2 = 2 bytes
3 = 4 bytes
-
bType為0、1、2時分別為Main、Global和Local類型。
0 = Main
1 = Global
2 = Local
3 = Reserved
-
bTag:表示該項目的功能。
2.2.2三個項目類型(Main Item、Global Item、Local Item)
一些常用的項目類型,功能用法
主項目(Main Item)
主項目其有5個,分別為Input,Output,Feature,Collection和End Collection.
Input、Outpot和Feature項目
Input項目可以應用到任何控制、計數器讀數或其他設備傳給主機的信息。一個輸入報表包含一個或多個Input項目,主機使用中斷輸入傳輸來請求輸入報表。
Ouput項目用來定義主機傳送給設備的信息。一個輸出報表包含一個或多個Outpot項目。輸出報表包含控制狀態的數據。如果有中斷輸出管道,HID1.1兼容主機使用中斷輸出傳輸來傳送輸出報表,否則使用Set_Report控制請求。
Feature項目應用到主機傳送給設備的信息,或是主機從設備讀取Feature項目。一個特征報表包含一個或多個Feature項目,Feature項目通常是包合影響設備與其組件整體行為的配置。特征報表通常是控制可以使用實際的控制面板調整的設置,例如主機可以使用虛擬控制面板來讓用戶選擇控制特征。主機使用 Set_Report與Get_Report請求來傳送與接收特征報表。
在每一個Input、Output和Feature項目的前綴字之后是32位描述數據,目前最多定義了9個位,余的位則是保留。位0~8的定義中只有位7不能應用于Input項目,除此之外其他的位定義都適應于Input、Output和Feature項目。
Input、Outpot和Feature項目,這3個項目用來定義報表中的數據字段。
Collection和End Collection項目
Collection共有四種,分別為Physical,Application,Logical和Vendoer Defined.
所有的報表類型都可以使用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所連結的不同類型的項目。例如數據緩沖區的內容以及緩沖區內字節數目的計數。
全局項目(Global Item)
全局項目主要用來選擇用途頁(Usage Page),定義數據域的長度(Report Count)、數量(Report Size)、報告ID(ReportId)等。
全局項目描述對后續的所有項目有效,除非遇到有新的全局項目。
常見的全局項目有:
- Usage Page(用途頁)
- Logical Minimum(邏輯最小值)
- Logical Maxinum(邏輯最大值)
- Physical Minimum(物理最小值)
- Physical Maximum(物理最大值)
- Report Size:數據域大小,表示每個數據域有多少位
- Report Count:數據域有多少個數據域。
- ReportId:報告ID
局部項目(local Item)
局部項目用于定義數據的控制特性,如該數據域的用途,用途的最大值,用途的最小值等。
局部項目只在局部有效,遇到一個主項目后,它的失效。
常見的局部數據項目有:
- Usage :用途
- Usage Minmum:用途的最小值
- Usage Maxmum:用途的最大值。
三、下面是鼠標的HID設備描述符舉例
0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 全局項目 0x09, 0x02, // Usage (Mouse) 局部項目 0xA1, 0x01, // Collection (Application)主項目 0x85, 0x04, // Report ID (4) 0x09, 0x01, // Usage (Pointer) 局部項目 0xA1, 0x00, // Collection (Physical) 主項目 0x95, 0x03, // Report Count (3) 全局項目 ->>>數量 0x75, 0x01, // Report Size (1) 全局項目 ->>>位數 1位(bit) 0x05, 0x09, // Usage Page (Button) 全局項目->>>定義用法(按鍵) 0x19, 0x01, // Usage Minimum (0x01) 局部項目->>>使用最大值 0x29, 0x03, // Usage Maximum (0x03) 局部項目->>>使用最小值 0x15, 0x00, // Logical Minimum (0) 全局項目->>>邏輯最小值 0x25, 0x01, // Logical Maximum (1) 全局項目->>>邏輯最大值 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)主項目->>>設置位輸入項目 0x95, 0x01, // Report Count (1) 全局項目->>>數量 0x75, 0x05, // Report Size (5) 全局項目->>>位數 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)主項目->>>設置位輸入項目 (Const常量不變量)填充上面Report Size 補足一個字節 0x95, 0x03, // Report Count (3) 全局項目->>>數量 0x75, 0x08, // Report Size (8) 全局項目->>>位數8位(bit) 0x05, 0x01, // Usage Page (Generic Desktop Ctrls)全局項目 0x09, 0x30, // Usage (X)局部項目 0x09, 0x31, // Usage (Y)局部項目 0x09, 0x38, // Usage (Wheel)局部項目 0x15, 0x81, // Logical Minimum (-127) 全局項目 0x25, 0x7F, // Logical Maximum (127) 全局項目 0x81, 0x06, // Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)主項目 0xC0, // End Collection 主項目發送的數據
一些比較好的網上資料,和一些比較好的學習網站
[USB中文網]( USB中文網 - USB技術開發交流 (usbzh.com) ),這個里面的的資料是比較全的,不止有USB_HID的協議,還有很多USB的其他資料。
USB_HID協議基礎,這是一個博客,是一個比較厲害的博主寫的對USB_HID的一個介紹,可以了解一下。
總結
- 上一篇: 用计算机求函数总分 平均分,老师如何在E
- 下一篇: 解决win10无法搜索本地应用