USB HID
文章目錄
目錄
一、USB簡介
二、USB(HID)協議及描述符
1.USB描述符簡介
2.USB描述符
??
一、USB簡介
USB根據速度可分為:
具體應用以及特性如下:
一般USB接口有4根線,分別是VCC DM DP GND。DM,DP是數據線。
USB的檢測:
每一個主機USB的DM, DP都有內部15K下拉到GND,沒有外設插入情況下是低電平。在USB從設備中,如果設備是高速USB則在DP上加有1.5K上拉到VCC,如果是低速設備則在DM上加1.5K上拉到VCC。當DP或者DM被拉高就可以檢測USB插入,并且可以區分是高速還是低速USB。
二、USB(HID)協議及描述符
1.USB描述符簡介
USB的硬件端口是統一的,但是USB設備卻是多種多樣的,USB主機根據USB設備的描述符來區分不同的USB設備。每一個USB設備都有自己的描述符,當插入USB設備之后,主機會向從機發送命令,從機收到命令之后,會返回特定的描述符信息。主機通過解析收到的描述符,來識別從機設備的相關信息,這個過程,就是設備枚舉(enumeration)過程。
USB有5種標準設備描述符,分別是:設備描述符、配置描述符、字符串描述符、接口描述符、端點描述符。
另外還有:HID描述符、報告描述符等各個類特有的描述符。見下表:
要注意的是,設備描述符有且只有一個。其包含關系如下圖所示。
2.USB描述符
?????????2.1 USB設備描述符
設備描述符有且僅有一個!
描述符使用到的宏定義如下:
#define USB_DEVICE_DESCRIPTOR_TYPE????????????? 0x01#define USB_CONFIGURATION_DESCRIPTOR_TYPE?????? 0x02#define USB_STRING_DESCRIPTOR_TYPE????????????? 0x03#define USB_INTERFACE_DESCRIPTOR_TYPE?????????? 0x04#define USB_ENDPOINT_DESCRIPTOR_TYPE??????????? 0x05#define HID_DESCRIPTOR_TYPE???????????????????? 0x21設備描述符類型定義固定為0x01
USB HID設備的設備描述符代碼例子(STM32 USB HID)如下:
/* USB Standard Device Descriptor */ const uint8_t CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC] ={0x12, /*bLength */USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/0x00, /*bcdUSB */0x02,0x00, /*bDeviceClass*/0x00, /*bDeviceSubClass*/0x00, /*bDeviceProtocol*/0x40, /*bMaxPacketSize40*/0x83, /*idVendor (0x0483)*/0x04,0x50, /*idProduct = 0x5750*/0x57,0x00, /*bcdDevice rel. 2.00*/0x02,1, /*Index of string descriptor describingmanufacturer */2, /*Index of string descriptor describingproduct*/3, /*Index of string descriptor describing thedevice serial number */0x01 /*bNumConfigurations*/}; /* CustomHID_DeviceDescriptor */其結構成員意義如下:
(1)bLength
描述符長度(18字節,十六進制為0x12),就是標志描述符數據結構的長度。
(2)bDescriptorType
bDescriptorType代表了本描述符的類型,設備描述符為0x01 (設備描述符固定為0x01)
(3)bcdUSB
?? ?USB協議版本,表示形式0xJJMN版本JJ.M.N(JJ ?- 主要版本號,M ?- 次要版本號,N ?- 次要版本)
?? ?例子:如果是USB2.0,寫成:0200H;如果是USB1.1,寫成:0110H 如果是USB3.11,寫成:0311H
(4)bDeviceClass、bDeviceSubClass、bDeviceProtocol
?? ?bDeviceClass、bDeviceSubClass、bDeviceProtocol分別代表設備類型,子類型,設備使用的協議,USB-IF區分設備類分了三個等級(類-子類-協議碼)其中,類包含人機交互類、圖像類、無線類、音頻類等等,子類比如音頻類的音頻控制、音頻流等等,協議比如人機接口類中的鼠標、鍵盤、觸摸屏等,為何會有這么多USB的Class分類,子分類,設備協議。我們要知道,USB協議設計的目的,就是為實現通用,用單一的USB接口取代之前種類繁多的各種其他接口。而為了取代其他各種接口,那意味著就要實現各種設備所對應的各種功能。如下圖顯示USB設備的各種類別,USB設備類信息更詳細內容可進入https://www.usb.org/defined-class-codes查看。
(5)bMaxPackeSize0
就是端點一次最大傳多少個字節。USB協議里有規定,端點0最低8字節,端點的最大傳輸大小和USB速度等級以及傳輸類型有關,控制傳輸一般使用端點0,低速最大8字節,全速和高速最大傳輸64字節,如下圖:
(6)idVender
?? ?廠商ID,就是個2字節的編號,由USB協議分配,廠商申請時需要交費。自己隨便寫的話,僅限于學習、測試的情況下,不能用做產品。
(7)idProduct
?? ?產品ID,廠家自己隨便定義。
(8)bcdDevice
?? ?產品版本號,廠家自己隨便定義。
(9)iManufacturer
?? ?描述廠商的字符串的索引,為0則表示沒有。
(10)iProduct
?? ?描述產品的字符串的索引,為0則表示沒有。
(11)iSerialNumber
?? ?產品序列號字符串的索引,為0則表示沒有。
(12)bNumConfigurations
指示設備由多少個配置,前面提到過,一個USB可能有多個配置,一般USB產品都是1個配置。
????????2.2 配置描述符
配置描述符至少有一個,可以有多個,一般一個設備只設置一個配置描述符。
配置描述符類型定義固定為0x02
USB HID設備的配置描述符代碼例子(STM32 USB HID)如下:(注意其中除了配置描述符還包括其他如接口描述符和端點描述符)
/* USB Configuration Descriptor */ /* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ const uint8_t CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] = {0x09, /* bLength: Configuration Descriptor size */USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */CUSTOMHID_SIZ_CONFIG_DESC,/* wTotalLength: Bytes returned */0x00,0x01, /* bNumInterfaces: 1 interface */0x01, /* bConfigurationValue: Configuration value */0x00, /* iConfiguration: Index of string descriptor describingthe configuration*/0xC0, /* bmAttributes: Self powered */0x32, /* MaxPower 100 mA: this current is used for detecting Vbus *//************** Descriptor of Custom HID interface ****************//* 09 */0x09, /* bLength: Interface Descriptor size */USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType: Interface descriptor type */0x00, /* bInterfaceNumber: Number of Interface */0x00, /* bAlternateSetting: Alternate setting */0x02, /* bNumEndpoints */0x03, /* bInterfaceClass: HID */0x00, /* bInterfaceSubClass : 1=BOOT, 0=no boot */0x00, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */0, /* iInterface: Index of string descriptor *//******************** Descriptor of Custom HID HID ********************//* 18 */0x09, /* bLength: HID Descriptor size */HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */0x10, /* bcdHID: HID Class Spec release number */0x01,0x00, /* bCountryCode: Hardware target country */0x01, /* bNumDescriptors: Number of HID class descriptors to follow */0x22, /* bDescriptorType */CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */0x00,/******************** Descriptor of Custom HID endpoints ******************//* 27 */0x07, /* bLength: Endpoint Descriptor size */USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */0x81, /* bEndpointAddress: Endpoint Address (IN) */0x03, /* bmAttributes: Interrupt endpoint */0x02, /* wMaxPacketSize: 2 Bytes max */0x00,0x20, /* bInterval: Polling Interval (32 ms) *//* 34 */0x07, /* bLength: Endpoint Descriptor size */USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: *//* Endpoint descriptor type */0x01, /* bEndpointAddress: *//* Endpoint Address (OUT) */0x03, /* bmAttributes: Interrupt endpoint */0x02, /* wMaxPacketSize: 2 Bytes max */0x00,0x20, /* bInterval: Polling Interval (20 ms) *//* 41 */}; /* CustomHID_ConfigDescriptor */其中配置描述符代碼段:
0x09, /* bLength: Configuration Descriptor size */USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */CUSTOMHID_SIZ_CONFIG_DESC,/* wTotalLength: Bytes returned */0x00,0x01, /* bNumInterfaces: 1 interface */0x01, /* bConfigurationValue: Configuration value */0x00, /* iConfiguration: Index of string descriptor describingthe configuration*/0xC0, /* bmAttributes: Self powered */0x32, /* MaxPower 100 mA: this current is used for detecting Vbus */配置描述符的各個域的意義如下:
bLength:大小為1字節,表示該描述符的長度。標準的USB配置描述符的長度為9字節。
bDescriptorType:配置描述符的類型。
wTotalLength:表示整個配置描述符集合的總長度,包括配置描述符、接口描述符、端點描述符和類特殊描述符(HID類)。注意低字節在前。
bNumInterfaces:該配置描述符所支持的接口數量(接口編號數量而不是接口描述符數量,不同的接口描述符可能使用同一個編號接口)。功能單一設備只有一個,而復合設備則具有多個接口。
bConfigurationValue:表示該配置的值。通常一個USB設備可以支持多個配置,bConfigurationValue就是每個配置的標識。
iConfiguration:描述該配置的字符串的索引值。如果該值為0,則表示沒有字符串。
bmAttributes:用來描設備的一些特性。其中,D7是保留的,必須要設置為1。D6表示供電方式,D6=1時,表示設備自供電;D6=0時,表示設備時總線供電。D5表示是否支持遠程喚醒,D5=1時,支持遠程喚醒。D4~D0保留,設置為0
bMaxPower:表示設備需要從總線獲取的最大電流量,單位為2mA。如需要200mA的最大電流,則該字節的值為100
????????2.3 接口描述符
如上面代碼中
/************** Descriptor of Custom HID interface ****************//* 09 */0x09, /* bLength: Interface Descriptor size */USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType: Interface descriptor type */0x00, /* bInterfaceNumber: Number of Interface */0x00, /* bAlternateSetting: Alternate setting */0x02, /* bNumEndpoints */0x03, /* bInterfaceClass: HID */0x00, /* bInterfaceSubClass : 1=BOOT, 0=no boot */0x00, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */0, /* iInterface: Index of string descriptor */該段代碼定義的是HID的接口描述符。
USB_INTERFACE_DESCRIPTOR_TYPE為固定值表示該配置是接口描述符。
bNumEndpoints,該接口使用的端點個數。注意一點,這個端點個數不包括0端點。
bInterfaceClass的定義如下表:
bInterfaceSubClass 除帶有由接口定義的類的設備外,此字段于設備描述符中的bDeviceSubClass 相同。若 bInterfaceClass 等于00h,bInterfaceSubClass 也必須等于 00h。若 bInterfaceClass 取從 01h到FEh的值,bInterfaceSubClass則等于00h或等于一個為接口的類定義的值。FFh表明為廠商定義的子類。
??? bInterfaceProtocol 除了帶有接口定義的類的設備外,此字段于設備描述符中的bDeviceProtocol相同。此字段可為所選bInterfaceClass和bInterfaceSubClass 所規定的協議。若bInterfaceClass取從01h到FEh的值,bInterfaceProtocol必須等于00h,或等于為接口的類定義的值。FFh表明為廠商定義的協議。
??? iInterface 是指向描述接口的字符串的索引。若沒有字符串描述符,該值為0.
????????2.4HID描述符
上面在接口描述符中定義了設備類型為0x03的HID設備,那么需要定義HID描述符,上面代碼中HID描述符代碼如下:
/* 18 */0x09, /* bLength: HID Descriptor size */HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */0x10, /* bcdHID: HID Class Spec release number */0x01,0x00, /* bCountryCode: Hardware target country */0x01, /* bNumDescriptors: Number of HID class descriptors to follow */0x22, /* bDescriptorType */CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */0x00,bcdHID為0x0110,表面該HID協議為1.1版本
bCountryCode: 設備所適用的國家。如果使用的鍵盤是美式鍵盤,代碼為33,即0x21
bNumDescriptors:下級描述符的數量。這個值至少為1,也就是HID類設備至少要有一個報告描述符。下級描述符可以是報告描述符或者物理描述符。
wItemLength: 報告描述符的總長度。
? 2.5 端點描述符
上面HID的端點描述符代碼:
/******************** Descriptor of Custom HID endpoints ******************//* 27 */0x07, /* bLength: Endpoint Descriptor size */USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */0x81, /* bEndpointAddress: Endpoint Address (IN) */0x03, /* bmAttributes: Interrupt endpoint */0x02, /* wMaxPacketSize: 2 Bytes max */0x00, 0x20, /* bInterval: Polling Interval (32 ms) */bEndpointAddress: bit7 :方向 ?1/0 :in/out,對于控制端點可以忽略;bit4~bit6 保留,bit3~bit0:端點號?
bmAttributes,屬性。如下
bit1~bit0:
00 = Control-控制傳輸
01 = Isochronous-等時傳輸
10 = Bulk-批量傳輸
11 = Interrupt-中斷傳輸
如果不是一個等時傳輸端點,第5~2位是保留的,必須設置為0。如果它是等時的,則定義如下:
Bits 3..2: Synchronization Type-同步類型
00 = No Synchronization-無同步
01 = Asynchronous-異步
10 = Adaptive-適配
11 = Synchronous-同步
/*Bits 5..4: Usage Type-用途*/
00 = Data endpoint-數據端點
01 = Feedback endpoint-反饋端點
10 = Implicit feedback Data endpoint-暗含反饋的數據端點
11 = Reserved-保留
wMaxPackeSize,端點支持的最大包長。對于等時端點,此值用于在調度中保留總線時間,這是每(微)幀數據有效負載所需的時間。在進行中,管道實際使用的帶寬可能比保留的帶寬少。如果有必要,設備會報告通過其正常的、非usb定義的機制所使用的實際帶寬。
對于所有的端點,bit10~bit0指定最大數據包大小(以字節為單位)。
/*5.對于高速同步和中斷端點:bit12~bit11指定每個微幀的額外通信次數:
00 = None (1 transaction per microframe)
01 = 1 additional (2 per microframe)
10 = 2 additional (3 per microframe)
11 = Reserved
bInterval,查詢時間,說白了就是主機多久和設備通訊一次。根據設備運行速度以幀或微幀表示。
對于全/高速等時端點,此值必須在1到16之間。bInterval值用作2的指數;例如,bInterval為4,表示周期為8, 2(4 – 1)。
對于全速/低速中斷端點,該字段的值可以是1到255。
對于高速中斷端點,使用bInterval值作為2的指數;例如,bInterval為4表示周期為8 ,2(4-1)。這個值必須在1到16之間。
對于高速批量/控制輸出端點,bInterval必須指定端點的最大NAK速率。值0表示端點永不NAK。其它值表示每個微幀的bInterval數最多1個NAK。這個值的范圍必須在0到255之間。
2.6?報告描述符
報告描述符包含多個報告,不同的報告通過報告ID來識別,報告的第一個字節就是報告ID。當報告描述符中沒有定義報告ID時,開始就是數據。
報告描述符由條目(item)來組成,一個條目占據一行。HID協議規定了兩種條目:短條目和長條目,常用的是短條目。
短條目的構成:一字節的前綴 + 可選的數據字節??蛇x的數據字節可以是0、1、2、4字節。實際中所使用的條目,大部分是1字節的可選數據
一個條目前綴如下
bSize:bit1~bit0后面緊跟的字節數
總結
- 上一篇: CorelDRAW X4中文版高清实例视
- 下一篇: Visualizations:一个数据结