usb描述符詳細講解


在USB中USB HOST 是通過各種描述符來識別設備的,有 設備描述符,接口描述符,端點描述符,字符描述符,報告描述符

USB HID 設備是通過報告來傳送數據的,報告有: 輸入報告 和 輸出報告
輸入報告:是設備發送給主機的,例如 usb鼠標將鼠標移動和鼠標點擊的信息返回給電腦,鍵盤將按鍵數據返回給電腦。
輸出報告:是主機發送給USB設備的,例如鍵盤上的數字鍵盤鎖定燈和大寫字母鎖定燈等。報告是一個數據包,里面包含的是所要傳送的數據。
輸入報告是通過中斷輸入端點輸入的。
報告描述符:是描述一個報告以及報告里面的數據是用來干什么的。通過它,USB HOST 可以 分析出報告里面的數據所要表達的意思。
 
USB電氣特性
標准USB使用4根線:5V電源線(VBus),差分數據線負(D-),差分數據線正(D+),地(GND)
USB線纜及插頭插座
USB設備的插入檢測機制
USB主機如何檢測到設備插入的那?首先在USB集線器的每個下游端口的D+和D-上,分別接上一個15K的下拉電阻,而在USB設備端,在D+
或者D-上接上1.5K的上拉電阻,高速設備接在D+上,低俗設備上拉接在D-上。這樣當有設備插入到集線器時,就將差分數據線上的一條拉高了,集線器檢測到這個狀態后,它就報告給USB主控制器,這樣就檢測到設備插入了。
USB設備的枚舉過程
usb主機檢測到USB設備插入后,就要對設備進行枚舉了。枚舉的作用就是從設備是那個讀取一些信息,知道設備是什么樣的設備,如果通信,這樣主機就可以根據這些信息假造合適的驅動程序。調試USB設備,很重要的一點就是USB枚舉過程,只要枚舉成功了,那就成功一大半了。
USB的一種傳輸模式---控制傳輸
這種傳輸在USB中是非常重要的,它保證數據的正確性,在設備的枚舉過程中都是控制傳輸。
控制傳輸分為三個過程:1.建立過程;2可選的數據過程;3狀態過程。
建立過程都是由USB主機發起,它開始於一個Setup令牌包,后面緊跟着一個DATA0包,如果是控制輸入傳輸,那么數據過程就是輸入數據;如果控制輸出傳輸,那么數據過程就是輸出數據。數據過程之后是狀態過程。狀態過程剛好與數據過程的數據傳輸放喜愛那個相反。
首先:主機檢測到USB設備插入后,就會先對設備進行復位,復位后,USB主機就會對地址為0的設備發送獲取設備描述符的標准請求。所有的USB設備在總線復位后其地址都為0,這樣主機就可以跟那些剛剛插入的設備通過地址0通信,
獲取玩 設備描述符后,主機就會獲取 配置描述符9個字節, 主機獲取到配置描述符后,根據里面的配置集合總長度,在獲取配置結合。配置集合包括配置描述符,接口描述符,端點描述符等。
USB的描述以及各種描述符之間的依賴關系
 
 
 
一個USB設備只有一個設備描述符--N1配置描述符 -----N個接口描述符--------N個端點描述符:定義了端點的大小和類型
                                                        N2配置描述符
                                                        N3配置描述符
                                                        。。。
主機獲取描述符時,1獲取設備描述符->2獲取配置描述符
設備描述符記錄的信息有:設備所使用的USB協議版本號,設備類型,端點0的最大包大小,廠商ID(VID)和產品ID(PID),設備版本號,廠商字符串索引,產品字符串索引,設備序列號索引,可能的配置數。
配置的描述符主要記錄的信息有:配置所包含的接口數,配置的編號,供電方式馬事發支持遠程喚醒,電流需求量
接口描述符:只要記錄接口編號,接口的端點數,接口所使用的類子類協議。
端點描述符:端點號,方向,端點的傳輸類型,最大包長度,查詢時間間隔。
字符串描述符:提供一些方便人們查閱的信息不是必須的。
USB總線上傳輸數據以包為基本單位。一個包被分成不同的域。根據不同類型的包,所包含的域是不一樣的,但是不通的包有共同的特點,就是同步域開始緊跟着一個包標識符PID,最終以包結束符EOP來結束這個包。
包標識符PID是用來標識一個包的類型。它總共有8位,其中USB協議使用的只有4位,PID0~PID3 另外4位PID4~PID7是PID0~PID3的取反用來檢驗PID。USB協議規定了4類包,
令牌包PID1~0 為01,
數據包PID1~0為11
握手包PID1~0為10
特殊包PID1~0為00不同類的包又分成幾種具體的包。
令牌包:用來啟動一次USB傳輸。輸出,輸入,建立和幀起始。
 
 
 
 

設備描述符:一個設備只有一個設備描述符

typedef struct _USB_DEVICE_DESCRIPTOR_
{
    BYTE        bLength,
    BYTE        bDescriptorType,
    WORD      bcdUSB,
    BYTE        bDeviceClass,
    BTYE        bDeviceSubClass,
    BYTE        bDeviceProtol,
    BYTE        bMaxPacketSize0,
    WORD      idVenderI,
    WORD      idProduct,
    WORD      bcdDevice,
    BYTE        iManufacturer,
    BYTE        iProduct,
    BYTE        iSerialNumber,
    BYTE        iNumConfiguations
}USB_DEVICE_DESCRIPTOR;

