盧宇清,張 巍
LU Yu-qing1,2, ZHANG Wei2
(1.河南師范大學 物理與信息工程學院,新鄉 453007;2.河南農業職業學院,鄭州 451450)
Universal Serial Bus(USB)是連接外部設備和主機的一種標準接口。隨著微軟在操作系統中內置了對USB接口的支持模塊,加上USB設備的日漸增多,USB接口逐步走進了實用階段。
USB是一種靈活的接口技術,可替代計算機中串行口或并行口,支持許多新型的接口。USB的超強性能意味著要比它所替代的老式串行接口和并行接口都復雜。實現USB接口是一個極大的挑戰。不管是USB主機一側的開發,還是USB設備一側的開發,從技術角度來講,都有相當的難度。
USB總線信號分析系統其整體功能的實現是一個軟硬件協同工作的過程。USB總線信號分析系統由六部分組成:用戶USB總線信號采集電路、CPLD硬件與Verilog程序、FIFO存儲器、MCU硬件與固件程序、設備驅動程序和信號分析軟件。前四部分裝配在一塊線路板上,構成系統的硬件;后兩部分安裝在分析主機上,為系統的高層軟件。為使系統正常工作,必須把各種設備正確連接起來,還要安裝設備驅動程序和信號分析軟件。
USB電纜兩端各有一個連接器,中間不允許分叉。連接到用戶USB總線上需要使用兩個USB連接器,通過板上的布線直接相連。一個通過一條電纜連接到用戶USB主機,另一個連接器通過另外一條電纜連接到用戶設備。在線路板上放置一個USB收發器,與兩個USB連接器相連。在信號傳輸的時候,就能同時接收USB總線上的信號。
CPLD是一種用戶根據需要而自行構造邏輯功能的數字集成電路。CPLD是整個系統中非常關鍵的一個部件,它直接決定系統實現的成功與失敗。因此,必須認真分析需求,周密設計代碼,合理仿真功能,力求最大限度地有效利用CPLD的功能。
2.2.1 CPLD功能
在USB總線信號分析系統中,為了準確地接收USB的數據流,CPLD中設置了去噪聲模塊,既使接收的數據中混入了噪聲,接收器也能正常工作。要正確獲得數據,首先要正確恢復時鐘。低速USB的發送時鐘為1.5MHz,全速USB的發送時鐘為12MHz,CPLD也必須生成相應的接收時鐘信號,為此,CPLD中設置了一個相位跟蹤電路(DPLL)。
2.2.2 相位跟蹤電路
DPLL(Digit Phase Lock Loop)是一種使輸出信號相位與輸入信號相位保持一致的電路,也就是相位跟蹤電路。在UPA11中,DPLL根據用戶USB總線的速率產生1.5MHz或12MHz數據接收時鐘,該電路監視輸入信號的變化,一旦發現信號出現了邊沿,立即調整接收時鐘的相位,確保與發送時鐘同步,同時保證了讀取數據的準確性。
2.2.3 有限狀態機(FSM)
FSM(Finite State Machine)稱為有限狀態機,是CPLD/FPGA中最常用的部件之一。通常,用FSM實現各種各樣的狀態轉換圖。FSM有四個狀態,即初始狀態、SE0狀態、空閑狀態和接收狀態,用來表示用戶USB總線的活動。這四個狀態覆蓋了所有用戶USB總線狀態和用戶USB總線事件,低速和全速也都支持。
用戶USB總線有四種基本狀態:SE0狀態、空閑狀態、J狀態和K狀態。空閑狀態與J狀態的差別僅在于驅動器是否驅動,它們對應的DP、DM和RCV都是相同的。為此,把空閑狀態與EOP中的J狀態合二為一,統稱為空閑狀態。
用戶USB總線傳輸數據包時,涉及到的狀態只有兩個,即J狀態和K狀態。把這兩個狀態合并為接收狀態,為“正在接收用戶USB總線上的數據包”之意。接收狀態也包括遠程喚醒信號,只不過接收到的將是以FE打頭,后跟若干個FF的數據包。
用戶USB總線的事件有設備插入、設備拔出、設備復位、設備掛起、設備恢復等,對應FSM的一種或幾種狀態。
綜上所述,用戶USB總線狀態和事件都可以歸納到FSM狀態機的一種或幾種狀態。
根據USB 1.1規范,USB總線的速率是由D+或D-的上拉電阻決定的。識別速率的最準確的位置應該是從SE0狀態轉換到空閑狀態的時刻。如果空閑狀態時DP=1,則用戶USB總線是全速。否則,如果DM=1,則用戶USB總線是低速。
2.2.4 MCU數據包裝配
CPLD輸入信號是DP,DM和RCV,輸出的則是MCU數據包。MCU數據包是對USB數據包的再次封裝,其一般格式為:
STX USB數據包 ETX
STX是MCU數據包的開始,其值為0F;ETX是MCU數據包的結束,其值為04。為了避免USB數據包中的STX、ETX被誤認為MCU數據包的開始結束,特別增加了“字節插入”。 “字節插入”符為Byte_Stuff,其值為05 。當USB數據包中出現了STX,ETX或Byte_Stuff時,在其前面都要插入一個Byte_Stuff。例如:
USB數據包為:80 C3 03 04 05 06
對應的MCU數據包為:0F 80 C3 03 05 04 05 05 06 04
2.2.5 數據輸出
數據輸出包括輸出隊列的管理、輸出總線和寫入信號管理兩部分。輸出隊列的管理包括取數據和指針移動。
在USB數據包結束處,如果最后一個數據正好是STX、ETX或Byte_Stuff之一,則輸出順序應該是Byte_Stuff、數據、ETX。這三個字節在同一時鐘周期出現,但輸出一個字節要用兩個時鐘周期,并且輸出時一次只能輸出一個字節。這時,把同時出現的數據按照既定的Byte_Stuff、數據、ETX的順序把標志位存放在輸出隊列中等待輸出。
MCU(Micro Controller Unit),簡稱單片機,是指隨著大規模集成電路的出現及其發展,將計算機的CPU、RAM、ROM、定時器和多種I/O接口集成在一片芯片上,形成芯片級的計算機。
MCU主要功能有:MCU初始化;中斷服務程序;USB標準請求服務程序;讀取FIFO數據;向分析主機轉發數據。MCU的主要作用是把CPLD生成的數據轉發給分析主機。
MCU固件分中斷服務程序和主程序,這兩部分程序交叉執行,中斷可能在主程序的任何地方發生并開始執行中斷服務程序。中斷服務程序基本上是線性執行的,主程序除了初始化部分以外則是無窮循環執行。
USB總線信號分析系統必須配合適當的分析軟件才能發揮作用。分析軟件安裝在計算機上,由應用程序、動態連接庫、設備驅動程序三部分組成,它們相互協調,完成數據控制、傳輸、分析等工作。
2.4.1 驅動程序
馬戴的思鄉情結與隱逸情懷也是聯系在一起的,他在詩中每次提到回到家鄉就是要去過隱居生活,如其《客行》云:
所有USB設備必須有匹配的設備驅動程序才能正常工作,UPA11的設備驅動程序來自Microchip公司的通用USB驅動程序,當前最新版本是Microchip MCHPFSUSB v2.1,可從該公司網站免費下載。
2.4.2 應用程序對UPA11硬件的訪問
應用程序對硬件的訪問包括開始捕捉、停止捕捉和讀取數據。
控制捕捉是通過向OUT1管道發送一個控制位來實現的,如果向OUT1端點發送的第一個字節的最高位為1,就會打開硬件捕捉功能;否則關閉捕捉。捕捉的數據是通過IN1端點傳輸到應用軟件的。一旦開始捕捉,應用軟件必須始終讀取UPA11的數據,否則可能丟失數據。
2.4.3 快速讀取UPA11的數據
一旦啟動捕捉,在短時間內,CPLD可能輸出大量數據。為了防止數據丟失,唯一的辦法就是使用緩存。當FIFO緩存中存有數據以后,MCU必須盡快取出,并存儲到IN1端口的數據區,一旦MCU收到主機發來的IN數據包,可以立即發送出去。為了減少時間延遲,MCU內部設置了14個IN1端口的數據區,作為數據緩沖。
對于從FIFO取來的數據,MCU只是簡單地放入某一個IN1數據區,當一個數據區放滿,則轉到下一數據區,除非所有數據區都存滿了數據。
2.4.4 USB數據包分離、檢測、過濾
從硬件得到的是連續的數據流,首先必須從這些數據流中分離出一個一個的USB數據包,然后才能對它們進行分析和顯示。CPLD在發送USB數據包時采用了編碼,在應用程序中,必須對這種編碼后的數據進行解碼,還原出原來的USB數據包。
當一個USB數據包被分離出來后,首先必須進行錯誤檢測,找出其中可能存在的各種錯誤,包括同步錯、PID錯、CRC5錯、CRC16錯等。分析出錯誤的類型以后,用戶可以查找錯誤的原因。
過濾是UPA11的重要功能,通過使用過濾器,可以僅顯示那些感興趣的數據包,而那些SOF、NAK之類的數據包可以被屏蔽。
2.4.5 USB數據包分析
USB包(Packet)是最小的傳輸單位,其中的數據不容易被人們理解,但顯示這些數據卻是必需的。如果把一個USB事務的所有包集中為獨立的一項,并根據令牌包恰當命名,便很容易讓人們在更高的層次上理解其作用。一個USB傳輸或USB請求可能有1~n個USB事務組成。如果能在USB傳輸或USB請求的級別上進行歸納分析,并以樹狀層次顯示出來,將有很大的價值。
為實現這些功能,必須跟蹤USB主機和USB設備的所有數據包,確定每一個數據包所處的位置,并根據上下文總結出符合邏輯的功能描述。當收到一個USB數據包以后,應用程序需要做以下處理:根據狀態機的當前狀態和輸入的包,決定下一狀態;根據當前狀態和下一狀態,在顯示樹的不同層次上建立相應的顯示節點;如果條件滿足,為更高的層歸納出一個概括性的功能。為此,應用軟件內部設置了一個USB數據包狀態機,該狀態機始終描述USB主機與設備之間數據傳輸的狀態,它支持USB的四種傳輸類型。
本文在USB1.1規范的基礎上,根據國內外USB接口的發展現狀,做了一些研究,也得到了一些有意義的結果,完成了USB總線信號分析系統的設計與實現。但是USB總線信號分析研究仍處于初級階段,后期可以進行硬件、固件的升級和應用軟件的擴展。
[1] 蔡軍生.USB協議深入分析.[J/OL].
[2] 中國IT實驗室.USB設備的調試與測試技巧.[J/OL].
[3] Microchip Technology Inc.PIC18F2550 Data Sheet(Chinese).[J/OL].