1. 程式人生 > >USB基礎瞭解

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