天天看點

WinXP下USB驅動開發(三)

在USB開發當中這三個概念容易混淆,對于真實環境中的USB操作,端點、管道和接口更是不可忽略的,該三者關系如圖2-6-1;

端點、在這裡特指USB實體端點,在NXP LPC2478 USB中最多有32個實體端點,從0到31每一種端點都有其固定的傳輸方式(I/OUT),其中IN是指HUB向HOST發送資料,OUT是指HOST向HUB發送資料。

管道、是一種端點的邏輯概念,說白了就是邏輯端點,是人性的為USB實體端點進行分組,兩個為一組,其中一端點為IN類型,另一種為OUT類型。故NXP LPC2478中可以分為16組邏輯端點,從0到15。

接口、是裝置的一種描述符之一,同時也是端點的集合,用于開啟且儲存端點。

USB定義了四種資料傳輸方式(控制、批量、中斷、等時)。它們的不同之處有:單個事務能攜帶的資料量(下一段将解釋術語“事務”transaction)、能否保證特定的周期或延遲,能否自動校正錯誤。每種傳輸方式對應特定類型的端點。實際上,給定類型的端點(控制、批量、中斷、等時)總是使用對應類型的傳輸。

端點除了傳輸類型外還有其它幾個屬性。其中一個屬性是單一事務中端點能夠提供或消耗的最大資料量。控制和批量端點必須指定某個離散值,而中斷和等時端點能指定少于或等于最大值的任何值。端點的另一個屬性是傳輸方向,輸入(資料從裝置到主要制器)或輸出(資料從主要制器到裝置)。最後,每個端點都有一個端點号,其中包含輸入輸出方向,作為端點的位址使用。

當主要制器要求裝置執行某些多少有些規則的功能時,USB使用一個輪檢(polling)協定。當一個裝置需要向主要制器發送資料時,主要制器必須注意到并且向要發送資料的裝置發出一個請求使其發送資料。即USB裝置不用傳統方式中斷主計算機,而是提供中斷端點,主機周期輪檢中斷端點。

當客戶程式通過USB管道發送或接收資料時,它首先調用Win32 API,調用最終将使function的驅動程式收到一個IRP。而驅動程式的工作就是把客戶的請求引導到有正确端點的管道上。它把請求送出到總線驅動程式,總線驅動程式再把請求分解成多個事務(transaction),然後這些事務被送往總線。總線上的資訊流以每毫秒一幀資料的形式流動。總線驅動程式必須安排好多個事務以使它們能被裝入同一幀中,圖2-6-1 顯示了這個過程。

在USB中,事務由一個或多個階段(phase)組成。階段有令牌(token)、資料(data)、握手(ack)三種類型。根據不同的類型,事務有一個令牌階段、一個可選的資料階段、和一個可選的握手階段組成,如圖2-6-2 所示。在令牌階段,主要制器向所有已配置的裝置廣播該令牌包。令牌包中含有裝置位址,通常還有端點号,僅有被尋址的裝置才會處理事務;當事務尋址裝置時,任何裝置都不讀寫總線。在資料階段,資料被放到總線上。對于輸出事務,主機把資料放到總線上,而被尋址的裝置消耗這些資料。對于輸入事務,情況相反,裝置把資料放到總線上由主機消耗。在握手階段,由裝置或主機把握手包放到總線上,包中含有狀态資訊。當裝置發出握手包時,ACK包指出成功地接收了資訊,NAK包指出忙并且不試圖接收資訊,STALL包指出事務被正确接收但在邏輯上無效。當主機發送握手包時,它僅能發送ACK包。

沒有發出握手包的事務就代表“在這個事務中出現了一個傳輸錯誤”。正在等待握手包的一方應認為缺少握手包可能是發生了錯誤并重試剛才的事務。

繼續閱讀