USB基礎瞭解

轉載自:http://blog.chinaunix.net/uid-103601-id-2961390.html

一 什麼是USB

1.1 USB is only bus

認識一下它的全名:USB (Universal Serial Bus,通用串行總線)。

       Bus永遠是bus。出生那一刻起就註定他一生的角色就是一條數據通路。我們不能因爲現在各式各樣的USB設備,被其迷惑就認爲USB是一種設備,他不過是寄生於某種功能設備之上的一種串行總線(並沒有貶低USB的意思,只是想客觀的描述USB的角色)。當做過一段時間的USB設備驅動開發後,也許你就會發現,對USB的這種理解對我們以後的設備驅動開發大有裨益。

       當然bus(總線)的角色是由開發者給的,如果開發者讓bus有了更重要的角色,那它就不是簡單的bus,不再是簡單的數據通路,linux中的bus就有了更復雜的角色,是一位總管全局的精神領袖,已經不是我們這裏的bus了,這裏我們更應該簡單的去理解bus,它就是一條串行總線,一條數據的通路,一條高速路。這更有助於我們快速的瞭解USB的知識。

USB對傳輸的數據在內容和結構上沒有任何的要求,他沒有這個權力,他是一個忠實的信使。從上層應用的層面來看(設備類層),USB就是數據的透明通路(別忘了,他只是個總線---bus)。

郵局只負責把郵件送過去,他會看信裏寫的內容麼?快遞公司會偷偷的打開你的郵包看郵包裏的東西麼?

USB 很簡單,也很單純。各種各樣的複雜設備那是上層的事情,USB只是被上層利用。所以我們平時說的USB設備似乎有些不正確,應該說USB接口的設備。當然我們稱呼爲USB設備並不會產生歧義,我們也就這麼叫了,存在的就是合理的。

1.2 物理拓撲結構:7層

       頂層是host 控制器,下面是USB設備。在這些設備中有一個特殊的角色—hub。Hub的存在使USB接備能夠一層一層的級聯,使得USB的物理拓撲結構能夠形成如圖所示的層次結構。其中roothub是一個抽象出來的虛擬hub,軟件設計者也可以不用考慮roothub,因爲我們一貫的思路是一個USB設備只可能插在hub上,所以不知哪位高手就抽象出了一個roothub,結束了羣龍無首的局面。

物理拓撲結構就像一個大樹一樣。Host控制器是樹根,Hub是樹幹、樹枝。USB設備 就好比是樹葉子。USB協議規定這種層次最多爲7層,至於爲什麼?我想這應該和物理層線路的電氣特性有關。Host發出了一個請求,等了好久沒回響應,你是認爲他超時了,還是真的路途遙遠呢?

1.3 邏輯拓撲結構

在USB Host控制器的眼中每個設備都是平等的,不管物理距離上是多遠,我們的

心都是一樣近的,每個設備都有一個獨立的地址,like a child of the host。多麼寬廣的胸懷,天下皆爲臣民。凡成大事者都要有一顆寬廣的胸懷。

二 Life of USB device

       有一句話叫做事必躬親,意思是每件事情都要親自做。我覺得他也告訴我們另外一件思路:事情只有親自參與了纔能有切身體會。我們做嵌入式開發講究的更是這個,整天抱着書看、不做試驗、沒有應用場景驗證我們的思路,一是不好理解,二 是即使理解了慢慢也忘了。所以我的思路是學習知識時,要創造該知識的應用場景。應用纔是王道,應用的場景推動着我們對知識的理解,所以我們從最熟悉的U盤開始,來引出USB中的幾個關鍵術語。

       也許沒有多少人瞭解USB的工作原理,但是大部分人卻都使用着U盤。你知道U盤插入電腦的那一刻起一直到電腦上顯示出盤符這短暫的瞬間都發生了什麼?其他人可能不會去想,也沒有必要想,但是你既然看到了這裏,你就應該想一想。這是進入USB的開始。

       電腦對他做了什麼?怎麼知道他是U盤的?還知道他是那個廠家的?並且在插了2個或更多個U盤時,依然能夠正確的向裏邊拷貝數據,怎麼區分他們的?帶着疑問,我們能走得更快。

       當U盤插入hub後,供電的瞬間就是設備life開始的時刻!佛祖曾經說過:萬物皆有生命。

