摘 要: 從實用的角度出發(fā),對USB協(xié)議" title="USB協(xié)議">USB協(xié)議" title="USB協(xié)議">USB協(xié)議進行了簡單的解釋,并對實際設計USB設備時必須考慮的一些關鍵問題作了比較全面的討論。
關鍵詞: USB 端點 描述符
USB(Universal Serial Bus)是近年來應用在PC領域的新型接口技術,它是由一些PC大廠商如Microsoft、Intel等為了解決日益增加的PC外設與有限的主板插槽和端口之間的矛盾而制定的一種通用串行接口。USB接口具有許多優(yōu)點,如接口簡單、速度快、支持即插即用和熱插拔等。本文從實用的角度出發(fā),對USB協(xié)議和USB設備的設計(Windows環(huán)境下)進行了通俗的說明。由于USB協(xié)議的復雜性,許多具體問題不可能在一篇文章中講清楚,所以本文只能起到拋磚引玉的作用。
1 USB協(xié)議的一些關鍵概念和問題的說明
1.1 USB主機和USB設備
USB通信中居于核心地位的是主機(Host),常見的USB主機是PC機。任何一次USB的數(shù)據(jù)傳輸都必須由主機發(fā)起和控制;所有的USB外設都只能和主機建立連接;任何二個外設之間或是二個主機之間都無法直接通信。所以,USB主機和USB設備的功能是不同的。
USB主機的功能有:(1)如果需要,通過USB接口給外設提供電源(因為外設也可以自帶電源)。(2)檢測和配置設備(即設備的枚舉)。如:它必須檢測出設備的連接和拔除,了解設備的功能,給設備分配地址等。(3)錯誤檢查和管理數(shù)據(jù)的傳輸。這些由USB接口硬件保證,不必編程處理。(4)根據(jù)設定的傳輸方式與外設交換數(shù)據(jù)。
USB設備的功能有:(1)管理電源。設備可以由USB接口獲取電源,也可能有自己的電源。設備在USB接口無通信作用超過3ms后應進入低耗電的暫停狀態(tài)。(2)檢測通信。每一個設備都要檢測通信信息包中的地址是否和本設備的地址相符,如果不符,設備就會忽略本次通信,這由USB接口硬件自動進行處理。在設備一開始連上USB接口時,使用固定的默認地址0,然后USB主機在檢測階段會給設備分配一個地址,以后的通信都按這個地址進行。(3)通信數(shù)據(jù)的錯誤檢查。由USB接口硬件保證,不必編程處理。(4)響應請求。主機在檢測到有設備連接上以后,會按USB協(xié)議發(fā)送相應的設備請求來了解設備的類型和能力,并對設備進行一些配置(如設定地址和配置描述符),設備應能響應這些請求,并返回相應的應答數(shù)據(jù)。(5)根據(jù)設定的傳輸方式與主機交換數(shù)據(jù)。
1.2 USB主機和USB設備之間數(shù)據(jù)的傳輸方式
目前,USB協(xié)議規(guī)定了四種數(shù)據(jù)傳輸方式:(1)控制傳輸。主要用于主機對設備的檢測和配置。(2)中斷傳輸。用來支持那些偶然需要數(shù)據(jù)通信,但服務時間受限制的設備。中斷傳輸常常用在鍵盤、鼠標和游戲桿等設備上。(3)批量傳輸。適合使用在時間不重要的場合。批量傳輸可以傳輸大量的數(shù)據(jù)而不會阻塞總線,因為它會讓其他類型的傳輸先執(zhí)行,以等待可以傳輸?shù)臅r間,如用于磁盤操作。(4)同步傳輸。適合用于以固定速率進行的傳輸,而且可以容忍偶爾的錯誤,如實時語音傳輸。
1.3 設備的端點
任何的數(shù)據(jù)傳輸都是傳遞到一個USB設備(確切地說是USB接口器件)的端點(Endpoint),或是由一個USB設備的端點發(fā)出??梢园讯它c簡單地理解成USB接口器件中的一個緩存器,用來作為數(shù)據(jù)的緩沖區(qū),它由相應的控制寄存器和狀態(tài)寄存器來管理。儲存設備端點中儲存的可能是接收到的數(shù)據(jù),也可能是等待要送出的數(shù)據(jù)。主機也有接收與傳送數(shù)據(jù)的緩沖區(qū),不過主機并沒有把它定義成端點,而是當作與設備端點通信的出發(fā)點(Starting Point)。一個USB設備可能有好幾個端點,每個端點可以設置成輸出或輸入方向以及控制、中斷、批量或同步傳輸方式中的一種。因為主機一開始是通過端點0來檢測和配置設備的,所以每個設備都必須有一個端點0,而且其傳輸方式必須是控制傳輸(一般USB接口器件默認支持)。除此之外,設備很少需要其他的控制端點。USB協(xié)議定義了11個標準請求命令,用于在端點0以控制傳輸方式來檢測和配置設備。
1.4 設備的描述符
USB主機是通過請求USB設備的一系列描述符來獲取設備的信息的。描述符是一種定義好的數(shù)據(jù)結構,其中可能包含整個設備的信息,或是設備中的一個組件的信息。主機請求描述符,設備回復描述符。目前,USB協(xié)議定義了三種類型的描述符:(1)標準類型。用于提供設備的基本信息。標準類型的描述符主要有:設備描述符、配置描述符、接口描述符、端點描述符以及字符串描述符等。(2)設備類別特定描述符。用于提供設備更詳細的信息。如HID類(人機接口類)設備的類別特定描述符中的HID描述符和報表描述符,就可以用來描述設備究竟是一個鼠標還是一個鍵盤。如果是鼠標,則報表描述符的數(shù)據(jù)就是鼠標的按鍵和位移。(3)廠商特定描述符。也是用于提供設備的一些更詳細信息,不過它是由廠商自己定義的,不像設備類別特定描述符那樣是USB規(guī)范定義的。標準類型的描述符如圖1所示。下面介紹其中5種常用描述符,其他描述符請參考相關的資料。
如圖1所示,每個設備只能有一個設備描述符,每個設備描述符可以有多個配置描述符,每個配置描述符可以有多個接口描述符,每個接口描述符可以有多個端點描述符。字符串描述符(可選)定義了可能用到的字符串,其他的描述符可以根據(jù)字符串描述符中相應的索引值來引用相應的字符串。USB主機在一個控制傳輸?shù)腢SB設置事務的數(shù)據(jù)信息包中,用GET_DESCRIPTOR標準請求(對應的請求碼為0x06)來請求各種標準描述符;設備通過相應的字段識別出主機請求的到底是哪一種描述符,并返回相應的描述符和聯(lián)絡信號。這是USB設備的固件編程所要做的工作之一。
1.5 USB數(shù)據(jù)信息包的格式
信息包(Packet)是USB傳輸數(shù)據(jù)組織的基本形式,其具體意義和實際內容通過相應的一系列字段來表示,有的字段在USB協(xié)議中有定義好的關鍵字。信息包的字段類型有:
?。?)SYNC字段,用于信息包的開始與同步,它由硬件自動處理。
(2)PID字段,信息包標識符(Packet Identifier,PID),信息包共有四種類型:令牌、數(shù)據(jù)、聯(lián)絡和特殊,四種類型共對應16個PID碼。
(3)地址字段,用于指明USB主機究竟是要和哪個設備通信,設備的地址初始默認為0,主機會在設備檢測階段給設備分配一個地址。
(4)端點字段,用于指明USB主機究竟是要和設備的哪個端點進行通信。如前所述,一個設備可以有多個端點。
?。?)幀號碼字段,USB主機把USB總線上的實際數(shù)據(jù)傳輸按時間分割成一塊塊的幀(Frame)或微幀(Micro Frame)。對于全速和低速的設備,主機將傳輸分成1毫秒的幀,對于高速設備主機將傳輸分成125微秒的微幀。幀號碼字段就是用于識別特定的幀或微幀,它由硬件自動處理。
(6)數(shù)據(jù)字段,為實際要傳輸?shù)臄?shù)據(jù)。
(7)校驗字段,用于信息包的數(shù)據(jù)校驗,它由硬件自動處理。
下面對PID字段作進一步的說明,因為這個字段對于理解信息包的概念至關重要。USB協(xié)議規(guī)定數(shù)據(jù)傳輸由事務(Transaction)(事務的概念見1.6的介紹)組成,而事務由信息包組成。一般來說,大多數(shù)事務包含三個信息包:令牌信息包、數(shù)據(jù)信息包和聯(lián)絡信息包。信息包根據(jù)PID字段(USB協(xié)議定義了16個PID碼)來區(qū)分不同的類型。令牌信息包有四種類型:
(1)OUT,表示主機輸出數(shù)據(jù)到設備;
(2)IN,表示主機從設備讀取數(shù)據(jù);
(3)SOF,表示幀標號開始;
(4)SETUP,專門用于控制傳輸?shù)脑O置事務。
數(shù)據(jù)信息包和聯(lián)絡信息包也有各自的PID碼,這里不再細述。其中,只有OUT、IN和SETUP類型的令牌信息包中需要指定地址字段和端點字段。這也容易理解,因為既然稱為“令牌”,當然首先要確定和哪個設備以及設備的哪個端點進行通信。由此也可以看出,USB在數(shù)據(jù)傳輸中使用的是軟件聯(lián)絡方式,所以大大簡化了接口形式。而常用的RS-232串行通信還有一些硬件的聯(lián)絡方式,如RTS和CTS信號線。雖然RS-232串行通信中也可以使用一些簡單的軟件聯(lián)絡方式,如XON和XOFF碼,但與USB的軟件聯(lián)絡方式相比就顯得太簡單了。
1.6 事 務
USB協(xié)議規(guī)范將事務定義為“將一個服務傳送到一個端點”,這里的服務指的是主機傳送信息給設備,或是主機從設備接收信息。每一個傳輸可以包含一筆或多筆事務,而每一筆事務可以包含一個、二個或三個信息包,可以把信息包理解為數(shù)據(jù)傳輸物理上的基本單位。大部分事務都包含三個信息包:令牌信息包、數(shù)據(jù)信息包和聯(lián)絡信息包。根據(jù)令牌信息包的PID標識,事務一般分為三種類型:輸入(IN)事務、輸出(OUT)事務和設置(SETUP)事務。每一種傳輸類型(控制、中斷、批量以及同步)包含一個或多個階段,而每一個階段包含一個或多個事務。具體說來,在控制傳輸中,一般包含設置事務階段(對應于設置事務類型)、數(shù)據(jù)階段(對應于輸入或輸出事務類型)以及狀態(tài)階段(對應于輸入或輸出事務類型),而中斷、批量以及同步傳輸中只包含數(shù)據(jù)階段。這其中,設置階段包含一個設置事務(由令牌信息包、數(shù)據(jù)信息包和聯(lián)絡信息包組成);數(shù)據(jù)階段可能由多個事務組成,一般每個事務也是由令牌信息包、數(shù)據(jù)信息包和聯(lián)絡信息包組成的(只有同步傳輸?shù)臄?shù)據(jù)階段的事務中不包含聯(lián)絡信息包);狀態(tài)階段包含一個事務,該事務也是由令牌信息包、數(shù)據(jù)信息包和聯(lián)絡信息包組成,不過數(shù)據(jù)信息包的內容為空,狀態(tài)階段只用于控制傳輸,以表明整個控制傳輸是否成功。
1.7 USB設備驅動程序的加載
在主機從設備描述符了解到設備的信息后,它會尋找一個最合適的驅動程序來管理主機和設備的通信。在選擇驅動程序時,Windows會試圖將系統(tǒng)的.inf文件內的信息與從設備內讀出的廠商和產品ID以及版本號作比較,如果相符,就根據(jù)相應的.inf文件加載驅動程序。如果Windows找不到合適的.inf文件,它會顯示一個“添加新硬件向導”來讓用戶指定驅動程序。
2 USB設備的設計
2.1 USB設備的設計概述
USB規(guī)范定義了許多設備類型,用不同的設備類別碼和接口類別碼來表示,如HID(Human Interface Device,人機接口類設備)設備類別碼是0x00,接口類別碼是0x03,HID類的設備有鍵盤、鼠標以及游戲桿等;Mass Storage(大容量存儲設備)的設備類別碼也是0x00,而接口類別碼是0x09,Mass Storage類的設備有軟盤、硬盤、光盤以及FLASH盤等;其他還有顯示器類、通信設備類、音頻設備類等。USB規(guī)范中還有一個特別的Vendor Specific類設備,用于廠商自定義設備類型,其接口類別碼為0xFF。所以,設計者總是可以找到一種適合自己要設計的設備類型。
設計USB設備時,首先要確定好設備到底屬于哪個類別,然后要實現(xiàn)基本USB通信協(xié)議以及設備的類別通信協(xié)議。例如,U盤屬于Mass Storage設備,所以設計U盤時,除了要實現(xiàn)基本的USB通信協(xié)議,還要實現(xiàn)大容量存儲設備類規(guī)范中的UFI命令規(guī)范。由于Windows 提供了對Mass Storage 協(xié)議的支持,因此U盤只需要遵循Mass Storage 協(xié)議來組織數(shù)據(jù)和處理命令,即可實現(xiàn)與PC 機交換數(shù)據(jù)。一般來說,一個USB設備的完整設計過程主要包括四個部分:
(1)USB硬件接口的設計;
(2)設備固件的編程;
(3)PC端設備驅動程序的開發(fā);
(4)PC端設備應用程序的開發(fā)。
2.2 USB硬件接口設計
USB接口芯片一般有二種選擇方案:(1)USB芯片本身就是一個微控制器,如Cypress的EZ-USB系列芯片,與8051兼容,大部分EZ-USB芯片支持最大數(shù)目的端點(一個控制端點0以及30個額外的端點)以及所有的4種傳輸方式;(2)USB芯片只處理USB通信,所以它必須由外部的微控制器來控制,如PLILIPS的PDIUSBD12,它符合USB1.1規(guī)范,包含默認端點0在內共有3個雙向端點。
2.3 控制器的固件編程
USB接口芯片收到數(shù)據(jù)或發(fā)送出數(shù)據(jù)后都會產生中斷,所以固件編程的核心就是編寫中斷服務程序。這項工作主要就是根據(jù)相關寄存器的標志來對各個端點緩沖區(qū)的數(shù)據(jù)進行處理??梢园阎袛喾粘绦蚍譃橐恍┕δ苣K(函數(shù))來考慮:(1)端點0的響應。當設備插上USB接口后,主機會發(fā)出一系列的請求給設備的端點0,設備的固件程序應該能在端點0對這些要求進行正確響應。(2)其他端點的數(shù)據(jù)通信過程。通過(1)主機就能知道設備端點的使用情況,以后就可以通過其他端點以設定的傳輸方式來交換數(shù)據(jù)。(3)實現(xiàn)設備類別遵循的協(xié)議規(guī)范。例如,如果要設計U盤,則U盤的固件程序就要實現(xiàn)對Mass Storage Class規(guī)范中的UFI命令規(guī)范的支持。
2.4 PC端驅動程序的開發(fā)
在Windows內執(zhí)行的USB設備驅動程序,必須符合Microsoft定義的Win32驅動程序模型(Win32 Driver Model,WDM)。它是一種分層的驅動程序模型。Microsoft提供了Windows DDK(Windows Device Developer′s Kit)工具和VC編譯器來編寫WDM驅動程序,具體請參考相關的開發(fā)指南。也有許多第三方的工具軟件可以用來編寫USB的WDM驅動程序,如Jungo 的WinDriver USB。使用這類工具軟件不需要深入了解WDM的編程細節(jié)。
2.5 PC端應用程序的設計
在Win32系統(tǒng)中,操作系統(tǒng)把每一個設備都抽象為文件,應用程序的設計只需要通過幾條簡單的文件操作API函數(shù),就可以實現(xiàn)與設備的驅動程序通信。這類Win32函數(shù)有以下幾種:(1)CreatFile函數(shù),用于打開一個設備,返回一個與設備相關的句柄;(2)ReadFile函數(shù),用于從設備中讀取數(shù)據(jù);(3)WriteFile函數(shù),用于向設備寫數(shù)據(jù);(4)DeviceIoControl函數(shù),用于對設備進行一些控制操作,如更改設置等;(5)CloseHandle函數(shù),關閉一個由CreatFile函數(shù)所打開的設備,函數(shù)的參數(shù)為CreatFile函數(shù)返回的設備句柄。還有其他一些和USB設備類別相關的API,可用于獲取設備的信息,如設備路徑和名稱等,具體請參考相關的開發(fā)指南。
3 結 論
本文對設計USB設備所涉及到的一些關鍵問題作了比較全面和通俗的解釋。鑒于USB接口具有的優(yōu)點,可以想象USB設備必將獲得越來越廣泛的應用。
參考文獻
1 蕭世文.USB2.0硬件設計.北京:清華大學出版社,2003
2 周立功.PDIUSBD12 USB固件編程與驅動開發(fā).北京:北京航空航天大學出版社,2003
3 馬偉.嵌入式USB主機系統(tǒng)的研究與設計.計算機測量與控制.2003;11(5):381