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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HID笔记

發布時間:2023/12/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的一個介紹,可以了解一下。

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。