2.1枚舉

       USB設備(U盤)的一生有這麼幾個階段:

Attach態,Power態,default狀態,尋址態,配置態、掛起態。

       首先將設備連接到Hub的端口上,這時就處於Attach態;端口然後給設備提供電源,這時處於Power態,這樣纔有了能量,總得吃了飯才能幹活阿。供電態之後,設備還沒有接受過host的任何指示,處於的狀態爲Default態,在Default 狀態下設備默認地址爲0。目前它還沒有得到主機的認可。這裏強調一下,默認地址0是很重要的,是公共財產,誰也別想單獨擁有,否則後果很嚴重。Host檢測到USB設備的插入後,會重新給該設備分配一個地址,使設備進入尋址態;然後host會與設備通訊獲取設備的信息,USB設備告訴host自己都能幹什麼,然後host就選擇設備的一種功能進行配置,從此USB設備就知道自己工作在哪種功能下了,找到了人生目標啊!從此步入了配置態,就開始正常的工作了,如果是U盤就開始傳輸文件了,當然正式工作還有很多東西要講,我們先考慮枚舉這段過程。當host沒有什麼任務、工作需要USB設備完成時,爲了節能、低碳會將設備掛起,從此設備進入掛起狀態。

       剛到一個班級時,老師會爲每一個學生分配一個學號,來標識一個學生,這就類似於這裏的設備地址。老師提問時如果叫到9527,所有的人都會聽到,然後判斷是不是叫自己,如果不是不予理會;如果叫到的是自己,就需要起來回答問題。從1.3的邏輯拓撲結構來看,host會將數據或者命令廣播出去,所有的設備都要判斷是否給予響應,決定其是否響應的就是地址,host的呼叫的地址是不是自己。

2.2 枚舉階段的細節

       上面我們簡單的說了一下USB設備枚舉的過程,那麼枚舉的每個過程都發生了什麼?怎麼發生的呢?Attach態和Power態沒什麼講頭,我們主要介紹的是default態,尋址態,配置態。

       default態:當USB設備上電並正常工作後,就進入了default態,這個默認的意思是說地址處於默認狀態,每一個USB設備都有一個默認地址,總得給host一個找到你的方式吧。此時host會通過默認地址0來和USB設備通訊。如果有兩個設備都是地址0怎麼辦?我只能說不應該也不能出現這種情況,我們必須一個設備一個設備的供電、進入default態,如果有兩個叫做9527的怎麼辦,亂套了?在default態時,host並不知道這個USB設備是個什麼主兒,所以host首先會發送一個命令來試探一下,USB設備會對這個命令進行迴應。專業術語叫做獲取設備描述符。就這麼一個簡單的過程將引出多個USB的知識點。

       1  USB的所有通訊都是host主動,USB設備被動接受、響應,絕對不能主動請戰。

       2  命令是什麼樣的?USB中將命令叫做令牌。枚舉過程中使用的令牌爲setup令牌

       3  命令的參數是什麼?setup令牌的內容我們通常叫做setup包。他是1個8字節的數

據包,包含了各種信息:數據方向、長度、索引,主要的一項是要幹什麼。

4  什麼是設備描述符?如果我問你:你叫什麼名字,從哪來。我覺得應該可以答上來。一樣的道理,USB設備各式各樣,他必須在設備內部有記錄,自己是什麼設備,都有什麼資源等等,這就是設備描述符,關於設備描述符我們後面一看就知道了。

5  這個命令傳給USB設備後,USB設備採用的什麼機制收到的數據。我先告訴你是端點。

注意:這裏我一直稱呼爲USB設備,上面說過應該是USB接口的功能性設備,這個設備內部應該是一個USB device 控制器,USB通訊所涉及到的就是兩個控制器:host和device之間的恩恩怨怨。

通過default我們就知道了,我們需要了解以下幾點:令牌、setup包、描述符、端點