bLength : 描述符大小.固定為0x12.
bDescriptorType : 設備描述符類型.固定為0x01.
bcdUSB : USB 規范發布號.表示了本設備能適用於那種協議,如2.0=0200,1.1=0110等.

bDeviceClass : 類型代碼(由USB指定)。當它的值是0時,表示所有接口在配置描述符里,並且所有接口是獨立的。當它的值是1到FEH時,表示不同的接口關聯的。當它的值是FFH時,它是廠商自己定義的.
bDeviceSubClass : 子類型代碼(由USB分配).如果bDeviceClass值是0,一定要設置為0.其它情況就跟據USB-IF組織定義的編碼.
bDeviceProtocol : 協議代碼(由USB分配).如果使用USB-IF組織定義的協議,就需要設置這里的值,否則直接設置為0。如果廠商自己定義的可以設置為FFH.
bMaxPacketSize0 : 端點0最大分組大小(只有8,16,32,64有效).

idVendor : 供應商ID(由USB分配).

idProduct : 產品ID(由廠商分配).由供應商ID和產品ID,就可以讓操作系統加載不同的驅動程序.

bcdDevice : 設備出產編碼.由廠家自行設置.

iManufacturer : 廠商描述符字符串索引.索引到對應的字符串描述符. 為0則表示沒有.
iProduct : :產品描述符字符串索引.同上.
iSerialNumber : 設備序列號字符串索引.同上.
bNumConfigurations : 可能的配置數.指配置字符串的個數
                                                        
 
 
 
配置描述符:配置描述符定義了設備的配置信息,一個設備可以有多個配置描述符
typedef struct _USB_CONFIGURATION_DESCRIPTOR_
{
    BYTE      bLength,
    BYTE      bDescriptorType,
    WORD    wTotalLength,
    BYTE      bNumInterfaces,
    BYTE      bConfigurationValue,
    BYTE      iConfiguration,
    BYTE      bmAttributes,
    BYTE      MaxPower
}USB_CONFIGURATION_DESCRIPTOR;

bLength : 描述符大小.固定為0x09.
bDescriptorType : 配置描述符類型.固定為0x02.
wTotalLength : 返回整個數據的長度.指此配置返回的配置描述符,接口描述符以及端點描述符的全部大小.
bNumInterfaces : 配置所支持的接口數.指該配置配備的接口數量,也表示該配置下接口描述符數量.
bConfigurationValue : 作為Set Configuration的一個參數選擇配置值.
iConfiguration : 用於描述該配置字符串描述符的索引.
bmAttributes : 供電模式選擇.Bit4-0保留,D7:總線供電,D6:自供電,D5:遠程喚醒.
MaxPower : 總線供電的USB設備的最大消耗電流.以2mA為單位.
 
 
接口描述符:接口描述符說明了接口所提供的配置,一個配置所擁有的接口數量通過配置描述符的bNumInterfaces決定
typedef struct _USB_INTERFACE_DESCRIPTOR_
{
    BYTE      bLength,
    BYTE      bDescriptorType,
    BYTE      bInterfaceNumber,
    BYTE      bAlternateSetting,
    BYTE      bNumEndpoint,
    BYTE      bInterfaceClass,
    BYTE      bInterfaceSubClass,
    BYTE      bInterfaceProtocol,
    BYTE      iInterface
}USB_INTERFACE_DESCRIPTOR;

bLength : 描述符大小.固定為0x09.
bDescriptorType : 接口描述符類型.固定為0x04.
bInterfaceNumber: 該接口的編號.
bAlternateSetting : 用於為上一個字段選擇可供替換的位置.即備用的接口描述符標號.
bNumEndpoint : 使用的端點數目.端點0除外.
bInterfaceClass : 類型代碼(由USB分配).
bInterfaceSubClass : 子類型代碼(由USB分配).
bInterfaceProtocol : 協議代碼(由USB分配).
iInterface : 字符串描述符的索引
 
端點描述符:USB設備中的每個端點都有自己的端點描述符,由接口描述符中的bNumEndpoint決定其數量
typedef struct _USB_ENDPOINT_DESCRIPTOR_
{
    BYTE        bLength,
    BYTE        bDescriptorType,
    BYTE        bEndpointAddress,
    BYTE        bmAttributes,
    WORD      wMaxPacketSize,
    BYTE        bInterval
}USB_ENDPOINT_DESCRIPTOR;

bLength : 描述符大小.固定為0x07.
bDescriptorType : 接口描述符類型.固定為0x05.
bEndpointType : USB設備的端點地址.Bit7,方向,對於控制端點可以忽略,1/0:IN/OUT.Bit6-4,保留.BIt3-0:端點號.
bmAttributes : 端點屬性.Bit7-2,保留.BIt1-0:00控制,01同步,02批量,03中斷.
wMaxPacketSize : 本端點接收或發送的最大信息包大小.
bInterval : 輪訓數據傳送端點的時間間隔.對於批量傳送和控制傳送的端點忽略.對於同步傳送的端點,必須為1,對於中斷傳送的端點,范圍為1-255.
字符串描述符:其中字符串描述符是可選的.如果不支持字符串描述符,其設備,配置,接口描述符內的所有字符串描述符索引都必須為0
typedef struct _USB_STRING_DESCRIPTION_
{
    BYTE      bLength,
    BYTE      bDescriptionType,
    BYTE      bString[1];
}USB_STRING_DESCRIPTION;

bLength : 描述符大小.由整個字符串的長度加上bLength和bDescriptorType的長度決定.
bDescriptorType : 接口描述符類型.固定為0x03.
bString[1] : Unicode編碼字符串.
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM