linux--USB協議

端點

端點是一個USB設備唯一可以確認的部分,他是主機和設備之間的通信流的重點。每一個USB邏輯設備都包含了一個相當獨立的進行操作的端點的集合。軟件只能夠通過一個或者多個端點與一個USB設備通信。在設備接入的時候,每一個邏輯設備都有一個由系統分配的唯一的地址。而一個設備上的任意一個端點都有一個由設備而定(設計時)唯一的標識和端點號。利用設備的地址和端點號就可以唯一的指定任意一個端點。

端點可以決定端點和客戶軟件之間通信所需要的傳輸服務類型。一個端點可以由一下的幾個內容來描述:

  1. 總線訪問頻率/延時要求
  2. 帶寬要求。
  3. 端點號。
  4. 差錯控制要求。
  5. 端點可以接收或者傳遞的最大分組包。
  6. 端點的傳送類型。
  7. 對于同步傳輸而言,還要包括端點和主機之間的數據傳輸方向。

一個端點只有在對其進行配置以后才能夠被使用。包括端點0在內的所有端點,都作為設備配置過程中的普通部分來對其進行配置。

管道

一個USB管道是設備上的一個端點和主機上的軟件的聯合體。管道表示經過一個存儲器緩沖區和一個設備上的端點,可以在主機上的軟件之間傳送數據的能力。管道類型分為:流管道和消息管道。但是USB并不對通過一個管道傳遞的數據內容進行翻譯,即使是消息管道要求根據USB的規定對數據進行打包,USB也不會翻譯這些數據內容。另外,管道還需要確定一下的三個參數:

  1. 對USB總線訪問和帶寬使用的聲明。
  2. 傳輸的類型。
  3. 所對應的端點的特征,如方向和最大數據負載尺寸等。其中數據負載是指總線操作當中,一個數據分組的數據域當中所攜帶的分組。

一個客戶軟件通常是通過向一個管道發出IRP來要求傳送數據,發出IRP之后客戶軟件就等待或者是得到指示。IRP定義的細節由具體的操作系統而定。當與一個IRP相對應的總線操作完成以后,無論其是成功還是由于出錯而結束,這個客戶軟甲都會被告知IRP已經處理完成。
  為通過總線來傳輸數據,一個IRP可能需要多個數據負載。對于一個需要多個數據負載的IRP來說,其分組的數據域應該具有最大的尺寸。直到最后一個數據載荷中包含該IRP中的剩余的部分。

控制傳輸

控制傳輸允許對一個設備的不同部分進行訪問,他用于支持客戶軟件和功能模塊之間的配置/命令/狀態等類型的通信流。一個控制傳輸由以下的幾個部分構成;

  1. 總線建立操作,負責將請求信息由主機送到功能模塊;
  2. 零個或者是多個數據處理操作,傳輸方向由建立操作指定。
  3. 狀態處理操作,用于功能模塊向主機返回狀態信息。
    當一個端點成功的完成了請求操作的處理時,狀態處理操作就返回成功狀態。控制傳輸只能由消息管道來實現。控制傳輸的數據流必須按照一定的數據結構來進行。一個功能模塊及其軟件不能夠請求某個訪問頻率或者是帶寬。USB系統軟件將對一個設備所要求的控制傳輸的總線訪問和帶寬加以限制。