尋址態:剛纔host通過地址0與設備通訊,咱也不能一直這樣過,USB是博愛的,必

須做到人人有其居,host會爲其分配一個地址,從此USB設備就名正言順的佔着這個地址了。這個過程也是發送了一個setup命令。

配置態:USB設備到底能幹什麼,host還是不清楚的,所以會進一步獲取信息,這

個過程會獲取配置描述符和接口描述符,這兩個描述裏清晰的描述了該設備都能幹什麼。Host會根據自己的需要通知USB設備具體幹什麼。舉個例子:你到一家公司面試時面試官會問你都能做什麼:我能做nandflash,還能做linux驅動。如果面試通過,會通知你,你做linux驅動吧,這就是進行了配置。當然這裏其實還複雜一些,我們先說的簡單點,在這個過程中引出的知識點是:配置、接口

       當USB設備插入hub的瞬間就執行了這麼一個複雜的過程,在每一個環節引出了我們需要進一步掌握的知識點,靜下心來,腦子裏捋一下這個過程都發生了什麼?瞬間又多長,取決於你對上面的理解。

       通過life of USB device這一部分主要是爲了對USB設備的工作過程首先有一個感性的認識,同時引出相關的基礎知識點,我們依然需要帶着夢想上路。

三 家族的血統

       USB家族的成功,絕非偶然。正如一個人的成功一樣,除了機會還需要自身條件的過硬,需要平時對自己個人能力的積累。下面就介紹USB協議中的幾個知識點,正因爲有了他們,才成就了USB這座大廈,他們是每一個USB設備所具有的,正如家族的印記一樣刻在了每一個USB設備的骨子裏。

3.1 端點

簡單理解就是數據傳輸的終點,Endpoint。每一個設備都會有若干個端點,來負責不同類型的傳輸,USB數據傳輸有4種:控制傳輸、批量傳輸、中斷傳輸和同步傳輸。就像一個公司有不同的部門,人事部、技術部、財務部各有各的職責。從某種角度來說,一個USB設備是若干端點的集合。當host和USB設備通訊時,是直接和端點打交道的,端點是纔是外交的門戶。既然端點是用來傳輸數據,那麼他就有方向,有能夠接受的最大數據長度。所以記住3點:1 端點有類型(控制、批量、中斷及同步),2 端點有方向(in和out), 3端點有大小(MaxPacketSize)。任何一個設備都有一個用於通訊的默認端點0。

每個端點的信息都將在端點描述符中一一找到。

3.2 管道(pipe)

數據傳輸需要兩個實體的參與,所以引入了管道的概念,管道必然涉及到兩端。當面我們提到的Endpoint就是管道的一端,那另一端呢?另一端是什麼並不確定,因爲不同的控制器設計的方式是不一樣的,如果是host EHCI作爲數據的另一端的話,那麼管道的另一端就只能認爲是host控制器了。如果host端是mentor的otg host,那麼管道的另一端同樣是一個端點。其實管道這個概念我們在實際設計中基本涉及不到,更多的是爲了描述數據在兩個實體間流動的場景,是一種抽象的東西。數據從這一端流淌到另一端,就像流水一樣總得有個管道吧,你關心過水龍頭,關心過水管麼?

抽象的東西,需要在以後的工作中去慢慢領會。

3.3 描述符

簡單的說,USB的描述符是一個特定格式的數據結構,描述了USB 設備的各種屬性還有相關信息等,我們可以通過向設備發送setup命令請求獲得描述符的內容來了解這個USB設備。主要有四種USB 描述符:設備描述符、配置描述符、接口描述符和端點描述符,協議裏規定一個USB 設備是必須支持這四大描述符的,這四大描述符是一個都不能少的,設備工作所必須的,共性之外依然有各自的特性,如hub有自己的hub描述符,每一種特殊的設備都會有自己的描述符。設備大多有字符串描述符,不過即使沒有也不會影響設備工作,字符串描述符並不是一無是處,他記錄了廠家的信息,產品id等。

這些描述符放哪兒?當然是在USB設備裏,等着host來取,描述符是USB設備提供給host瞭解自己的窗口。

好,抽象和具體必須結合才能產生不錯的效果。我們對4個重要的描述符一一介紹一下。

 

a)設備描述符

設備描述符給出了USB設備的一般信息,一個USB設備只能有一個設備描述符。所有的USB設備都有缺省控制通道。在設備描述符中指出了端點0的最大包長度、廠商信息和產品信息等。bNumberConfigurations是該設備支持的配置數。

 

 

Offset

Field

Size

Value

Description

bLength

1

描述符長度

此描述符的字節數

1

bDecriptorType

1

常量

設備描述符的標識

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

1

ID

廠商標誌(由USB標準付值)

10

idProduct

1

ID

產品標誌(由廠商付值)

12

bcdDevice

2

BCD碼

設備發行號(BCD 碼)

14

iManufacturer

1

索引

描述廠商信息的字串的索引

15

iProduct

1

索引

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

16

iSerialNumber

1

索引

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

17

bNumConfigurations

1

數字

可能的設置數

 

 

 

 

b)配置描述符

 

一個USB設備有一個或多個配置,每個配置做着不同的事情。每個配置有一個或多個接口。而每個接口又有1個或多個端點。在一個配置下,一個端點不能被幾個接口使用,除非該端點被該接口的可選設置使用。在不同的配置中端點沒有限制。對USB設備選完配置後,設備可支持對配置的有限調整,如果一個接口有備選設置,在配置好後可選擇不同設置。

 

 

Offset

Field

Size

Value

Description

bLength

1

描述符長度

此描述符的字節數

1

bDecriptorType

1

常量

配置描述符的標識

2

WTotalLength

2

數目

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

4

bNumInterfaces

1

數目

該配置所支持的接口個數

5

bCongfigurationValue

1

數目

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

6

iConfiguration

1

索引

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

7

bmAttributes

1

位圖

配置特性:

D7: 保留(設爲一)

D6: 自給電源

D5: 遠程喚醒

D4..0:保留(設爲一)

一個既用總線電源又有自給電源的設備會在MaxPower域指出需要從總線取的電量。並設置D6 爲1 。運行時期的實際電源模式可由GetStatus(DEVICE) 請求得到

8

MaxPower

1

mA

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

 

 

c)接口描述符

接口描述符不能單獨獲取,只能在獲取配置描述符時獲得。如果一個配置支持不止一個接口,端節的描述符會跟在接口描述符後被返回,接口描述符跟在配置描述符的後面返回。接口描述不可直接用Set Description ( )和Get Descriptor ( )操作。

有時某個接口有可選設置,設備在進行了配置的情況下可以更改爲接口的可選設置。SetInterface ( )與GetInterface ( )用來選擇與返回選擇了的接口設置。

如果一個設備的配置爲一個接口,該接口有兩個可選設置,當獲取配置描述符時,返回配置描述符以後會緊跟着返回bInterfaceNumber與bAlternateSetting域皆爲0的第一個設置的接口描述表及相關的端點描述符,然後是另一個設置接口描述符與端點描述符。第二個接口描述符的bInterfaceNumber域也應爲0,但bAlternateSetting域應爲1。因爲是同一接口的不同設置,所以bInterfaceNumber是一樣的。

每個接口代表着一種功能。你的手機是做U盤,還是做攝像頭。這就是配置。當作爲U盤時可能一個接口就夠了。攝像頭時可能需要幾個接口,有音頻還得有視頻,而設置呢,比如音量可大可小,這應該就是設置吧。

接口描述符中的端點個數不包括端點0。

 

Offset

Field

Size

Value

Description

bLength

1

描述符長度

此描述符的字節數

1

bDecriptorType

1

常量

接口描述符的標識

2

bInterfaceNumber

1

數目

當前配置支持的接口數組索引,0開始。

3

bAlternateSetting

1

數目

可選設置的索引值

4

bNumEndpoints

1

數目

接口使用的端點數目。0代表只使用控制傳輸

5

bInterfaceClass

1

索引

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

6

