USB HID簡介,開發USB裝置必備
HID是一種USB通訊協議,無需安裝驅動就能進行互動,這給手持搖桿手柄類的遊戲開發提供了便利。順便說一下,手持搖桿類遊戲也支援安卓手機和蘋果手機哦。
在學習HID之前,先來複習一下USB協議的相關內容。
USB裝置描述符-概述
當插入USB裝置後,主機會向裝置請求各種描述符來識別裝置。那什麼是裝置描述符呢?
Descriptor即描述符,是一個完整的資料結構,可以通過C語言等程式設計實現,並存儲在USB裝置中,用於描述一個USB裝置的所有屬性,USB主機是通過一系列命令來要求裝置傳送這些資訊的。
描述符的作用就是通過命令操作作來給主機傳遞資訊,從而讓主機知道裝置具有什麼功能、屬於哪一類裝置、要佔用多少頻寬、使用哪類傳輸方式及資料量的大小,只有主機確定了這些資訊之後,裝置才能真正開始工作。
USB有那些標準描述符?
USB有5種標準描述符:裝置描述符 、配置描述符、字元描述符、介面描述符、端點描述符 。
描述符之間有一定的關係,一個裝置只有一個裝置描述符,而一個裝置描述符可以包含多個配置描述符,而一個配置描述符可以包含多個介面描述符,一個介面使用了幾個端點,就有幾個端點描述符。由此我們可以看出,USB的描述符之間的關係是一層一層的,最上一層是裝置描述符,下面是配置描述符,再下面是介面描述符,再下面是端點描述符。在獲取描述符時,先獲取裝置描述符,然後再獲取配置描述符,根據配置描述符中的配置集合長度,一次將配置描述符、介面描述符、端點描述符一起一次讀回。其中可能還會有獲取裝置序列號,廠商字串,產品字串等。
裝置描述符
struct _DEVICE_DEscriptOR_STRUCT
{
BYTE bLength; //裝置描述符的位元組數大小
BYTE bDescriptorType; //描述符型別編號,為0x01
WORD bcdUSB; //USB版本號
BYTE bDeviceClass; //USB分配的裝置類程式碼,0x01~0xfe為標準裝置類,0xff為廠商自定義型別,0x00不是在裝置描述符中定義的,如HID
BYTE bDeviceSubClass; //usb分配的子類程式碼,同上,值由USB規定和分配的,HID裝置此值為0
BYTE bDeviceProtocl; //USB分配的裝置協議程式碼,同上HID裝置此值為0
BYTE bMaxPacketSize0; //端點0的最大包的大小
WORD idVendor; //廠商編號
WORD idProduct; //產品編號
WORD bcdDevice; //裝置出廠編號
BYTE iManufacturer; //描述廠商字串的索引
BYTE iProduct; //描述產品字串的索引
BYTE iSerialNumber; //描述裝置序列號字串的索引
BYTE bNumConfiguration; //可能的配置數量
}
配置描述符
struct _CONFIGURATION_DEscriptOR_STRUCT
{
BYTE bLength; //配置描述符的位元組數大小
BYTE bDescriptorType; //描述符型別編號,為0x02
WORD wTotalLength; //配置所返回的所有數量的大小
BYTE bNumInterface; //此配置所支援的介面數量
BYTE bConfigurationVale; //Set_Configuration命令需要的引數值
BYTE iConfiguration; //描述該配置的字串的索引值
BYTE bmAttribute; //供電模式的選擇
BYTE MaxPower; //裝置從匯流排提取的最大電流
}
字元描述符
struct _STRING_DEscriptOR_STRUCT
{
BYTE bLength; //字串描述符的位元組數大小
BYTE bDescriptorType; //描述符型別編號,為0x03
BYTE SomeDescriptor[36]; //UNICODE編碼的字串
}
介面描述符
struct _INTERFACE_DEscriptOR_STRUCT
{
BYTE bLength; //介面描述符的位元組數大小
BYTE bDescriptorType; //描述符型別編號,為0x04
BYTE bInterfaceNunber; //介面的編號
BYTE bAlternateSetting;//備用的介面描述符編號
BYTE bNumEndpoints; //該介面使用端點數,不包括端點0
BYTE bInterfaceClass; //介面型別 HID裝置此值為0x03
BYTE bInterfaceSubClass;//介面子型別 HID裝置此值為0或者1
BYTE bInterfaceProtocol;//介面所遵循的協議
BYTE iInterface; //描述該介面的字串索引值
}
端點描述符
struct _ENDPOIN_DEscriptOR_STRUCT
{
BYTE bLength; //端點描述符的位元組數大小
BYTE bDescriptorType; //描述符型別編號,為0x05
BYTE bEndpointAddress; //端點地址及輸入輸出屬性
BYTE bmAttribute; //端點的傳輸型別屬性
WORD wMaxPacketSize; //端點收、發的最大包的大小
BYTE bInterval; //主機查詢端點的時間間隔
}
HID裝置描述符
溫習了以上內容,我們再來看看HID協議與這些描述符之間的關係。
當插入USB裝置後,主機會向裝置請求各種描述符來識別裝置。
為了把一個裝置識別為HID類別,裝置在定義描述符的時候必須遵守HID規範。
從框圖中,可以看出除了USB標準定義的一些描述符外,HID裝置還必須定義HID描述符。另外裝置和主機的通訊是通過報告的形式來實現的,所以還必須定義報告描述符;而物理描述符不是必需的。還有就是HID描述符是關聯於介面(而不是端點)的,所以裝置不需要為每個端點都提供一個HID描述符。
介面描述符中bInterfaceClass的值必須為0x03,bInterfaceSubClass的值為0或1,為1表示HID裝置符是一個啟動裝置(Boot Device,一般對PC機而言才有意義,意思是BIOS啟動時能識別並使用您的HID裝置,且只有標準滑鼠或鍵盤類裝置才能成為Boot Device。如果為0則只有在作業系統啟動後才能識別並使用您的HID裝置)。
USB HID類描述符的結構 |
||||
偏移量 |
域 |
大小 |
值 |
描述 |
0 |
bLength |
1 |
數字 |
此描述符的長度(以位元組為單位) |
1 |
bDescriptorType |
1 |
常量 |
描述符種類(此處為0x21即HID類描述符) |
2 |
bcdHID |
2 |
數字 |
HID規範版本號(BCD碼),採用4個16進位制的BCD格式編碼,如版本1.0的BCD碼為0x0100,版本為1.1的BCD碼為0x0110 |
4 |
bCountryCode |
1 |
數字 |
硬體目的國家的識別碼(BCD碼)(見表3) |
5 |
bNumDescritors |
1 |
數字 |
支援的附屬描述符數目 |
6 |
bDescriptorType |
1 |
常量 |
HID相關描述符的型別 0x21:HID描述符 0x22:報告描述符 0x23:物理描述符 |
7 |
wDescriptorLength |
2 |
數字 |
報告描述符總長度 |
9 |
bDescriptorType |
1 |
常量 |
用於識別描述符型別的常量,使用在有一個以上描述符的裝置 |
10 |
wDescriptorLength |
2 |
數字 |
描述符總長度,使用在有一個以上描述符的裝置 |
報告描述符
報告描述符比較複雜,它是以item形式排列組合而成,無固定長途,使用者可以自定義長度以及每一bit的含義。item型別分三種:main,global和local,其中main型別又可分為5種tag:
- input item tag:指的是從裝置的一個或多個類似控制管道得到的資料
- output item tag:指的是傳送給一個或多個類似控制管道的資料
- feature item tag:表示裝置的輸入輸出不面向終端使用者
- collection item tag:一個有意義的input,output和feature的組合專案
- end collection item tag:指定一個collectionitem的終止
每一個main item tag(input,output,feature)都表明了來自一個特定管道的資料的大小,資料相對還是獨立,以及其他相關資訊。在此之前,global和local item定義了資料的最大值和最小值,等等。local item僅僅描述下一個main item定義的資料域,而global item是這一個報告描述符中所有後續資料段的預設屬性。
一個報告描述符可能包含多個main item,為了準確描述來自一個控制管道的資料,一個報告描述符必須包括以下內容:
- input(output,feature)
- usage
- usage page
- Logical Minimum
- Logical Maximum
- Report Size
- Report Count
下面用一個三鍵滑鼠舉例說明:
Usage Page (Generic Desktop); //global item
Usage (Mouse); //global item
Collection (Application); //Start Mouse collection
Usage (Pointer); //
Collection (Physical); //Start Pointer collection
Usage Page (Buttons)
Usage Minimum (1),
Usage Maximum (3),
Logical Minimum (0),
Logical Maximum (1) ; //Fields return values from 0 to 1
Report Count (3),
Report Size (1); //Create three 1 bit fields (button 1, 2, & 3)
Input (Data, Variable, Absolute); //Add fields to the input report.
Report Count (1),
Report Size (5); //Create 5 bit constant field
Input (Constant), ;Add field to the input report
Usage Page (Generic Desktop),
Usage (X),
Usage (Y),
Logical Minimum (-127),
Logical Maximum (127); //Fields return values from -127 to 127
Report Size (8),
Report Count (2); //Create two 8 bit fields (X & Y position)
Input (Data, Variable, Relative); //Add fields to the input report
End Collection; //Close Pointer collection
End Collection; //Close Mouse collection
item的資料格式有兩種,分別是短item和長item。
短item格式
bSize |
0:0個位元組 1:1個位元組 2:2個位元組 3:4個位元組 |
bType |
0:main 1:global 2:local 3:保留 |
bTag |
item型別 8:input 9:output A:collection B:feature C:end collection |
長item,其bType位值為3,bTag值為F
bDataSize |
0:0個位元組 1:1個位元組 2:2個位元組 3:4個位元組 |
bLongItemTag |
0:main 1:global 2:local 3:保留 |
data | 資料 |
物理描述符用來描述行為特性,是可選的。
USB HID類可採用的通訊管道
所有的HID裝置通過USB的控�[email protected]�[email protected] 88!E8 @@ 98 E8�$A4�[email protected]#=E�$=B#E5'E1"EA
相關推薦
USB HID簡介,開發USB裝置必備
HID是一種USB通訊協議,無需安裝驅動就能進行互動,這給手持搖桿手柄類的遊戲開發提供了便利。順便說一下,手持搖桿類遊戲也支援安卓手機和蘋果手機哦。 在學習HID之前,先來複習一下USB協議的相關內容。 USB裝置描述符-概述 當插入USB裝置後,主機會向裝置請求
Django之Django簡介,開發環境搭建,專案應用建立
軟體及Django框架簡介 軟體框架 一個軟體框架是由其中各個軟體模組組成的; 每一個模組都有特定的功能; 模組與模組之間通過相互配合來完成軟體的開發。 軟體框架是針對某一類軟體設計問題而產生的。 MVC框架 施樂公司 帕羅奧多研究中心 smalltalk語言 simul
WDF開發USB裝置驅動教程(1)
PDF下載地址(1.2版):連結地址 CY001開發板討論帖:連結地址 注:本文件新版本已出,請在部落格中查詢,或下載PDF全文文件。 連結地址WDF開發USB裝置驅動教程 by 張佩 文件說明 &
[轉]C++ MFC介面讀寫USB HID裝置資料程式
C++ MFC介面讀寫USB HID裝置資料程式跟大家分享一個最近開發的,用來測試USB HID裝置的通用程式,程式還有很多可以繼續優化的地方,比如說interupt的週期,讀取位元組的多少等。我遇到的問題是:開發一個簡單易用的介面,用來對USB HID裝置(比如說遊戲手柄,控制面板等)讀寫資料,一
Linux下,檢視USB裝置資訊
Linux下,檢視USB裝置資訊 首先需要將usbfs掛載一下,然後才能檢視。$ mount -t usbfs none /proc/bus/usb $ cat /proc/bus/usb/devices 或者在檔案(/etc/fstab)中新增如下這句:
Android USB Host與USB Hid裝置的通訊(印表機和android通訊,通過USB)
記事:android和印表機通過網路通訊(網路印表機),有空也要記錄一下 堆疊關係也要記錄一下(通常我們所說的堆疊都是指棧,比如一個方法被呼叫的時候,我們就會把相關變數壓棧(巢狀才會壓棧,一個方法呼叫完是要出棧的),除非遞迴,一般情況下,棧是不會溢位的) 近期一直在做Android USB
裝置休眠狀態,滑動 USB 滑鼠, 無法解鎖
(1) 在 lcd 的 dts 中配置螢幕的物理寬高,單位為 mm screen-width = <153>;//Lcd 物理寬度,如 153 screen-hight = <85>;//Lcd 物理高度,如 85 (2) 修改 Mo
裝置休眠狀態,滑動 USB 滑鼠, 無法解鎖
(1) 在 lcd 的 dts 中配置螢幕的物理寬高,單位為 mm screen-width = <153>;//Lcd 物理寬度,如 153 screen-hight = <85>;//Lcd 物理高度,如 85 (2) 修改 Mouse 事件處理 --- a/
【專題教程第8期】基於emWin模擬器的USB BULK上位機開發,僅需C即可,簡單易實現
說明:1、如果你會emWin話的,就可以輕鬆製作上位機。做些通訊和控制類上位機,比使用C#之類的方便程度一點不差,而且你僅會C語言就可以。2、並且成功將emWin人性化,可以做些Windows系統上的小應用了,基本完全看不出是emWin做的,而且生成的軟體很小。Win32 API編寫的軟體,最大的好處就是微軟
提高USB HID裝置速率的方法——基於C8051F380
專案採用C8051F380的USB2.0介面實現HID裝置(配置為Game Controller)。利用端點1傳送資料,每包12個位元組。經測試,即使裝置什麼也不做,僅在main函式的while(1)迴圈中持續傳送資料,最快資料也僅達到5ms
USB-HID裝置協議解讀
參考文獻:Device Class Definition for Human Interface Devices(HID) 用於描述HID功能特徵的有三個值:Class SubClass Interfaces Subclass Code Descriptio
自定義USB-HID裝置_筆記
參考圈圈教程: 在USB鍵盤的描述符基礎上做如下修改: 1、Device Descriptor :修改PID/VID ; 2、Configuration Descriptor :修改 Interface Descriptor中的 bInterfaceSubClass 欄位和
STM32F103C8T6的USB HID複合裝置的實現要點
1,可從官網下載STM32_USB-FS-Device_Lib_V4.0,裡面有Custom_HID例子參考。可從Custom_HID修改得到。時刻記住“自己是STM32F10X_MD系列”以及“自己不是官方demo板”即可將無用的程式碼去掉,譬如去掉ADC等等相關程式碼。2
USB裝置開發---- usb描述符概述(libusb庫使用)
說到USB裝置,不得不提到各種描述符(descriptors), 一般來說,描述符有如下幾種: 1:裝置描述符(Device Descriptors) 2:配置描述符(Configuration Descriptors) 2:介面描述符(In
USB HID報告及報告描述簡介
在USB中,USB HOST是通過各種描述符來識別裝置的,有裝置描述符,配置描述符,介面描述符,端點描述符,字串描述符,報告描述符等等。USB報告描述符(Report Descriptor)是HID裝置中的一個描述符,它是比較複雜的一個描述符。 USB
USB裝置驅動開發之擴充套件(利用USB虛擬匯流排驅動模擬USB攝像頭)
fanxiushu 2016-10-08 轉載或引用,請註明原始作者 做這個事情寫這篇文章之前,壓根沒朝模擬USB攝像頭這方面去想過。 直到CSDN上一位朋友提出問題,才想到還有這麼一個玩意。
USB HID裝置資料的讀取
USB裝置(HID) Android下獲取HID資料的方式: 1.通過讀取/dev/hidrawX裝置節點 看名字就知道意思了(這個需要在編譯的時候開啟) 2.如果是標準HID裝置,還可以通過/dev/input裡的裝置節點讀取 方式一.通過input/even
USB裝置開發---- usb描述符概述
說到USB裝置,不得不提到各種描述符(descriptors), 一般來說,描述符有如下幾種: 1:裝置描述符(Device Descriptors) 2:配置描述符(Configuration Descriptors) 2:介面描述符(
MSCL超級工具類(C#),開發人員必備,開發利器
cnblogs 分頁 導入導出 sqlserve context public 簡單 pac dir MSCL超強工具類庫 是基於C#開發的超強工具類集合,涵蓋了日常B/S或C/S開發的諸多方面,包含上百個常用封裝類(數據庫操作類全面支持Mysql、Access、Oracl
CY7C68013 USB接口相機開發記錄 - 第一天
自己 接口 http images boa 記錄 能夠 -s rds 一直覺得從頭開發一套東西出來會極大的提升自己的自信心,能夠最大化的開發自己的潛能。所以在猶豫很久之後決定學習下CY7C68013 USB接口相機的開發。 通過在網上查找多份資料後,覺得工欲善其事必