控制傳輸最少具有兩個處理階段:創建和狀態。一個控制傳輸可以選擇在創建和狀態階段之間再包含一個數據階段。在創建階段,一個創建處理操作用于向一個功能設備的控制端點傳送信息。創建處理操作所具有的格式與一個out處理相似。但是他使用的是SETUP而不是OUT PID。一個創建處理操作總是對其數據域使用一個DATA0 PID。接受一個創建處理操作的功能設備必須接受創建處理數據并使用一個ACK握手分組來響應,或者是如果這個數據被破壞了,它必須要丟棄該數據并且不返回任何握手分組。
  如果一個控制傳輸內有數據階段的話,那么這個數據階段就包含了一個或者是多個IN或OUT處理。并且要遵循和批量傳輸一樣的協議原則。在數據階段所有的處理操作都必須具有同樣的方向,即全部是IN或全部是OUT。在數據階段傳輸的數據量及其方向都是在創建階段加以說明了的。若數據量超過了預先確定的數據分組的大小,那么數據就會在多個裝載了最大分組大小的處理操作內傳送(IN或OUT).任何剩余的數據都將作為剩余量而在最后一個處理操作內發送。
  一個控制傳輸中的狀態階段是該序列中的最后一個操作。一個狀態階段由相對于前一個階段數據流方向的變化來描述,并且總是使用一個DATA1 PID。例如,若一個數據階段包含有OUT,那么狀態就是一個單一的IN處理操作。若一個控制序列沒有數據階段,那么它就包括一個創建階段,再跟上一個包含了一個IN處理的狀態階段。下圖說明了處理順序、數據序列比特值和用于控制讀和寫序列的數據PID類型。序列的比特號在括號內給出:

  1. 報告狀態結果:狀態階段向主機報告該傳輸中前一個創建和數據階段的輸出。可能的返回有三種:命令序列成功完成/ 命令序列未能完成/ 功能設備正在忙著完成命令。
      報告狀態總是具有從功能設備到主機的方向。下圖對每一種結果所要求的響應類型作了總結:

控制寫傳輸在該傳輸中的數據階段返回狀態信息。在前一個數據階段內主機發送了一個長度為0的數據之后,控制讀傳輸將在握手階段返回狀態信息。

對于控制讀,主機向控制端點發送一個零長度的數據分組。端點作出握手響應說明狀態階段的結束。NAK說明該功能設備仍處在處理命令,而主機應該繼續狀態階段。ACK說明該功能設備已經完成了這一命令,并為接收一個新的命令做好了準備。而STALL則說明該功能設備出現了一個阻礙其完成命令的錯誤。
  對于控制寫而言,功能設備不是用一個握手,就是用一個0長度的數據分組來響應,以指出其狀態。一個NAK說明該功能設備仍然在處理命令,而主機應該延續狀態階段。返回一個0長度分組則說明命令已經完成,而STALL則說明該功能設備出現了錯誤。在數據階段返回一個0長度數據分組的控制寫傳輸,會使主機向該功能設備返回一個ACK握手分組。
  在一個數據或者是狀態階段,如果向一個命令端點發送了或者是要求一個命令端點返回多于在創建階段所指明的數據,它就應該返回一個STALL。如果一個控制端點在數據階段返回了STALL,那么該控制傳輸就沒有狀態階段。

5.7.3 控制傳輸

用于實現一個一個中斷管道的某一個端點要說明它將要傳輸的最大數據負載。全速率設備<=64字節,低速率設備<=8字節。這個最大值將用于數據分組,既這個尺寸限制只對分組中的數據域有限制。并不包括其他的協議要求的信息。

在設備的配置操作中,USB系統軟件將決定一個中斷管道可以利用的最大數據負載尺寸。USB軟件不會像對待控制管道一樣,為一個中斷管道調整其可用的總線時間。在USB子系統的配置過程中,一個中斷管道要么可以支持,要么不可以支持。一個客戶端軟件可以通過用于要求多個總線處理操作的中斷傳輸的一個IRP來接收數據,而不需要每一個IRP都有完整的IRP指示。通過申明一個可以存儲所需大小的緩沖區可以達到這一目的。緩沖區的大小是MaxPacketSize規定值的倍數再加上一定的的剩余量。若一個中斷傳輸端點要傳輸的數據量小魚客戶軟件的預計值,那么主控制器將會收到一個數據負載小魚最大值的數據。這一個分組將會使得主機廢除當前的IRP而轉向下一個IRP。

5.8 批量傳輸

申請一個批量傳輸類型的管道需要提供下列條件:

  1. 根據可用帶寬對USB進行訪問。
  2. 如果由于總現上的錯誤而出現偶然的傳輸失敗,需要重試。
  3. 保證對數據的傳輸,但是不對帶寬或者是時延提供保證。

