轉:https://blog.csdn.net/u011594613/article/details/48291307編程
1、USB硬件介紹
1.一、概述數據結構
一條USB傳輸線分別由地線、電源線、D+和D-四條線構成,D+和D-是差分輸入線,它使用的是3.3V的電壓(與CMOS的5V電平不一樣),而電源線和地線可向設備提供5V電壓,最大電流爲500mA(能夠在編程中設置)。
USB設備能夠直接和HOST通訊,或者經過Hub和Host通訊。一個USB系統中僅有一個USB 主機,設備包括USB功能設備和USB HUB,最多支持127個設備。物理鏈接指的是USB傳輸線。在USB 2.0系統中要求使用屏蔽雙絞線。
1.二、USB HUB
USB HUB提供了一種低成本、低複雜度的USB接口擴展方法。HUB的上行PORT面向HOST,下行PORT面向設備(HUB或功能設備)。在下行PORT上,HUB提供了設備鏈接檢測和設備移除檢測的能力,並給各下行PORT供電。HUB能夠單獨使能各下行PORT。不一樣PORT能夠工做在不一樣的速度等級(高速/全速/低速)。
若是USB設備經過集線器和Host通訊,主機集線器監視着每一個端口的信號電壓,當有新設備接入時即可覺察。集線器端口的兩根信號線的每一根都有15kΩ的下拉電阻,而每個設備在D+都有一個1.5kΩ的上拉電阻。當用USB線將PC和設備接通後,設備的上拉電阻使信號線的電位升高,所以被主機集線器檢測到。大數據
2、USB數據格式編碼
USB的重要關鍵字:.net
端點(Endpoint):位於USB設備或主機上的一個數據緩衝區,是USB設備中能夠進行數據收發的最小單元,支持單向或者雙向的數據傳輸,用來存放和發送USB的各類數據,每個端點都有唯一的肯定地址,有不一樣的傳輸特性(如輸入端點、輸出端點、配置端點、批量傳輸端點)。設備支持端點的數量是有限制的,除默認端點外低速設備最多支持2組端點(2 個輸入,2 個輸出),高速和全速設備最多支持15組端點。指針
幀:時間概念,在USB中,一幀就是1MS,它是一個獨立的單元,包含了一系列總線動做,USB將1幀分爲好幾份,每一份是一個USB的傳輸動做。code
上行、下行:設備到主機爲上行,主機到設備爲下行。blog
2.一、USB數據傳輸方法索引
數據在USB線裏傳送是由低位到高位發送的。接口
USB採用不歸零取反來傳輸數據,當傳輸線上的差分數據輸入0時就取反,輸入1時就保持原值,爲了確保信號發送的準確性,當在USB總線上發送一個包時,傳輸設備就要進行位插入操做(即在數據流中每連續6個1後就插入一個0),從而強迫NRZI碼發生變化。這些是由專門硬件處理的。
2.二、數據格式
USB數據是由二進制數字串構成的,首先數字串構成域(有七種),域再構成包,包再構成事務(IN、OUT、SETUP),事務最後構成傳輸(中斷傳輸、並行傳輸、批量傳輸和控制傳輸)。下面介紹一下域、包和事務。
2.2.一、域
域是USB數據最小的單位,由若干位組成(多少位由具體的域決定),域可分爲七個類型:
一、同步域(SYNC)
全部的USB包都由SYNC開始,高速包的SYNC寬度爲32bit,全速/低速包的SYNC段度爲8bit。實際接收到的SYNC長度因爲USB HUB的關係,可能會小於該值。八位的值固定爲0000 0001,用於本地時鐘與輸入同步。
二、標識域(PID)
由四位標識符 + 四位標識符反碼構成,代表包的類型和格式,這是一個很重要的部分,這裏能夠計算出,USB的標識碼有16種。USB2.0使用了十六種標識碼,標識碼的做用是用來講明包的屬性的,標識碼是和包聯繫在一塊兒的,標識碼分別有如下十六種:
令牌包 :
0x01:輸出(OUT)啓動一個方向爲主機到設備的傳輸,幷包含了設備地址和標號。
0x09:輸入(IN) 啓動一個方向爲設備到主機的傳輸,幷包含了設備地址和標號。
0x05:幀起始(SOF)表示一個幀的開始,而且包含了相應的幀號。
0x0d:設置(SETUP)啓動一個控制傳輸,用於主機對設備的初始化。
數據包 :
0x03:偶數據包(DATA0)。
0x0b:奇數據包(DATA1)。
握手包:
0x02:確認接收到無誤的數據包(ACK)。
0x0a:無效,接收(發送)端正在忙而沒法接收(發送)信息。
0x0e:錯誤,端點被禁止或不支持控制管道請求。
特殊包0x0C前導,用於啓動下行端口的低速設備的數據傳輸。
三、地址域(ADDR):七位地址,表明了設備在主機上的地址,地址000 0000被命名爲零地址,是任何設備第一次鏈接到主機時,在被主機配置、枚舉前的默認地址,由此能夠知道爲何一個USB主機只能接127個設備的緣由。
四、端點域(ENDP),四位,由此可知一個USB設備端點數量最大爲16個。
五、幀號域(FRAM),11位,每個幀都有一個特定的幀號,幀號域最大容量0x800,對於同步傳輸有重要意義。
六、數據域(DATA):長度爲0~1023字節,在不一樣的傳輸類型中,數據域的長度各不相同,但必須爲整數個字節的長度。
七、校驗域(CRC):對令牌包和數據包中非PID域進行校驗的一種方法,CRC校驗在通信中應用很泛,是一種很好的校驗方法,CRC碼的除法是模2運算,不一樣於10進制中的除法。
2.2.二、包
USB數據包的格式以下:
由域構成的包有四種類型,分別是令牌包、數據包、握手包和特殊包,前面三種是重要的包,不一樣包的域結構不一樣,介紹以下:
一、令牌包
分爲輸入包、輸出包、設置包和幀起始包(注意這裏的輸入包是用於設置輸入命令的,輸出包是用來設置輸出命令的,而不是放數據的)其中輸入包、輸出包和設置包的格式都是同樣的:
SYNC + PID + ADDR + ENDP + CRC5(五位的校驗碼)
幀起始包的格式:
SYNC + PID + 11位FRAM + CRC5(五位的校驗碼)
二、數據包
分爲DATA0包和DATA1包,當USB發送數據的時候,若是一次發送的數據長度大於相應端點的容量時,就須要把數據包分爲好幾個包,分批發送,DATA0包和DATA1包交替發送,即若是第一個數據包是DATA0,那第二個數據包就是DATA1。但也有例外狀況,在同步傳輸中(四類傳輸類型中之一),全部的數據包都是爲DATA0,格式以下:
SYNC + PID + 0~1023字節 + CRC16
三、握手包
結構最爲簡單的包,格式以下:
SYNC + PID
握手包包括 ACK、NAK、STALL以及NYET 四種,其中 ACK 表示確定的應答,成功的數據傳輸。NAK 表示否認的應答,失敗的數據傳輸,要求從新傳輸。STALL表示功能錯誤或端點被設置了STALL屬性。NYET表示還沒有準備好,要求等待。
2.2.三、事務
分別有IN、OUT和SETUP三大事務,每一種事務都由令牌包、數據包、握手包三個階段構成,這裏用階段的意思是由於這些包的發送是有必定的時間前後順序的,事務的三個階段以下:
一、令牌包階段:啓動一個輸入、輸出或設置的事務。
二、數據包階段:按輸入、輸出發送相應的數據。
三、握手包階段:返回數據接收狀況,在同步傳輸的IN和OUT事務中沒有這個階段,這是比較特殊的。
事務的三種類型以下(如下按三個階段來講明一個事務):
一、 IN事務:
令牌包階段——主機發送一個PID爲IN的輸入包給設備,通知設備要往主機發送數據;
數據包階段——設備根據狀況會做出三種反應(要注意:數據包階段也不老是傳送數據的,根據傳輸狀況還會提早進入握手包階段)。
1) 設備端點正常:設備往主機裏面發出數據包(DATA0與DATA1交替);
2) 設備正在忙:沒法往主機發出數據包就發送NAK無效包,IN事務提早結束,到了下一個IN事務才繼續;
3) 相應設備端點被禁止:發送錯誤包STALL包,事務也就提早結束了,總線進入空閒狀態。
握手包階段——主機正確接收到數據以後就會向設備發送ACK包。
二、 OUT事務:
令牌包階段——主機發送一個PID爲OUT的輸出包給設備,通知設備要接收數據;
數據包階段——比較簡單,就是主機會往設備送數據,DATA0與DATA1交替
握手包階段——設備根據狀況會做出三種反應
1) 設備端點接收正確,設備給主機返回ACK,通知主機能夠發送新的數據,若是數據包發生了CRC校驗錯誤,將不返回任何握手信息;
2) 設備正在忙,沒法給主機返回ACK,就發送NAK無效包,通知主機再次發送數據;
3) 相應設備端點被禁止,發送錯誤包STALL包,事務提早結束,總線直接進入空閒狀態。
三、SETUT事務:
令牌包階段——主機發送一個PID爲SETUP的輸出包給設備,通知設備要接收數據;
數據包階段——比較簡單,就是主機往設備送數據,注意,這裏只有一個固定爲8個字節的DATA0包,這8個字節的內容就是標準的USB設備請求命令,詳見2.4。
握手包階段——設備接收到主機的命令信息後,返回ACK,此後總線進入空閒狀態,並準備下一個傳輸(在SETUP事務後一般是一個IN或OUT事務構成的傳輸)。
2.三、標準的USB設備請求命令
標準的USB設備請求命令是用在控制傳輸中的「初始設置步驟」裏的數據包階段(即DATA0,由八個字節構成)。命令共有11個,大小都是8個字節,具備相同的結構,由5個字段構成(字段是標準請求命令的數據部分),結構以下(括號中的數字表示字節數,首字母bm,b,w分別表示位圖、字節,雙字節):
bmRequestType(1) + bRequest(1) + wvalue(2) + wIndex(2) + wLength(2)
各字段的意義以下:
一、bmRequestType:D7D6D5D4D3D2D1D0
D7=0主機到設備
=1設備到主機;
D6D5=00標準請求命令
=01 類請求命令
=10用戶定義的命令
=11保留值
D4D3D2D1D0=00000 接收者爲設備
=00001 接收者爲設備
=00010 接收者爲端點
=00011 接收者爲其餘接收者
=其餘 其餘值保留
二、bRequest:請求命令代碼,在標準的USB命令中,每個命令都定義了編號,編號的值就爲字段的值,編號與命令名稱以下(要注意這裏的命令代碼要與其餘字段結合使用,能夠說命令代碼是標準請求命令代碼的核心,正是由於這些命令代碼而決定了11個USB標準請求命令):
0 GET_STATUS:用來返回特定接收者的狀態;
1 CLEAR_FEATURE:用來清除或禁止接收者的某些特性;
2) 3 SET_FEATURE:用來啓用或激活命令接收者的某些特性;
5 SET_ADDRESS:用來給設備分配地址;
6 GET_DEscriptOR:用於主機獲取設備的特定描述符;
7 SET_DEscriptOR:修改設備中有關的描述符,或者增長新的描述符;
8 GET_CONFIGURATION:用於主機獲取設備當前設備的配置值(注同上面的不一樣);
9 SET_CONFIGURATION:用於主機指示設備採用的要求的配置;
10 GET_INTERFACE:用於獲取當前某個接口描述符編號;
11 SET_INTERFACE:用於主機要求設備用某個描述符來描述接口;
12 SYNCH_FRAME:用於設備設置和報告一個端點的同步幀;
控制傳輸是USB的重心,而這11個命令是控制傳輸的重心,因此這11個命令是重中之重。
2.四、描述符(Descriptor)
Descriptor是一個完整的數據結構,能夠經過C語言等編程實現,並存儲在USB設備中,用於描述一個USB設備的全部屬性,USB主機是經過一系列命令來要求設備發送這些信息的。它的做用就是給主機傳遞信息,從而讓主機知道設備具備什麼功能、屬於哪一類設備、要佔用多少帶寬、使用哪類傳輸方式及數據量的大小,只有主機肯定了這些信息以後,設備才能真正開始工做,因此描述符也是十分重要的部分,標準的描述符有5種,USB爲這些描述符定義了編號:
1——設備描述符
2——配置描述符
3——字符描述符
4——接口描述符
5——端點描述符
上面的描述符之間有必定的關係,一個設備只有一個設備描述符,而一個設備描述符能夠包含多個配置描述符,而一個配置描述符能夠包含多個接口描述符,一個接口使用了幾個端點,就有幾個端點描述符。這些描述符是用必定的字段構成的,分別以下說明:
一、設備描述符
struct _DEVICE_DEscriptOR_STRUCT
{
BYTE bLength; //設備描述符的字節數大小,爲0x12
BYTE bDescriptorType; //描述符類型編號,爲0x01
WORD bcdUSB; //USB版本號
BYTE bDeviceClass; //USB分配的設備類代碼,0x01~0xfe爲標準設備類,0xff爲廠商自定義類型
//0x00不是在設備描述符中定義的,如HID
BYTE bDeviceSubClass; //usb分配的子類代碼,同上,值由USB規定和分配的
BYTE bDeviceProtocl; //USB分配的設備協議代碼,同上
BYTE bMaxPacketSize0; //端點0的最大包的大小
WORD idVendor; //廠商編號
WORD idProduct; //產品編號
WORD bcdDevice; //設備出廠編號
BYTE iManufacturer; //描述廠商字符串的索引
BYTE iProduct; //描述產品字符串的索引
BYTE iSerialNumber; //描述設備序列號字符串的索引
BYTE bNumConfiguration; //可能的配置數量
}
二、配置描述符
struct _CONFIGURATION_DEscriptOR_STRUCT
{
BYTE bLength; //設備描述符的字節數大小,爲0x12
BYTE bDescriptorType; //描述符類型編號,爲0x01
WORD wTotalLength; //配置所返回的全部數量的大小
BYTE bNumInterface; //此配置所支持的接口數量
BYTE bConfigurationVale; //Set_Configuration命令須要的參數值
BYTE iConfiguration; //描述該配置的字符串的索引值
BYTE bmAttribute; //供電模式的選擇
BYTE MaxPower; //設備從總線提取的最大電流
}
三、字符描述符
struct _STRING_DEscriptOR_STRUCT
{
BYTE bLength; //設備描述符的字節數大小,爲0x12
BYTE bDescriptorType; //描述符類型編號,爲0x01
BYTE SomeDescriptor[36]; //UNICODE編碼的字符串
}
四、接口描述符
struct _INTERFACE_DEscriptOR_STRUCT
{
BYTE bLength; //設備描述符的字節數大小,爲0x12
BYTE bDescriptorType; //描述符類型編號,爲0x01
BYTE bInterfaceNunber; //接口的編號
BYTE bAlternateSetting;//備用的接口描述符編號
BYTE bNumEndpoints; //該接口使用端點數,不包括端點0
BYTE bInterfaceClass; //接口類型
BYTE bInterfaceSubClass;//接口子類型
BYTE bInterfaceProtocol;//接口所遵循的協議
BYTE iInterface; //描述該接口的字符串索引值
}
五、端點描述符
struct _ENDPOIN_DEscriptOR_STRUCT
{
BYTE bLength; //設備描述符的字節數大小,爲0x12
BYTE bDescriptorType; //描述符類型編號,爲0x01
BYTE bEndpointAddress; //端點地址及輸入輸出屬性
BYTE bmAttribute; //端點的傳輸類型屬性
WORD wMaxPacketSize; //端點收、發最大包的大小
BYTE bInterval; //主機查詢端點的時間間隔
}
3、傳輸
USB系統中的數據傳輸,宏觀看是在HOST和USB功能設備之間進行。微觀看是在應用軟件的Buffer和USB功能設備的端點之間進行。通常來講端點都有Buffer,能夠認爲USB通信就是應用軟件Buffer和設備端點Buffer之間的數據交換,交換的通道稱爲管道。應用軟件經過和設備之間的數據交換來完成設備控制和數據傳輸。一般須要多個管道來完成數據交換,由於同一管道只支持一種類型的數據傳輸。用在一塊兒來對設備進行控制的若干管道稱爲設備的接口,這就是端點、管道和接口的關係。
USB 採用「令牌包」-「數據包」-「握手包」的傳輸機制,在令牌包中指定數據包去向或者來源的設備地址和端點(Endpoint),從而保證了只有一個設備對被廣播的數據包/令牌包做出響應。握手包表示了傳輸的成功與否。
USB 採用輪詢的廣播機制傳輸數據,全部的傳輸都由主機發起,任什麼時候刻整個 USB 體系內僅容許一個數據包的傳輸,即不一樣物理傳輸線上看到的數據包都是同一被廣播的數據包。
傳輸由OUT、IN和SETUP事務構成,傳輸有四種類型,中斷傳輸、批量傳輸、同步傳輸、控制傳輸,其中中斷傳輸和批量傳輸的結構同樣,同步傳輸有最簡單的結構,而控制傳輸是最重要的也是最複雜的傳輸。
3.一、控制傳輸
控制傳輸是一種可靠的雙向傳輸,是最重要也是最複雜的,一次控制傳輸可分爲構成(初始設置階段、可選數據階段、狀態信息步驟),每個階段能夠當作一個傳輸,也就是說控制傳輸實際上是由三個傳輸構成的,在USB設備初次接到主機後,主機經過控制傳輸來交換信息、設備地址和讀取設備的描述符,使得主機識別設備,並安裝相應的驅動程序,這是每個USB開發者都要關心的問題。
第一階段:從HOST到Device的SETUP事務傳輸,這個階段指定了這次控制傳輸的請求類型。
第二階段:數據階段,也有些請求沒有數據階段。
第三階段:狀態階段,經過一次IN/OUT傳輸代表請求是否成功完成。
控制傳輸經過控制管道在應用軟件和Device的控制端點之間進行,控制傳輸過程當中傳輸的數據是有格式定義的,USB 設備或主機可根據格式定義解析得到的數據含義。其餘三種傳輸類型都沒有格式定義。控制傳輸對於最大包長度有固定的要求。對於高速設備該值爲64Byte,對於低速設備該值爲8,全速設備能夠是8或16或32或64。
最大包長度表徵了一個端點單次接收/發送數據的能力,實際上反應的是該端點對應Buffer的大小。Buffer越大,單次可接收/發送的數據包越大,反之亦反。當經過一個端點進行數據傳輸時,若數據的大小超過該端點的最大包長度時,須要將數據分紅若干個數據包傳輸。並保證除最後一個包外,全部的包長度均等於該最大包長度。這也就是說若是一個端點收到/發送了一個長度小於最大包長度的包,即意味着數據傳輸結束。
控制傳輸在訪問總線時也受到一些限制,如高速端點的控制傳輸不能佔用超過 20%的微幀,全速和低速的則不能超過 10%。在一幀內若是有多餘的未用時間,而且沒有同步和中斷傳輸,能夠用來進行控制傳輸。
控制傳輸(Transaction) 一次控制傳輸分爲三(或兩個)個階段:創建(Setup)、數據(DATA)(可能沒有)以及狀態(Status)。每一個階段都由一次或屢次(數據階段)事務傳輸組成(Transaction)。
上圖爲創建階段的事務傳輸流程圖。能夠看出:
與批量傳輸相比,在流程上並無多大區別,區別只在於該事務傳輸發生的端點不同、支持的最大包長度不同、優先級不同等這樣一些對用戶來講透明的東西。
創建階段事後,可能會有數據階段,這個階段將會經過一次或屢次控制傳輸事務,完成數據的傳輸。一樣也會採用PID翻轉的機制。
創建階段,Device 只能返回ACK包,或者不返回任何包。
最後是狀態階段,經過一次方向與前一次相反的控制事務傳輸來代表傳輸的成功與否。若是成功會返回一個長度爲0的數據包,不然返回 NAK或STALL。下圖爲整個控制傳輸的示意圖:
3.二、中斷傳輸
中斷傳輸是一種輪詢的傳輸方式,是一種單向的傳輸。HOST經過固定的間隔對中斷端點進行查詢,如有數據傳輸或能夠接收數據則返回數據或發送數據。不然返回NAK,表示還沒有準備好。中斷傳輸的延遲有保證,但並不是實時傳輸,它是一種延遲有限的可靠傳輸,支持錯誤重傳。對於高速/全速/低速端點,最大包長度分別能夠達到1024/64/8 Bytes。 高速中斷傳輸不得佔用超過 80%的微幀時間,全速和低速不得超過90%。 中斷端點的輪詢間隔由在端點描述符中定義,全速端點的輪詢間隔能夠是1~255mS。低速端點爲10~255mS,高速端點爲(2interval-1)*125uS,其中 interval 取 1到 16 之間的值。
除高速高帶寬中斷端點外,一個微幀內僅容許一次中斷事務傳輸。高速高帶寬端點最多能夠在一個微幀內進行三次中斷事務傳輸,傳輸高達 3072 字節的數據。
所謂單向傳輸,並非說該傳輸只支持一個方向的傳輸。而是指在某個端點上該傳輸僅支持一個方向,或輸出、或輸入。若是須要在兩個方向上進行某種單向傳輸,須要佔用兩個端點,分別配置成不一樣的方向。能夠擁有相同的端點編號。
中斷傳輸由OUT事務和IN事務構成,用於鍵盤、鼠標等HID設備的數據傳輸。
中斷傳輸在流程上除不支持PING以外,其餘的跟批量傳輸是同樣的。他們之間的區別也僅在於事務傳輸發生的端點不同、支持的最大包長度不同、優先級不同等這樣一些對用戶來講透明的東西。
主機在排定中斷傳輸任務時,會根據對應中斷端點描述符中指定的查詢間隔發起中斷傳輸。中斷傳輸有較高的優先級,僅次於同步傳輸。一樣中斷傳輸也採用 PID 翻轉的機制來保證收發端數據同步。
下圖爲中斷傳輸的流程圖。
3.三、批量傳輸
批量傳輸由OUT事務和IN事務構成,是一種可靠的單向傳輸,但延遲沒有保證,它儘可能利用能夠利用的帶寬來完成傳輸,適合數據量比較大的傳輸。低速USB設備不支持批量傳輸,高速批量端點的最大包長度爲512,全速批量端點的最大包長度能夠爲八、1六、3二、64。
批量傳輸在訪問USB總線時,相對其餘傳輸類型具備最低的優先級,USB HOST老是優先安排其餘類型的傳輸,當總線帶寬有富餘時才安排批量傳輸。高速的批量端點必須支持PING操做,向主機報告端點的狀態。NYET表示否認應答,沒有準備好接收下一個數據包,ACK 表示確定應答,已經準備好接收下一個數據包。
圖中一個方框表示一個 Packet,灰色的包表示主機發出的包,白色的包表示Device發出的包。批量傳輸是可靠的傳輸,須要握手包來代表傳輸的結果。若數據量比較大,將採用屢次批量事務傳輸來完成所有數據的傳輸,傳輸過程當中數據包的PID按照 DATA0-DATA1-DATA0-...的方式翻轉,以保證發送端和接收端的同步。若成功則將錯誤次數計數器清0,不然累加該計數器。USB容許連續3次如下的傳輸錯誤,會重試該傳輸。超過三次後,HOST 認爲該端點功能錯誤(STALL),放棄該端點的傳輸任務。
一次批量傳輸(Transfer)由 1 次到屢次批量事務傳輸(Transaction)組成。
翻轉同步:發送端按照 DATA0-DATA1-DATA0-...的順序發送數據包,只有成功的事務傳輸纔會致使PID翻轉,也就是說發送段只有在接收到ACK後纔會翻轉PID,發送下一個數據包,不然會重試本次事務傳輸。一樣,若在接收端發現接收到的數據包不是按照此順序翻轉的,好比連續收到兩個DATA0,那麼接收端認爲第二個DATA0是前一個DATA0的重傳。
3.四、同步傳輸
同步傳輸是一種實時的、不可靠的傳輸,不支持錯誤重發機制。只有高速和全速端點支持同步傳輸,高速同步端點的最大包長度爲1024,低速的爲1023。由OUT事務和IN事務構成。有兩個特殊地方,第一,在同步傳輸的IN和OUT事務中是沒有返回包階段的;第二,在數據包階段全部的數據包都爲DATA0。
除高速高帶寬同步端點外,一個微幀內僅容許一次同步事務傳輸,高速高帶寬端點最多能夠在一個微幀內進行三次同步事務傳輸,傳輸高達 3072 字節的數據。全速同步傳輸不得佔用超過 80%的幀時間,高速同步傳輸不得佔用超過90%的微幀時間。同步端點的訪問也和中斷端點同樣,有固定的時間間隔限制。
同步傳輸是不可靠的傳輸,因此它沒有握手包,也不支持PID翻轉。主機在排定事務傳輸時,同步傳輸有最高的優先級。
3.五、分離傳輸(Split Transaction)
分離傳輸是在主機控制器和USB HUB之間的傳輸,它僅在主機控制器和HUB之間執行,經過分離傳輸,能夠容許全速/低速設備鏈接到高速主機。分離傳輸對於USB設備來講是透明的、不可見的。
分離傳輸,顧名思義就是把一次完整的事務傳輸分紅兩個事務傳輸來完成。其出發點是高速傳輸和全速/低速傳輸的速度不相等,若是使用一次完整的事務來傳輸,勢必會形成比較長的等待時間,從而下降了高速USB總線的利用率。經過將一次傳輸分紅兩次,將令牌(和數據)的傳輸與響應數據(和握手)的傳輸分開,這樣就能夠在中間插入其餘高速傳輸,從而提升總線的利用率。
3.六、總結
包是USB總線數據傳輸的最小單位,不能被打斷或干擾,不然會引起錯誤。若干個數據包組成一次事務傳輸,一次事務傳輸也不能打斷,屬於一次事務傳輸的幾個包必須連續,不能跨幀完成。一次傳輸由一次到屢次事務傳輸構成,能夠跨幀完成。
4、枚舉
USB設備鏈接到HOST時,HOST必須經過默認的控制管道對其進行枚舉,完成得到其設備描述、進行地址分配、得到其配置描述、進行配置等操做後方可正常使用。USB設備的即插即用特性即依賴於此。
4.一、枚舉時USB的狀態
當USB設備插上主機時,主機就經過一系列的動做來對設備進行枚舉配置(配置是屬於枚舉的一個態,態表示暫時的狀態),這些態以下:
一、接入態(Attached):設備接入主機後,主機經過檢測信號線上的電平變化來發現設備的接入;
二、供電態(Powered):就是給設備供電,分爲設備接入時的默認供電值,配置階段後的供電值(按數據中要求的最大值,可經過編程設置);
三、缺省態(Default):USB在被配置以前,經過缺省地址0與主機進行通訊;
四、地址態(Address):通過了配置,USB設備被複位後,就能夠按主機分配給它的惟一地址來與主機通訊,這種狀態就是地址態;
五、配置態(Configured):經過各類標準的USB請求命令來獲取設備的各類信息,並對設備的某些信息進行改變或設置。
六、掛起態(Suspended):總線供電設備在3ms內沒有總線操做,即USB總線處於空閒狀態的話,該設備就要自動進入掛起狀態,在進入掛起狀態後,總的電流功耗不超過280uA。
狀態轉移圖以下所示:
4.二、枚舉過程
一、用戶將一個USB設備插入USB端口,主機爲端口供電,設備此時處於上電狀態。主機檢測設備。集線器使用中斷通道將事件報告給主機。
二、主機發送Get_Port_Status(讀端口狀態)請求,以獲取更多的設備信息。返回的消息告訴主機該設備是何時鏈接的。集線器檢測設備是低速運行仍是高速運行,並將此信息送給主機,這是對Get_Port_Status請求的響應。
三、主機發送Set_Port_Feature(寫端口狀態)請求給集線器,要求它復位端口,請求集線器來從新設置端口。集線器使設備的USB數據線處於重啓(RESET)狀態至少10ms。
四、主機使用Chirp K信號來了解全速設備是否支持高速運行。
五、主機發送另外一個Get_Port_Status請求,肯定設備是否已經從復位狀態退出。返回的數據有一位表示設備仍然處於重啓狀態。當集線器釋放了重啓狀態,設備此時處於缺省狀態,且已準備好在零端點經過缺省通道響應主機控制傳輸。缺省地址爲00h,設備能從總線獲取高達100mA的電流。
六、集線器檢測設備速度
集線器經過測定哪根信號線(D+或D-)在空閒時有更高的電壓來檢測設備是低速設備仍是全速設備。全速和高速設備D+有上拉電阻,低速設備D-有上拉電阻。
七、獲取最大數據包長度
主機向address 0發送Get_Device_Deor(讀設備描述符)報文,以取得缺省控制管道所支持的最大數據包長度。並在有限的時間內等待USB設備的響應。該長度包含在設備描述符的bMaxPacketSize0字段中,其地址偏移量爲7,因此這時主機只需讀取該描述符的前8個字節。注意,主機一次只能枚舉一個USB設備,因此同一時刻只能有一個USB設備使用缺省地址0。
例:主機向設備發送一個八字節請求:80 06 00 01 00 00 40 00,設備接收到請求後產生一箇中斷,咱們能夠經過讀中斷寄存器知道中斷源,而且能夠加讀最後狀態寄存器來肯定第一個接到的包是否爲一個Setup包。當控制器處理程序判斷出它是一個Get_descriptor請求時,把設備描述符的前16個字節發送到端點0緩衝區中。剩下的2個字節描述符第一次請求時再也不發送。
八、主機分配一個新的地址給設備
主機經過發送一個Set_Address請求來分配一個惟一的地址給設備。設備讀取這個請求,返回一個確認,並保存新的地址。今後開始全部通訊都使用這個新地址。
例:當主機收到正確的前16字節描述符後,會給設備分配一個地址,個人PC分配的地址爲:0x03(這個要看你的機子當時的USB接口設備數目而定) Set_Address 請求所發送的數據爲:00 05 03 00 00 00 00 00,其中的03就表示主機爲設備分配的地址爲0x03,在之後的通訊裏設備就只對0x03地址做出應答。當設備產生一個接收中斷後,根據所分配的地址設置設備的地址寄存器相應位。
九、主機向新地址從新發送Get_Device_Deor命令,這次讀取其設備描述符的所有字段,以瞭解該設備的整體信息,如VID,PID。
例:主機發送設備描述符標準請求Get_descriptor:80 06 00 01 00 00 12 00,這次將要求把18個字節所有發送完。因此主機要分兩次來讀取。第一次讀取16個字節,第二次讀取兩個字節,最後主機發送0表示發送完畢的應答。
十、主機向設備循環發送Get_Device_Configuration命令,要求USB設備回答,以讀取所有配置信息。
十一、主機發送Get_Device_String命令,得到字符集描述(unicode),好比產商、產品描述、型號等等。此時主機將會彈出窗口,展現發現新設備的信息,產商、產品描述、型號等。
根據Device_Deor和Device_Configuration應答,PC判斷是否可以提供USB的Driver,通常win2k能提供幾大類的設備,如遊戲操做杆、存儲、打印機、掃描儀等,操做就在後臺運行。可是Win98卻不能夠,因此在此時將會彈出對話框,索要USB的Driver。
十二、主機分配並加載設備驅動程序,這時就可能做應用中的數據傳輸了。
1三、主機發送Set_Configuration(x)(寫配置)命令請求爲該設備選擇一個合適的配置(x表明非0的配置值)。若是配置成功,USB設備進入「配置」狀態,並能夠和客戶軟件進行數據傳輸。此時,常規的USB完成了其必須進行的配置和鏈接工做,至此設備應當能夠開始使用。不過,USB協議還提供了一些用戶可選的協議,設備若是不該答,也不會出錯,可是會影響到系統的功能。
1四、主機爲複合設備接口分配驅動程序。若是集線器檢測到有過流現象,或者主機要求集線器關閉電源,則USB總線切斷設備供電電源。在這種狀況下,設備與主機沒法通訊,但設備處於鏈接狀態。
使用USB View 採集到的數據:
Device Descriptor:
bcdUSB: 0x0100
bDeviceClass: 0xDC
bDeviceSubClass: 0x00
bDeviceProtocol: 0x00
bMaxPacketSize0: 0x10 (16)
idVendor: 0x0471
idProduct: 0x0666
bcdDevice: 0x0100
iManufacturer: 0x00
iProduct: 0x00
iSerialNumber: 0x00
bNumConfigurations: 0x01
ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed: Full
Device Address: 0x02
Open Pipes: 4
Endpoint Descriptor:
bEndpointAddress: 0x81
Transfer Type: Interrupt
wMaxPacketSize: 0x0010 (16)
bInterval: 0x0A
Endpoint Descriptor:
bEndpointAddress: 0x01
Transfer Type: Interrupt
wMaxPacketSize: 0x0010 (16)
bInterval: 0x0A
Endpoint Descriptor:
bEndpointAddress: 0x82
Transfer Type: Bulk
wMaxPacketSize: 0x0040 (64)
bInterval: 0x0A
Endpoint Descriptor:
bEndpointAddress: 0x02
Transfer Type: Bulk
wMaxPacketSize: 0x0040 (64)
bInterval: 0x0A
4.三、USB枚舉實例
對2440的USB HOST進行初始化完畢(主要包括對符合OHCI規範的寄存器的初始化—總線復位、中斷使能、清除中斷標誌、電源管理、內存指針寄存器的初始化,各類數據結構的初始化等),等待USB設備的插入,當2440檢測到有設備插入,就要對設備進行枚舉了。起始枚舉就至關於主機和設備創建鏈接的過程(接頭),Host向Device詢問一些東西,Device將自身的設備類型,如何進行通訊報告給Host,這樣Host就知道怎麼對Device進行操做了。
枚舉的過程實際上用到並且只用到了總線的「控制傳輸(Control Transfer)」。這種傳輸方式一般用於配置/命令/狀態等情形,其中的設置操做setup和狀態操做status過程的數據包具備USB協議定義的數據結構,所以,控制傳輸只能經過消息管道進行。
一個完整的控制傳輸包括三個過程:
一、創建鏈接。
二、數據過程(可選) 。
三、狀態過程。
創建鏈接的過程都是由Host發起,它開始於一個Setup令牌包,後面緊跟一個DATA0包。若是是控制輸入傳輸,數據過程則爲輸入數據,如果控制輸出傳輸,則數據過程是輸出數據。
數據過程的可選型是指設置過程須要指定數據長度,若是指定爲0,則沒有數據過程。狀態過程跟在數據過程以後,狀態過程剛好和數據過程的數據傳輸方向相反,由於此階段主要是用來確認以前兩階段的全部數據都已經正確傳輸了。
好了,下面就結合個人這個實例來看看枚舉的詳細過程:
一、控制2440向U盤發送第一個Setup包,內容是80 06 00 01 00 00 08 00,其中最後的00 08表示獲得DEVICE_DCESCRIPTOR的前8個字節,由於這個包的主要目的是要得到USB Device中端點0的最大包的大小(第8個字節),因此只須要8個字節就能夠了。USB Device返回的設備標識符爲12 01 10 01 00 00 00 40,下面咱們須要把0x40記錄下來,將其放到Endpoint Descriptor數據結構的DWORD0的MPS(bit16~bit32)塊中去。
二、接下來2440發送第二個Setup包,內容是00 05 01 00 00 00 00 00,這一次的做用是爲USB設備分配地址。若是USB Device接收並接受了此地址設置包,會返回一個長度爲0的數據包。主機接收到長度爲0的狀態包以後就會返回一個ACK給Device,Device再接收到這個ACK以後,就能夠啓用新地址了。這樣Device就獲得了一個惟一的設備地址,做爲主機通訊的惟一表示。
三、發送第三個Setup包,內容是80 06 00 02 00 00 09 00,此次是爲了獲取配置描述符集合的大小,此位位於讀回數據的第三個字節。U盤返回的數據爲09 02 20 00 01 01 00 80 32,即描述符集合總大小爲0x20。
四、發送第四個Setup包,內容是80 06 00 02 00 00 09 00,和上次不一樣的僅僅是,此次要讀回來的數據是整個配置描述符區域。U盤返回來的數據是09 02 20 00 01 01 00 80 32 09 04 00 00 02 08 06 50 00 07 05 82 02 40 00 00 07 05 02 02 40 00 00。這時候咱們就能夠知道該設備是什麼類型的設備,支持什麼樣的操做了。
上述這兩個過程也有的程序就是直接讀取0xff個字符大小,固然一樣能夠達到讀回設備描述符集合的目的。
至此,咱們已經獲得了所須要的設備信息,以後就能夠對設備進行配置了。
五、向設備發送第五個Setup包,數據爲00 09 01 00 00 00 00 00,USB Device返回一個長度爲0的數據包,代表數據正確接收。至此,USB枚舉過程就完成了。初始設置步驟:就是一個由SET事務構成的傳輸
可選數據步驟:就是一個由IN或OUT事務構成的傳輸,這個步驟是可選的,要看初始設置步驟有沒有要求讀/寫數據(由SET事務的數據包階段發送的標準請求命令決定)。
狀態信息步驟:這個步驟就是要獲取狀態信息,由IN或OUT事務構成的傳輸,可是要注意這裏的IN和OUT事務和以前的INT和OUT事務有兩點不一樣:
1) 傳輸方向相反,一般IN表示設備往主機送數據,OUT表示主機往設備送數據;在這裏,IN表示主機往設備送數據,而OUT表示設備往主機送數據,這是爲了和可選數據步驟相結合;
2) 在這個步驟裏,數據包階段的數據包都是0長度的,即SYNC+PID+CRC16。