• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

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

            一、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命令的結構
            偏移量  長度(字節) 描述
            0 bmRequestType 1 位圖 請求特征:
            D7:傳輸方向 
            0=主機至設備 
            1=設備至主機 
            D6..5:種類 
            0=標準 
            1=類 
            2=廠商 
            3=保留 
            D4..0:接受者 
            0=設備 
            1=接口 
            2=端點 
            3=其他 
            4..31 保留
            1 bRequest 1 命令類型編碼值(見表3)
            2 wValue 2 根據不同的命令,含義也不同
            4 wIndex 2 索引或偏移 根據不同的命令,含義也不同,主要用于傳送索引或偏 移
            6 wLength 2   如有數據傳送階段,此為數據字節數。

             

            下表列出了USB的11種標準命令

             

            表2、USB的11種標準命令
            命令

            bmRequestType

            bRequest

            wValue

            wIndex

            wLength

            Data

            Clear_Feature

            00000000B
            00000001B
            00000010B

            CLEAR_FEATURE

            特性選擇符

            零 
            接口號 
            端點號

            Get_Configuration

            10000000B

            GET_CONFIGURATION

            配置值

            Get_Descriptor

            10000000B

            GET_DESCRIPTOR

            描述表種類(高字節,見表5)和索引(低字節)

            零或語言標志

            描述表長

            描述表

            Get_Interface

            10000001B

            GET_INTERFACE

            接口號

            可選設置

            Get_Status

            10000000B
            10000001B
            10000010B

            GET_STATUS

            零(返回設備狀態)
            接口號(對像時接口時)
            端點號(對象是端點時)

            設備,
            接口 ,或 
            端點狀態

            Set_Address

            00000000B

            SET_ADDRESS

            設備地址

            Set_Configuration

            00000000B

            SET_CONFIGURATION

            配置值(高字節為0,低字節表示要設置的配置值)

            Set_Descriptor

            00000000B

            SET_DESCRIPTOR

            描述表種類(高字節,見表5)和索引(低字節)

            零或語言標志

            描述表長

            描述表

            Set_Feature

            00000000B
            00000001B
            00000010B

            SET_FEATURE

            特性選擇符(1表示設備,0表示端點)

            零 
            接口號 
            端點號

            Set_Interface

            00000001B

            SET_INTERFACE

            可選設置

            接口號

            Synch_Frame

            100000010B

            SYNCH_FRAME

            端點號

            幀號

             

            其中bRequest為命令編碼值,含意見表3:

             

            表3、USB標準命令的編碼值

            bRequest

            Value

            GET_STATUS

            0

            CLEAR_FEATURE

            1

            為將來保留

            2

            SET_FEATURE

            3

            為將來保留

            4

            SET_ADDRESS

            5

            GET_DESCRIPTOR

            6

            SET_DESCRIPTOR

            7

            GET_CONFIGURATION

            8

            SET_CONFIGURATION

            9

            GET_INTERFACE

            10

            SET_INTERFACE

            11

            SYNCH_FRAME

            12

             

             

            二、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設備描述符的結構

            偏移量

            大小

            描述

            0

            bLength

            1

            數字

            此描述表的字節數

            1

            bDecriptorType

            1

            常量

            描述符的類型(此處應為0x01,即設備描述符)

            2

            bcdUSB

            2

            BCD碼

            此設備與描述表兼容的USB設備說明版本號(BCD 碼)

            4

            bDeviceClass

            1

            設備類碼:
            如果此域的值為0則一個設置下每個接口指出它自己的類,各個接口各自獨立工作。 
            如果此域的值處于1~FEH之間,則設備在不同的接口上支持不同的類。并這些接口可能不能獨立工作。此值指出了這些接口集體的類定義。 
            如果此域設為FFH,則此設備的類由廠商定義。

            5

            bDeviceSubClass

            1

            子類

            子類挖碼 
            這些碼值的具體含義根據bDeviceClass 域來看。 
            如bDeviceClass 域為零,此域也須為零 
            如bDeviceClass 域為FFH,此域的所有值保留。

            6

            bDevicePortocol

            1

            協議

            協議碼 
            這些碼的值視bDeviceClass 和 bDeviceSubClass 的值而定。 
            如果設備支持設備類相關的協議,此碼標志了設備類的值。如果此域的值為零,則此設備不支持設備類相關的協議,然而,可能它的接口支持設備類相關的協議。如果此域的值為FFH,此設備使用廠商定義的協議。

            7

            bMaxPacketSize0

            1

            數字

            端點0的最大包大小(僅8,16,32,64
            為合法值)

            8

            idVendor

            2

            ID

            廠商標志(由USB-IF組織賦值)

            10

            idProduct

            2

            ID

            產品標志(由廠商賦值)

            12

            bcdDevice

            2

            BCD 碼

            設備發行號(BCD 碼)

            14

            iManufacturer

            1

            索引

            描述廠商信息的字符串描述符的索引值。

            15

            iProduct

            1

            索引

            描述產品信息的字串描述符的索引值。

            16

            iSerialNumber

            1

            索引

            描述設備序列號信息的字串描述符的索引值。

            17

            bNumConfigurations

            1

            數字

            可能的配置描述符數目

             

            其中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)
            值(十進制)
            值(十六進制)
            說明
            0
            0x00
            接口描述符中提供類的值
            2
            0x02
            通信類
            9
            0x09
            集線器類
            220
            0xDC
            用于診斷用途的設備類
            224
            0xE0
            無線通信設備類
            255
            0xFF
            廠商定義的設備類

             

            下表列出了一個USB鼠標的設備描述符的例子,供大家分析一下:

             

            表7、一種鼠標的設備描述符示例
            字段 描述符值(十六制)

            bLength

            0x12

            bDecriptorType

            0x01

            bcdUSB

            x0110

            bDeviceClass

            0x00

            bDeviceSubClass

            0x00

            bDevicePortocol

            0x00

            bMaxPacketSize0

            0x08

            idVendor

            0x045E(Microsoft Corporation)

            idProduct

            0x0047

            bcdDevice

            0x300

            iManufacturer

            0x01

            iProduct

            0x03

            iSerialNumber

            0x00

            bNumConfigurations

            0x01

             

            2、配置描述符

              配置描述符中包括了描述符的長度(屬于此描述符的所有接口描述符和端點描述符的長度的和)、供電方式(自供電/總線供電)、最大耗電量等。主果主機發出USB標準命令Get_Descriptor要求得到設備的某個配置描述符,那么除了此配置描述符以外,此配置包含的所有接口描述符與端點描述符都將提供給USB主機。

             

            表8、USB配置描述符的結構

               偏移量

                 域

             大小

               值

               描述

                  0

            bLength

            1

               數字

            此描述表的字節數長度。

                  1

            bDescriptorType

            1

               常量

            配置描述表類型(此處為0x02)

                  2

            wTotalLength

            2

               數字

            此配置信息的總長(包括配置,接口,端點和設備類及廠商定義的描述符)

                  4

            bNumInterfaces

            1

               數字

            此配置所支持的接口個數

                  5

            bCongfigurationValue

            1

               數字

            在SetConfiguration()請求中用作參數來選定此配置。

                  6

            iConfiguration

            1

               索引

            描述此配置的字串描述表索引

                  7

            bmAttributes

            1

               位圖

            配置特性: 
            D7: 保留(設為一) 
            D6: 自給電源 
            D5: 遠程喚醒 
            D4..0:保留(設為一) 
            一個既用總線電源又有自給電源的設備會在MaxPower域指出需要從總線取的電量。并設置D6為一。運行時期的實際電源模式可由GetStatus(DEVICE) 請求得到。

                  8

            MaxPower

            1

                mA

            在此配置下的總線電源耗費量。以 2mA 為一個單位。

             

            下面是一種硬盤的配置描述符示例:

             

            表9、一種硬盤的配置描述符示例
            字段 描述符值(十六進制)

            bLength

            0x09

            bDescriptorType

            0x02

            wTotalLength

            0x01F

            bNumInterfaces

            0x01

            bCongfigurationValue

            0x01

            iConfiguration

            0x00

            bmAttributes

            0x0C

            MaxPower

            0x32

             

            3、接口描述符

              配置描述符中包含了一個或多個接口描述符,這里的“接口”并不是指物理存在的接口,在這里把它稱之為“功能”更易理解些,例如一個設備既有錄音的功能又有揚聲器的功能,則這個設備至少就有兩個“接口”。

              如果一個配置描述符不止支持一個接口描述符,并且每個接口描述符都有一個或多個端點描述符,那么在響應USB主機的配置描述符命令時,USB設備的端點描述符總是緊跟著相關的接口描述符后面,作為配置描述符的一部分被返回。接口描述符不可直接用Set_Descriptor和Get_Descriptor來存取。

              如果一個接口僅使用端點0,則接口描述符以后就不再返回端點描述符,并且此接口表現的是一個控制接口的特性,它使用與端點0相關聯的默認管道進行數據傳輸。在這種情況下bNumberEndpoints域應被設置成0。接口描述符在說明端點個數并不把端點0計算在內。

             

            表10、USB接口描述符的結構

            偏移量

            大小

            說明

                   0

            bLength

            1

            數字

            此表的字節數

                   1

            bDescriptorType

            1

            常量

            接口描述表類(此處應為0x04)

                   2

            bInterfaceNumber

            1

            數字

            接口號,當前配置支持的接口數組索引(從零開始)。

                   3

            bAlternateSetting

            1

            數字

            可選設置的索引值。

                   4

            bNumEndpoints

            1

            數字

            此接口用的端點數量,如果是零則說明此接口只用缺省控制管道。

                   5

            bInterfaceClass

                    1

            接口所屬的類值: 
            零值為將來的標準保留。 
            如果此域的值設為FFH,則此接口類由廠商說明。 
            所有其它的值由USB 說明保留。

                   6

            bInterfaceSubClass

                    1

            子類

            子類碼 
            這些值的定義視bInterfaceClass域而定。
            如果bInterfaceClass域的值為零則此域的值必須為零。 
            bInterfaceClass域不為FFH則所有值由USB 所保留。

                   7

            bInterfaceProtocol

                    1

            協議

            協議碼:bInterfaceClass 和bInterfaceSubClass 域的值而定.如果一個接口支持設備類相關的請求此域的值指出了設備類說明中所定義的協議.

                   8

            iInterface

                    1

            索引

            描述此接口的字串描述表的索引值。

             

            對于bInterfaceClass字段,表示接口所屬的類別,USB協議根據功能將不同的接口劃分成不的類,其具體含義如下表所示:

             

            表11、USB協議定義的接口類別(bInterfaceClass)
            值(十六進制) 類別
            0x01 音頻類
            0x02 CDC控制類
            0x03 人機接口類(HID)
            0x05 物理類
            0x06 圖像類
            0x07 打印機類
            0x08 大數據存儲類
            0x09 集線器類
            0x0A CDC數據類
            0x0B 智能卡類
            0x0D 安全類
            0xDC 診斷設備類
            0xE0 無線控制器類
            0xFE 特定應用類(包括紅外的橋接器等)
            0xFF 廠商定義的設備

             

            4、端點描述符

              端點是設備與主機之間進行數據傳輸的邏輯接口,除配置使用的端點0(控制端點,一般一個設備只有一個控制端點)為雙向端口外,其它均為單向。端點描述符描述了數據的傳輸類型、傳輸方向、數據包大小和端點號(也可稱為端點地址)等。

              除了描述符中描述的端點外,每個設備必須要有一個默認的控制型端點,地址為0,它的數據傳輸為雙向,而且沒有專門的描述符,只是在設備描述符中定義了它的最大包長度。主機通過此端點向設備發送命令,獲得設備的各種描述符的信息,并通過它來配置設備。

             

            表12、USB端點描述符的結構

            偏移量

            大小

            說明

            0

            bLength

            1

            數字

            此描述表的字節數長度

            1

            bDescriptorType

            1

            常量

            端點描述表類(此處應為0x05)

            2

            bEndpointAddress

            1

            端點

            此描述表所描述的端點的地址、方向: 
            Bit 3..0 : 端點號.
            Bit 6..4 : 保留,為零 
            Bit 7:    方向,如果控制端點則略。 
            0:輸出端點(主機到設備) 
            1:輸入端點(設備到主機)

            3

            bmAttributes

            1

            位圖

            此域的值描述的是在bConfigurationValue域所指的配置下端點的特性。 
            Bit 1..0 :傳送類型 
            00=控制傳送 
            01=同步傳送 
            10=批傳送 
            11=中斷傳送 
            所有其它的位都保留。

            4

            wMaxPacketSize

            2

            數字

            當前配置下此端點能夠接收或發送的最大數據包的大小。 
            對于實進傳輸,此值用于為每幀的數據凈負荷預留時間。在實際運行時,管道可能不完全需要預留的帶寬,實際帶寬可由設備通過一種非USB定義的機制匯報給主機。對于中斷傳輸,批量傳輸和控制傳輸,端點可能發送比之短的數據包
             

            6

            bInterval

            1

            數字

            周期數據傳輸端點的時間間隙。 
            此域的值對于批傳送的端點及控制傳送的端點無意義。對于同步傳送的端點此域必需為1,表示周期為1ms。對于中斷傳送的端點此域值的范圍為1ms到255ms。

             

            下表是一種鼠標的端點描述符的示例,該端點是一個中斷端點:

             

            表13、一種鼠標的端點描述符示例
            值(十六進制)

            bLength

            0x07

            bDescriptorType

            0x05

            bEndpointAddress

            0x81

            bmAttributes

            0x03

            wMaxPacketSize

            0x04

            bInterval

            0x0A

             

            5、字符串描述符

              字符串描述符是一種可選的USB標準描述符,描述了如制商、設備名稱或序列號等信息。如果一個設備無字符串描述符,則其它描述符中與字符串有關的索引值都必須為0。字符串使用的是Unicode編碼。

              主機請示得到某個字符串描述符時一般分成兩步:首先主機向設備發出USB標準命令Get_Descriptor,其中所使用的字符串的索引值為0,設備返回一個字符串描述符,此描述符的結構如下:

             

            表14、USB字符串描述符(響應主機請求時返回的表示語言ID的字符串描述符)

            偏移量

            大小

                 描述

            0

            bLength

            1

            N+2

            此描述表的字節數

            1

            bDescriptorType

            1

            常量

            字串描述表類型(此處應為0x03)

            2

            wLANGID[0]

            2

            數字

            語言標識(LANGID) 
            碼0

                  

            N

            wLANGID[x]

            2

            數字

            語言標識(LANGID) 
            碼X

             

            該字符串描述符雙字節的語言ID的數組,wLANGID[0]~wLANGID[x]指明了設備支持的語言,具體含義可查看USB_LANGIDs.pdf

              主機根據自己需要的語言,再次向設備發出USB標準命令Get_Descriptor,指明所要求得到的字符串的索引值和語言。這次設備所返回的是Unicode編號的字符串描述符,其結構如下:

             

            表15、Unicode字符串描述符(響應主機請求時真正表示字符串編碼的字符串描述符)

            偏移量

            大小

            描述

            0

            bLength

            1

            數字

            此描述表的字節數(bString域的數值N+2)

            1

            bDescriptorType

            1

            常量

            字串描述表類型(此處應為0x03)

            2

            bString

            N

            數字

            UNICODE 編碼的字串

             

            bString域為設備實際返回的以UNICODE編碼的字符串流,我們在編寫設備端硬件驅動的時候需要將字符串轉換為UNICODE編碼,您可以通過一些UNICODE轉換工具進行轉換。這里推薦由百合電子工作室開發的一款USB描述符生成工具“USB Unicode 字符串描述符生成器”,它專門為編寫設備端驅動程序的需要而定制,可以非常方便將您需要的字符串轉換成UNICODE格式,進而導入您的C或匯編程序代碼中,以下是它的界面:

            USB Unicode 字符串描述符生成器-生成C語言格式

            USB Unicode 字符串描述符生成器-生成匯編格式

            溫馨提示:

              百合電子工作室有一個關于USB開發方面的開源項目-Easy USB 51 Programer,整個開發過程寫得非常詳細,不防參考一下,您還可以進入她的論壇參與此項目的討論。

            注:本篇文章部分內容摘自《USB協議》和《USB技術及應用設計》

             原文地址 http://www.baiheee.com/Documents/090518/090518112619.htm

            posted on 2010-11-24 14:39 wrh 閱讀(1021) 評論(0)  編輯 收藏 引用

            導航

            <2012年3月>
            26272829123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統計

            常用鏈接

            留言簿(19)

            隨筆檔案

            文章檔案

            收藏夾

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久国产乱子伦精品免费强| 久久夜色精品国产亚洲av| 国产精品免费看久久久| 久久99国产精品久久99果冻传媒 | 久久天天躁夜夜躁狠狠| 久久综合亚洲欧美成人| 久久国产高清一区二区三区| 综合网日日天干夜夜久久 | 国内精品久久久久影院薰衣草 | 久久无码人妻一区二区三区午夜| 国产福利电影一区二区三区久久老子无码午夜伦不 | 中文字幕久久精品| 久久精品国产精品青草app| 亚洲精品tv久久久久久久久久| 国内精品久久久久久99| 2021国产精品午夜久久| 色综合久久88色综合天天| 中文字幕无码精品亚洲资源网久久| 四虎国产精品免费久久5151| 久久丫忘忧草产品| 色天使久久综合网天天 | 思思久久精品在热线热| 久久国产热这里只有精品| 久久91精品国产91久久麻豆| 狠狠色综合网站久久久久久久高清 | 国产精品美女久久久| 亚洲国产精品无码久久一线| 麻豆久久久9性大片| 天天影视色香欲综合久久| 精品免费久久久久国产一区| 99久久精品午夜一区二区| 午夜人妻久久久久久久久| 伊人久久综合精品无码AV专区| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久无码国产| 狠狠人妻久久久久久综合| 国产精品久久影院| 色综合久久久久| 国内精品久久久久久久影视麻豆| 国产精品99久久精品爆乳| 99久久夜色精品国产网站|