批量管道之中的數據流不具有USB規定的數據結構。批量管道是一個流管道,一個管道只能傳輸一個方向的數據。

批量傳輸的數據順序:批量處理操作的數據觸發比特僅僅在處理操作完成時進行觸發,利用數據觸發比特可以在出現差錯之后撤銷處理操作時,保護發送器和接收器之間的同步關系。在由一個適當的控制傳輸對某一個端點進行配置的時候,批量處理操作被初始化為DATA0,主機同樣會以DATA0開始第一個批量處理操作。
  一個端點不能指出一個批量管道所要求的總線訪問頻率,USB將負責平衡所有的批量管道和某些未處理的IRP的總線訪問請求。經過總線進行批量傳輸具有比進行批量傳輸更高的優先權。

為了讓處理操作通過總線,傳輸管理包括幾個不同對象進行操作的實體:

  1. 客戶軟件:通過調用/回調(callBack)來向USBD接口請求IRP,使用/產生某個來自或是送往一個功能端點的功能數據。
  2. USB驅動程序(USBD):通過適當的HCD的調用/回調,對客戶IRP中來自或者是送往設備端點的數據交換。

在客戶軟件為其功能模塊請求了一個傳輸并且該請求得到了服務之后,客戶軟件會得到IRP已經完成的通知,如果傳輸中包含了向主機傳輸數據的功能,客戶軟件就會訪問與某個完成了的IRP相對應的數據緩沖區的數據。
  HCD負責在操作過程跟蹤IRP,并且保證不超過USB帶寬和幀時間的最大原因,當為一個管道建立IRP時,HCD會將它們添加到處理操作列表。如果一個IRP完成了,HCD會通知發出請求的客戶軟件,該IRP已經完成。如果這個IRP包含從功能模塊到客戶軟件的數據傳輸,那么數據將會被放置在客戶軟件指定的數據緩沖區中。

USB 驅動程序

在一個接入總線的配置操作和正常的傳輸中,USBD通常要對總線訪問進行兩次斡旋,檔一個設備插入并對其進行配置的時候,需要USBD來保證總線上可以容納所要求的設備的配置操作。USBD從用來說明所需要的設備配置操作的配置軟件中接收配置請求,其內容包括端點、傳輸類型、傳輸周期、數據大小等。根據可用的帶寬和總線上對于請求類型的容納能力,USBD將接受或者拒接一個配置請求。若它接受了該請求,USBD將會為發出請求的設備創建一個所需要類型的管道。該管道具有這種傳輸類型所定義的適當的限制。一旦對一個設備進行了配置,客戶軟件就可以為在它和它的功能端點之間傳輸數據而請求IRP。

計算功能模塊/軟件中的緩沖區的大小

客戶軟件和功能模塊都需要為那些在總線上等待的未處理的數據處理操作提供緩沖區。對于非同步管道而言,緩沖區空間只需要足夠容納下一個數據分組。若對于某一個端點有多個處理操作請求等待處理,就必須要為每一個待處理操作提供緩沖處理。一個功能模塊可能需要能夠用來絕對精確的計算最小緩沖時間的方法,這是因為USB規范并未對功能模塊及其客戶軟件的交互進行規定。

9.3 USB設備請求

所有的USB設備都會對設備缺省管道上來自于主機的請求作出響應,這些請求是利用控制傳輸而產生的。請求和請求參數則是在建立分組中傳送到設備的。主機將會負責建立在下列域中傳送的數值。每一個建立分組都有8個字節,如下如所示:

該請求在Vxworks中對應的已定義好的代碼部分如下:

10.1.2 數據流

