USB描述符詳解

來源:互聯網
上載者:User

一、基本概念  

  1、USB協議本身很複雜,但方便在提供了統一的介面方式,使得驅動程式在使用裝置的時候,工作簡化到了類似操作串列介面。

  2、USB裝置可以看作提供了多個串口的裝置,依據USB的規範,我們將每個串口稱作端點(Endpoint),要和這個端點通訊,我們就要開啟到這個端點的串連,這個串連就是管道(Pipe)。

  3、開啟端點之後,就可以像串口一樣進行資料轉送了。USB有4種不同類型的傳輸方式:控制傳輸(Control Transfer),批量傳輸(Bulk Transfer),中斷傳輸(Interrupt Transfer)和即時傳輸(IsochTransfer)。

  4、由於一個裝置可能要適應多種情況,端點的設定會有多套,以備使用。端點設定稱為介面(Interface)。USB裝置展現給我們能夠找到的東西就是這些Interface,我們選擇要用的Interface,就可以找到Endpoint,再開啟Endpoint,就可以傳輸資料了。所以,在驅動程式開始的時候,需要記錄下這些Interface。

  5、例如:OV511+的端點0是控制端點,用來設定參數以及起停裝置;端點1是即時傳輸端點,用來傳輸視頻。端點1有8套不同的設定,主要區別就在於一次傳輸的資料幀的大小,所以在USBDeviceAttach的時候,要記錄這些設定到驅動程式中,後面才能夠選用。

二、描述符介紹
   標準的USB裝置有5種USB描述符:裝置描述符,配置描述符,字串描述符,介面描述符,端點描述符。下面詳解:

1、裝置描述符:一個裝置只有一個裝置描述符

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 : 可能的配置數.指配置字串的個數 2、配置描述符:配置描述符定義了裝置的配置資訊,一個裝置可以有多個配置描述符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為單位.3、介面描述符:介面描述符說明了介面所提供的配置,一個配置所擁有的介面數量通過配置描述符的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分配).
bInterfaceSunClass : 子類型代碼(由USB分配).
bInterfaceProtocol : 協議代碼(由USB分配).
iInterface : 字串描述符的索引4、端點描述符: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.5、字串描述符:其中字串描述符是可選的.如果不支援字串描述符,其裝置,配置,介面描述符內的所有字串描述符索引都必須為0typedef struct _USB_STRING_DESCRIPTION_
{
    BYTE      bLength,
    BYTE      bDescriptionType,
    BYTE      bString[1];
}USB_STRING_DESCRIPTION;

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.