一、基本概念
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編碼字串.