bInterfaceSubClass

1

子類

子類碼

這些值的定義視bInterfaceClass 域而

定。如果bInterfaceClass域的值爲零則

此域的值必須爲零。bInterfaceClass域

不爲FFH則所有值由USB 所保留

7

bInterfaceProtocol

1

協議

協議碼: bInterfaceClass 和

bInterfaceSubClass 域的值而定.如果

一個接口支持設備類相關的請求此域的值指出了設備類說明中所定義的協議

8

iInterface

1

索引

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

 

 

d)端點描述符

       每個接口有若干個端點。端點描述符信息中包含端點號、方向、端點類型等。

 

Offset

Field

Size

Value

Description

bLength

1

描述符長度

此描述符的字節數

1

bDecriptorType

1

常量

端點描述符的標識

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。對於中斷傳送的端點此域值的範圍爲1到255

 

四 精彩人生的資本

       當我們遇到機會時,纔會感到自己能力的匱乏,後悔自己平時沒有足夠的積累。USB協議經過上面的準備,有能力進行各種情況下的數據傳輸了。他爲我們準備了四種數據傳輸方式,分別應用在不同的環境下,技術的本質是服務,如果服務不好,遲早要被淘汰。所以做技術要考慮客戶的感受。USB的四種傳輸基本上是夠用的:控制傳輸(control)、批量傳輸(bulk)、中斷傳輸(interrupt)、同步傳輸(iso)。

四種傳輸是usb立足江湖不可或缺的,不同的應用場合,設備可以使用不同的傳輸方式,也因此誕生了各式各樣、豐富多彩的USB設備。

4.1 控制傳輸

控制就是命令,數據量短小精悍、目標明確。

控制傳輸只能在消息管道進行,因此傳輸的數據流必須依附於USB數據結構上。

1)數據格式

Setup包命令集

具有USB定義的格式

保證主機和設備之間正常通信

允許一些銷售商對設備命令進行擴展

2)傳輸方向——雙向(一般爲端點0)

3)最大的包長度爲64字節

 

4.2 批量傳輸

數據量大,還要求準確。打印機、U盤。

1)數據格式——無要求

2)傳輸方向——單向

3)包長度限制

低速設備不支持批量傳輸

全速設備:64字節

高速設備:512字節

4)支持錯誤檢測和恢復

 

4.3 中斷傳輸

              鼠標、鍵盤,數據量不是很大,週期性的會有新數據。

            1)用於定時查詢設備是否有中斷數據要傳送

            2)根據設備的要求進行週期性調度

全速設備最快每1ms、最慢每255ms發生一次

低速設備最快每10ms、最慢每255ms發生一次

高速設備最快每125us、最慢每4096ms發生一次

3)數據格式——無要求

4)傳輸方向——單向

5)包長度限制

低速設備:8字節

全速設備:64字節

高速設備:1024字節

6)支持錯誤檢測和恢復

 

4.4 同步傳輸

          數據的實時性,而非正確性,帶寬要求很高啊。典型應用攝像頭!

            1)速率恆定,容錯的傳輸

因錯誤使傳輸失敗,不再重新發送數據

全速設備最大帶寬的90%、高速設備最大帶寬的80%可以分配給週期性傳輸(同步傳輸和中斷傳輸)

            2)數據格式——無要求(流管道)

            3)傳輸方向——單向

            4)服務週期——在相連的幀時隙中被定期調度

            5)包長度限制

低速設備不支持同步傳輸

全速情況下,最大包值爲1023字節

高速情況下,最大包值爲1024字節

            6)不支持錯誤檢測和恢復

 

       到此,我們對USB家族成員的看家本領有了初步的認識,在後面的使用過程中,會對他們進一步的瞭解,直到將這些東西瞭然於胸,不用特意感受他的存在。掌握知識點的最好方式是在使用過程中,所以有時我更喜歡“好讀書不求甚解”這句話,因爲在後面的使用過程中,以前沒理解的可能會突然間就理解了。前前後後的知識點,互相照應,形成網狀。


發佈了112 篇原創文章 · 獲贊 66 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章