新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > USB開發基礎:USB命令(請求)和USB描述符

        USB開發基礎:USB命令(請求)和USB描述符

        作者: 時間:2016-12-13 來源:網絡 收藏
        一、USB命令
          在USB規范里,對命令一詞提供的單詞為“Request”,但這里為了更好的理解主機與設備之間的主從關系,將它定義成“命令”。
          所有的USB設備都要求對主機發給自己的控制命令作出響應,USB規范定義了11個標準命令,它們分別是:Clear_Feature、Get_Configuration、Get_Descriptor、Get_Interface、Get_Status、Set_Address、Set_Configuration、Set_Descriptor、Set_Interface、Set_Feature、Synch_Frame。所有USB設備都必須支持這些命令(個別命令除外,如Set_Descriptor、Synch_Frame)。
          不同的命令雖然有不同的數據和使用目的,但所有的USB命令結構是一樣的。下表所示為USB命令的結構:
        表1、USB命令的結構
        偏移量長度(字節)描述
        0bmRequestType1位圖請求特征:
        D7:傳輸方向
        0=主機至設備
        1=設備至主機
        D6..5:種類
        0=標準
        1=類
        2=廠商
        3=保留
        D4..0:接受者
        0=設備
        1=接口
        2=端點
        3=其他
        4..31保留
        1bRequest1命令類型編碼值(見表3)
        2wValue2根據不同的命令,含義也不同
        4wIndex2索引或偏移根據不同的命令,含義也不同,主要用于傳送索引或偏 移
        6wLength2如有數據傳送階段,此為數據字節數。
        下表列出了USB的11種標準命令
        表2、USB的11種標準命令
        命令bmRequestTypebRequestwValuewIndexwLengthData
        Clear_Feature00000000B
        00000001B
        00000010B
        CLEAR_FEATURE特性選擇符
        接口號
        端點號
        Get_Configuration10000000BGET_CONFIGURATION配置值
        Get_Descriptor10000000BGET_DESCRIPTOR描述表種類(高字節,見表5)和索引(低字節)零或語言標志描述表長描述表
        Get_Interface10000001BGET_INTERFACE接口號可選設置
        Get_Status10000000B
        10000001B
        10000010B
        GET_STATUS零(返回設備狀態)
        接口號(對像時接口時)
        端點號(對象是端點時)
        設備,
        接口,或
        端點狀態
        Set_Address00000000BSET_ADDRESS設備地址
        Set_Configuration00000000BSET_CONFIGURATION配置值(高字節為0,低字節表示要設置的配置值)
        Set_Descriptor00000000BSET_DESCRIPTOR描述表種類(高字節,見表5)和索引(低字節)零或語言標志描述表長描述表
        Set_Feature00000000B
        00000001B
        00000010B
        SET_FEATURE特性選擇符(1表示設備,0表示端點)
        接口號
        端點號
        Set_Interface00000001BSET_INTERFACE可選設置接口號
        Synch_Frame100000010BSYNCH_FRAME端點號幀號
        其中bRequest為命令編碼值,含意見表3:
        表3、USB標準命令的編碼值
        bRequestValue
        GET_STATUS0
        CLEAR_FEATURE1
        為將來保留2
        SET_FEATURE3
        為將來保留4
        SET_ADDRESS5
        GET_DESCRIPTOR6
        SET_DESCRIPTOR7
        GET_CONFIGURATION8
        SET_CONFIGURATION9
        GET_INTERFACE10
        SET_INTERFACE11
        SYNCH_FRAME12

        二、USB描述符
          USB協議為USB設備定義了一套描述設備功能和屬性的有固定結構的描述符,包括標準的描述符即設備描述符、配置描述符、接口描述符、端點描述符和字符串描述符,還有百標準描述符,如類描述符。USB設備通過這些描述符向USB主機匯報設備的各種各樣屬性,主機通過對這些描述符的訪問對設備進行類型識別、配置并為其提供相應的客戶端驅動程序。
          USB設備通過描述符反映自己的設備特性。USB描述符是由特定格式排列的一組數據結構組成。
          在USB設備枚舉過程中,主機端的協義軟件需要解析從USB設備讀取的所有描述符信息。在USB主向設備發送讀取描述符的請求后,USB設備將所有的描述符以連續的數據流方式傳輸給USB主機。主機從第一個讀到的字符開始,根據雙方規定好的數據格式,順序地解析讀到的數據流。
          USB描述符包含標準描述符、類描述符和廠商特定描述3種形式。任何一種設備必須USB標準描述符(隊字符串描述符可選外)。
          在USB1.X中,規定了5種標準描述符:設備描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端點描述符(Endpoint Descriptor)和字符串描述符(String Descriptor)。
          每個USB設備只有一個設備描述符,而一個設備中可包含一個或多個配置描述符,即USB設備可以有多種配置。設備的每一個配置中又可以包含一個或多個接口描述符,即USB設備可以支持多種功能(接口),接口的特性通過描述符提供。
          在USB主機訪問USB設備的描述符時,USB設備依照設備描述符、配置描述符、接口描述符、端點描述符、字符串描述符順序將所有描述符傳給主機。一設備至少要包含設備描述符、配置描述符和接口描述符,如果USB設備沒有端點描述符,則它僅僅用默認管道與主機進行數據傳輸。
        1、設備描述符
          設備描述符給出了USB設備的一般信息,包括對設備及在設備配置中起全程作用的信息,包括制造商標識號ID、產品序列號、所屬設備類號、默認端點的最大包長度和配置描述符的個數等。一個USB設備必須有且僅有一個設備描述符。設備描述符是設備連接到總線上時USB主機所讀取的第一個描述符,它包含了14個字段,結構如下:
        表4、USB設備描述符的結構
        偏移量大小描述
        0bLength1數字此描述表的字節數
        1bDecriptorType1常量描述符的類型(此處應為0x01,即設備描述符)
        2bcdUSB2BCD碼此設備與描述表兼容的USB設備說明版本號(BCD碼)
        4bDeviceClass1設備類碼:
        如果此域的值為0則一個設置下每個接口指出它自己的類,各個接口各自獨立工作。
        如果此域的值處于1~FEH之間,則設備在不同的接口上支持不同的類。并這些接口可能不能獨立工作。此值指出了這些接口集體的類定義。
        如果此域設為FFH,則此設備的類由廠商定義。
        5bDeviceSubClass1子類子類挖碼
        這些碼值的具體含義根據bDeviceClass域來看。
        如bDeviceClass域為零,此域也須為零
        如bDeviceClass域為FFH,此域的所有值保留。
        6bDevicePortocol1協議協議碼
        這些碼的值視bDeviceClass和bDeviceSubClass的值而定。
        如果設備支持設備類相關的協議,此碼標志了設備類的值。如果此域的值為零,則此設備不支持設備類相關的協議,然而,可能它的接口支持設備類相關的協議。如果此域的值為FFH,此設備使用廠商定義的協議。
        7bMaxPacketSize01數字端點0的最大包大小(僅8,16,32,64
        為合法值)
        8idVendor2ID廠商標志(由USB-IF組織賦值)
        10idProduct2ID產品標志(由廠商賦值)
        12bcdDevice2BCD碼設備發行號(BCD碼)
        14iManufacturer1索引描述廠商信息的字符串描述符的索引值。
        15iProduct1索引描述產品信息的字串描述符的索引值。
        16iSerialNumber1索引描述設備序列號信息的字串描述符的索引值。
        17bNumConfigurations1數字可能的配置描述符數目
        其中bDescriptorType為描述符的類型,其含義可查下表(此表也適用于標準命令Get_Descriptor中wValue域高字節的取值含義):
        表5、USB描述符的類型值
        類型描述符描述符值
        標準描述符設備描述符(Device Descriptor)0x01
        配置描述符(Configuration Descriptor)0x02
        字符串描述符(String Descriptor)0x03
        接口描述符(Interface Descriptor)0x04
        端點描述符(EndPont Descriptor)0x05
        類描述符集線器類描述符(Hub Descriptor)0x29
        人機接口類描述符(HID)0x21
        廠商定義的描述符0xFF
        設備類代碼bDeviceClass可查下表:
        表6、設備的類別(bDeviceClass)
        值(十進制)值(十六進制)說明
        00x00接口描述符中提供類的值
        20x02通信類
        90x09集線器類
        2200xDC用于診斷用途的設備類
        2240xE0無線通信設備類
        2550xFF廠商定義的設備類
        下表列出了一個USB鼠標的設備描述符的例子,供大家分析一下:
        表7、一種鼠標的設備描述符示例
        字段描述符值(十六制)
        bLength0x12
        bDecriptorType0x01
        bcdUSBx0110
        bDeviceClass0x00
        bDeviceSubClass0x00
        bDevicePortocol0x00
        bMaxPacketSize00x08
        idVendor0x045E(Microsoft Corporation)
        idProduct0x0047
        bcdDevice0x300
        iManufacturer0x01
        iProduct0x03
        iSerialNumber0x00
        bNumConfigurations0x01
        2、配置描述符
          配置描述符中包括了描述符的長度(屬于此描述符的所有接口描述符和端點描述符的長度的和)、供電方式(自供電/總線供電)、最大耗電量等。主果主機發出USB標準命令Get_Descriptor要求得到設備的某個配置描述符,那么除了此配置描述符以外,此配置包含的所有接口描述符與端點描述符都將提供給USB主機。
        表8、USB配置描述符的結構
        偏移量大小描述
        0bLength1數字此描述表的字節數長度。
        1bDescriptorType1常量配置描述表類型(此處為0x02)
        2wTotalLength2數字此配置信息的總長(包括配置,接口,端點和設備類及廠商定義的描述符)
        4bNumInterfaces1數字此配置所支持的接口個數
        5bCongfigurationValue1數字在SetConfiguration()請求中用作參數來選定此配置。
        6iConfiguration1索引描述此配置的字串描述表索引
        7bmAttributes1位圖配置特性:
        D7:保留(設為一)
        D6:自給電源
        D5:遠程喚醒
        D4..0:保留(設為一)
        一個既用總線電源又有自給電源的設備會在MaxPower域指出需要從總線取的電量。并設置D6為一。運行時期的實際電源模式可由GetStatus(DEVICE)請求得到。
        8MaxPower1 mA在此配置下的總線電源耗費量。以2mA為一個單位。
        下面是一種硬盤的配置描述符示例:
        表9、一種硬盤的配置描述符示例
        字段描述符值(十六進制)
        bLength0x09
        bDescriptorType0x02
        wTotalLength0x01F
        bNumInterfaces0x01
        bCongfigurationValue0x01
        iConfiguration0x00
        bmAttributes0x0C
        MaxPower0x32
        3、接口描述符
          配置描述符中包含了一個或多個接口描述符,這里的“接口”并不是指物理存在的接口,在這里把它稱之為“功能”更易理解些,例如一個設備既有錄音的功能又有揚聲器的功能,則這個設備至少就有兩個“接口”。
          如果一個配置描述符不止支持一個接口描述符,并且每個接口描述符都有一個或多個端點描述符,那么在響應USB主機的配置描述符命令時,USB設備的端點描述符總是緊跟著相關的接口描述符后面,作為配置描述符的一部分被返回。接口描述符不可直接用Set_Descriptor和Get_Descriptor來存取。
          如果一個接口僅使用端點0,則接口描述符以后就不再返回端點描述符,并且此接口表現的是一個控制接口的特性,它使用與端點0相關聯的默認管道進行數據傳輸。在這種情況下bNumberEndpoints域應被設置成0。接口描述符在說明端點個數并不把端點0計算在內。
        表10、USB接口描述符的結構
        偏移量大小說明
        0bLength1數字此表的字節數
        1bDescriptorType1常量接口描述表類(此處應為0x04)
        2bInterfaceNumber1數字接口號,當前配置支持的接口數組索引(從零開始)。
        3bAlternateSetting1數字可選設置的索引值。
        4bNumEndpoints1數字此接口用的端點數量,如果是零則說明此接口只用缺省控制管道。
        5bInterfaceClass 1接口所屬的類值:
        零值為將來的標準保留。
        如果此域的值設為FFH,則此接口類由廠商說明。
        所有其它的值由USB說明保留。
        6bInterfaceSubClass 1子類子類碼
        這些值的定義視bInterfaceClass域而定。
        如果bInterfaceClass域的值為零則此域的值必須為零。
        bInterfaceClass域不為FFH則所有值由USB所保留。
        7bInterfaceProtocol 1協議協議碼:bInterfaceClass和bInterfaceSubClass域的值而定.如果一個接口支持設備類相關的請求此域的值指出了設備類說明中所定義的協議.
        8iInterface 1索引描述此接口的字串描述表的索引值。
        對于bInterfaceClass字段,表示接口所屬的類別,USB協議根據功能將不同的接口劃分成不的類,其具體含義如下表所示:
        表11、USB協議定義的接口類別(bInterfaceClass)
        值(十六進制)類別
        0x01音頻類
        0x02CDC控制類
        0x03人機接口類(HID)
        0x05物理類
        0x06圖像類
        0x07打印機類
        0x08大數據存儲類
        0x09集線器類
        0x0ACDC數據類
        0x0B智能卡類
        0x0D安全類
        0xDC診斷設備類
        0xE0無線控制器類
        0xFE特定應用類(包括紅外的橋接器等)
        0xFF廠商定義的設備
        4、端點描述符
          端點是設備與主機之間進行數據傳輸的邏輯接口,除配置使用的端點0(控制端點,一般一個設備只有一個控制端點)為雙向端口外,其它均為單向。端點描述符描述了數據的傳輸類型、傳輸方向、數據包大小和端點號(也可稱為端點地址)等。
          除了描述符中描述的端點外,每個設備必須要有一個默認的控制型端點,地址為0,它的數據傳輸為雙向,而且沒有專門的描述符,只是在設備描述符中定義了它的最大包長度。主機通過此端點向設備發送命令,獲得設備的各種描述符的信息,并通過它來配置設備。
        表12、USB端點描述符的結構
        偏移量大小說明
        0bLength1數字此描述表的字節數長度
        1bDescriptorType1常量端點描述表類(此處應為0x05)
        2bEndpointAddress1端點此描述表所描述的端點的地址、方向:
        Bit 3..0 :端點號.
        Bit 6..4 :保留,為零
        Bit 7:方向,如果控制端點則略。
        0:輸出端點(主機到設備)
        1:輸入端點(設備到主機)
        3bmAttributes1位圖此域的值描述的是在bConfigurationValue域所指的配置下端點的特性。
        Bit 1..0 :傳送類型
        00=控制傳送
        01=同步傳送
        10=批傳送
        11=中斷傳送
        所有其它的位都保留。
        4wMaxPacketSize2數字當前配置下此端點能夠接收或發送的最大數據包的大小。
        對于實進傳輸,此值用于為每幀的數據凈負荷預留時間。在實際運行時,管道可能不完全需要預留的帶寬,實際帶寬可由設備通過一種非USB定義的機制匯報給主機。對于中斷傳輸,批量傳輸和控制傳輸,端點可能發送比之短的數據包
        6bInterval1數字周期數據傳輸端點的時間間隙。
        此域的值對于批傳送的端點及控制傳送的端點無意義。對于同步傳送的端點此域必需為1,表示周期為1ms。對于中斷傳送的端點此域值的范圍為1ms到255ms。
        下表是一種鼠標的端點描述符的示例,該端點是一個中斷端點:
        表13、一種鼠標的端點描述符示例
        值(十六進制)
        bLength0x07
        bDescriptorType0x05
        bEndpointAddress0x81
        bmAttributes0x03
        wMaxPacketSize0x04
        bInterval0x0A
        5、字符串描述符
          字符串描述符是一種可選的USB標準描述符,描述了如制商、設備名稱或序列號等信息。如果一個設備無字符串描述符,則其它描述符中與字符串有關的索引值都必須為0。字符串使用的是Unicode編碼。
          主機請示得到某個字符串描述符時一般分成兩步:首先主機向設備發出USB標準命令Get_Descriptor,其中所使用的字符串的索引值為0,設備返回一個字符串描述符,此描述符的結構如下:
        表14、USB字符串描述符(響應主機請求時返回的表示語言ID的字符串描述符)
        偏移量大小描述
        0bLength1N+2此描述表的字節數
        1bDescriptorType1常量字串描述表類型(此處應為0x03)
        2wLANGID[0]2數字語言標識(LANGID)
        碼0

        NwLANGID[x]2數字語言標識(LANGID)
        碼X
        該字符串描述符雙字節的語言ID的數組,wLANGID[0]~wLANGID[x]指明了設備支持的語言,具體含義可查看USB_LANGIDs.pdf。
          主機根據自己需要的語言,再次向設備發出USB標準命令Get_Descriptor,指明所要求得到的字符串的索引值和語言。這次設備所返回的是Unicode編號的字符串描述符,其結構如下:
        表15、Unicode字符串描述符(響應主機請求時真正表示字符串編碼的字符串描述符)
        偏移量大小描述
        0bLength1數字此描述表的字節數(bString域的數值N+2)
        1bDescriptorType1常量字串描述表類型(此處應為0x03)
        2bStringN數字UNICODE編碼的字串
        bString域為設備實際返回的以UNICODE編碼的字符串流,我們在編寫設備端硬件驅動的時候需要將字符串轉換為UNICODE編碼,您可以通過一些UNICODE轉換工具進行轉換。


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 临邑县| 江门市| 德庆县| 孟连| 南部县| 镇平县| 屏东县| 仪征市| 吴川市| 西华县| 灵寿县| 万安县| 防城港市| 普格县| 海淀区| 博湖县| 屯留县| 桦川县| 井陉县| 西盟| 丽江市| 清丰县| 岢岚县| 精河县| 庆云县| 凌源市| 定结县| 嘉禾县| 定州市| 上林县| 兴和县| 德令哈市| 郸城县| 尼勒克县| 池州市| 天门市| 兴业县| 当雄县| 历史| 土默特左旗| 伊宁县|