主控制器負責在主機和USB設備之間傳輸數據流。這些數據流將被作為一個連續的字節流來對待。每一個設備都實現了一個過著是多個接口,一個客戶利用這些接口來同設備通信。每一個接口都包括0個或更多的管道,這些管道可以在客戶和設備上的某個端點之間分別傳輸數據。USBD會在主機軟件的明確要求之下創建接口和管道。當發出配置請求的時候,主控制器根據主機軟件所提供的參數來提供服務。
  根據將要傳輸的數據的傳遞要求,一個管道有幾種特性。這些特性包括:數據傳輸所要傳輸的速率,是以穩定的數率或是以變化的數率來提供數據,在傳輸之前數據可以被延遲多久和所傳輸的數據丟失是否會是災難性的。

10.3.1 設備配置

不同的操作系統環境使用不同的軟件元件和不同的事件序列來進行設備配置。USB系統不會假定某個操作系統所使用的方法。但是,任一USB系統的實現都必須要遵循一些基本的要求。USB系統采用了一個稱為集線器驅動程序的一個USBD的專門的用戶,由它作為一個用于向某個集線器添加設備和從某個集線器拆除設備的處理中心。一旦集線器驅動程序接到了這樣的指示,它就會以某一個操作系統所特定的方式,利用另外的主機軟件和其他USBD客戶來識別和配置設備。對于每一個設備而言,必須要在三種類型的配置操作完成以后,它才能為使用做好準備:

  1. 設備配置:包括建立設備的所有USB參數和使用該設備可見的主機資源。這些工作是通過在設備上設置配置而完成的。不用對設備全部重新配置,也可以允許像使用交替的設置這樣的有限的配置變化存在。一旦一個設備被配置以后,從他(設備)的觀點而言它已經為使用做好了準備。
  2. USB配置:為了實際建立一個準備有一個客戶來使用的USBD管道,客戶還必須要說明另外的USB信息,而這些信息對于設備來說是不可見的。這一信息稱為管道原則,描述客戶會如何使用管道。它包括了客戶利用一個IRP所能傳輸肚餓最大數據量,客戶可以使用的最大服務時間間隔和客戶的指示標識等項。
  3. 功能配置:一旦配置類型1和2完成之后,從USB的觀點來看管道已經完全為使用做好了準備。但是,在客戶可以實際使用管道之前,可能還需要額外的由供應商或者是設備類型而定義的建立操作。這一配置是在設備和客戶之間所進行的獨立操作,并沒有被USBD對其進行標準化。

配置軟件首先讀取設備描述符,然后會要求對每一個可能的配置加以說明。它可能使用所提供的信息來裝載一個客戶,例如一個設備驅動程序,最初要由它來和設備進行聯系。配置軟件也許還要加上來自于該設備驅動程序的輸入,將為該設備選擇一個配置方案。啟動一個設備的配置操作會建立該設備上的所有端點,并返回一個用于USBD客戶的數據傳輸的接口集。每一個接口都是單個客戶所擁有的管道的集合。最初的配置操作會使用接口的缺省設置和每一個端點的缺省帶寬。另外,當選擇最初的配置方案時,一個USBD實現可以允許客戶說明可以替換的接口。USB系統可以保證有可用的資源來支持該端點,并且如果是這樣的話,就會為其分配所需要的帶寬。
  現在,設備配置已經完成,但是所創建的管道并沒有為使用而做好準備。當客戶利用設置一個原則來說明它是如何同管道進行交互的方法來初始化每一個管道時,USB配置操作就可以完成了。說明的信息中有客戶的最大服務時間間隔和指示信息。作為設置一個策略后的結果,USB系統所采取的操作之一就是確定所要求的緩沖區工作空間比客戶所提供的數據緩沖區空間要大多少。所要求的緩沖區尺寸根據客戶所選擇的使用方式和USB系統的每一個傳輸要求為基礎。
  當IRP完成以后,客戶可以成功的收到指示,或者是出現差錯。客戶也可以獨立地喚醒USB標志信息來檢測未被處理的IRP的狀態。客戶也可以選擇諸如為一個接口啟動一個可交替的設置或者是改變為某個管道所分配的帶寬等等配置修改操作。為了實現這些改變,管道或接口必須分別處于空閑狀態。

10.3.4 公共數據定義

