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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

USB HID

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

文章目錄

目錄

一、USB簡介

二、USB(HID)協議及描述符

1.USB描述符簡介

2.USB描述符

??

一、USB簡介

USB根據速度可分為:

  • 低速USB ?Low Speed Device (LS) ?
  • 全速USB Full Speed Device (FS) ?
  • 高速USB設備 Hight Speed Device (HS)
  • 具體應用以及特性如下:

    一般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協議規定了兩種條目:短條目和長條目,常用的是短條目。

    短條目的構成:一字節的前綴 + 可選的數據字節。可選的數據字節可以是0、1、2、4字節。實際中所使用的條目,大部分是1字節的可選數據

    一個條目前綴如下

    bSize:bit1~bit0后面緊跟的字節數

    總結

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

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