為了允許客戶可以盡可能直接地從其設備接收請求結果,就要求將處理數量和設備同客戶之間所要求的復制操作減至最低。為了簡化這一過程,IRP的某些控制方面得到了標準化,從而使得客戶所提供的信息可以由堆棧中的不同層次來直接使用。用于對著一個數據的特殊格式依賴于操作系統中USBDI的實現。實際上某些數據單元對客戶而言根本就不可見,但卻是作為客戶請求的結果而產生的。接下來的數據單元為一個請求定義了有關的信息:

  • 對與這個請求相對應的管道的標識。標識一個管道也包括對用于這一請求的傳輸類型等信息的說明。
  • 對某個客戶的指示標識。
  • 用于傳輸或者是接收的數據緩沖區的位置或是長度。
  • 提供該請求的完整狀態。根據要求,簡要狀態和詳細的有關于每個處理的狀態都應該提供。
  • 工作空間的位置和長度。這與實現方式有關。
      用于將請求傳送給USBD的實際機制與操作系統有關。但是,除了上述對必須可以使用的與請求相關的信息所提出的要求之外,還有對如何來處理這些請求的要求。另外,USBD提供了一種機制來為一個缺省管道選擇一個不會被中斷、由供應商或者是類型而定的請求集。對于這樣一個不會被中斷的請求集,其他任何請求,包括標準、類型或者是供應商請求都不會被插入到操作流中。若這一請求集中的任一請求失敗,那么整個請求集都會被重試。

10.5 通用串行總線驅動程序(USBD)

USBD的客戶可以向設備發出命令,或者是向管道傳輸數據流或從管道那里接收數據流。USBD為客戶提供了兩組軟件機制:命令機制和管道機制。
  命令機制允許客戶對USBD操作進行配置和控制,也允許對一個USB設備進行配置和通常的控制。更為特殊的是,命令機制提供了對設備缺省管道的所有訪問。(缺省管道經常被用來實現由命令機制來進行中繼的用戶請求的某些部分,但是它卻不能被用戶直接訪問。)
  管道機制允許一個USBD客戶來管理某個設備數據和控制傳輸。管道機制不允許一個客戶直接對設備的缺省管道進行尋址。

  1. 缺省管道:USBD負責分配和管理適當的緩沖操作,用來支持缺省管道上的傳輸,而這些操作同設置一個設備的地址一樣,對于用戶而言是不可見的。對于那些用戶可以直接見到的傳輸而言,例如發送供應商和類型命令或者是讀取一個設備描述符,該用戶必須提供所需要的緩沖作用。
  2. 客戶管道。任何一個不為USBD所擁有和管理的管道都可以由一個USBD客戶來擁有和管理。從IUSBD的觀點而言,管道只會為單個客戶所擁有。實際上,當使用該管道的時候,只要用戶可以像一個協調的組織一樣運轉,一個合作用戶組就可以管理該管道。
      用戶負責在其可以獲得的服務時間內,提供為該管道的數據傳輸速率服務所需的緩存操作。對工作空間內的其它緩存要求則由USB系統來說明。

10.5.4 利用USBD機制來管理USB

配置操作是以每個設備為基礎而進行的,USBD在配置軟件的指揮之下進行設備的配置操作。

  1. 初始設備配置:當一個集線器通過其狀態變化管道報告一個新的USB設備已經接入時,設備的配置過程就開始了。配置管理服務允許配置軟件從設備中所列出的配置集合中挑選出一個USB設備配置方式。在啟動設備配置之前,USBD將核實,在配置過程中向所有的端點提供的數據傳輸速率不超過根據當前的進度表所確定的USB能力。

  2. 修改一個設備配置:配置管理服務允許配置軟件從設備所列出的配置集合中挑選出另外一個配置方案來取代一個USB設備配置。若在新配置過程中向所有端點提供的數據傳輸速率同根據當前的進度表所確定的USB能力相適應,該操作就能夠完成,若新的配置被丟棄,則會保留前一個配置。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,107評論 2 375

推薦閱讀更多精彩內容