USB(Universal Serial Bus)通用串行總線是計算機與其外圍設備通信的一種總線標準,是近年來應用在PC領域的新型接口技術。它的熱拔插、即插即用、連接簡單、高帶寬、可總線供電等優(yōu)點幾乎使其成為目前計算機外設的首選通信接口。世界上幾乎所有硬件廠商都生產實現USB協(xié)議的芯片。廠商們本著通用性原則,有的在芯片中嵌入了通用微處理器,如CYPRESS公司CY7C6××××系列和INTEL930××系列嵌入了8051系列微控制器;有的則提供了各種常用的與微處理器接口的方案,如NATIONAL SEMICONDUCTOR公司的USBN960× 系列提供了多路與非多路的8位并行接口、DMA并行接口及微波接口;PHILIPS公司的PDIUSBD11提供了I2C總線接口;三星公司研制的USB功能控制器則具有8位并行微處理器接口,并能以同步或者異步方式工作,這為使用USB協(xié)議作為通信接口提供了極大的方便。然而,將USB功能嵌入到一種用于安全認證的處理系統(tǒng)中,則存在無法與處理器直接接口的問題。本文探討了USB功能模塊和處理器接口技術,并從其基本應用角度出發(fā),給出了相應的軟件流程。具有USB接口的安全認證系統(tǒng)使用簡單、便于攜帶、通信速度快。
1 USB功能模塊
USB功能模塊是基于微處理器應用實現USB協(xié)議的模塊。集成有低速USB收發(fā)器,配置有3個基于FIFO的端點、1個控制端點(8字節(jié))、2個可配置傳輸方向的中斷端點(8字節(jié))。每個端點都配置有相應的控制與狀態(tài)寄存器,帶有一個8 位微處理器并行接口,可工作在同步或異步方式。
USB功能模塊的操作對用戶來說是完全透明的。包的譯碼、數據傳輸到FIFO、從FIFO發(fā)送數據和USB包的裝配都是自動完成的。當接收到一個正確數據包或發(fā)送成功一個數據包,即向MCU發(fā)出中斷請求,請求將數據取走或裝入下一個要發(fā)送的數據包。端點FIFO對USB來說是緩存單元,對MCU來說是一個I/O端口。微處理器通過訪問USB寄存器來控制USB模塊的操作。
1.1 端點0控制/狀態(tài)寄存器
D0:OUT_PKT_RDY FIFO裝有一個有效數據包,USB將其置1,產生中斷,MCU寫D6為1,清除D0。
D1:IN_PKY_RDY USB成功發(fā)送完一個數據包,清D1時產生中斷。
D2:SENT_STALL 控制交換因違反協(xié)議而終止,USB置D2,產生中斷。
D3:DATA_END MCU裝了最后一個數據包到FIFO,置D3,與此同時,置D1。MCU卸載完FIFO最后一個數據包,清D0,置D3。對于0長度的數據相,MCU卸載完SETUP數據包之后,清D0=0,置 D3=1。USB清D3時產生中斷。
D4:SETUP_END 在DATA_END(D3)置位之前,控制傳輸結束,USB置D4,產生中斷。
D5:SEND_STALL 如果譯碼為一個無效的令牌,MCU置D5,與此同時,清D0,USB發(fā)STALL給當前的控制傳輸,MCU寫D5=0,結束STALL條件。
D6:SERVICED_OUT_PKY_RDY MCU寫D6=1以清除D0。
D7:SERVICED_SETUP_END MCU寫D7=1以清除D4。
1.2 USB功能模塊的訪問時序
USB功能模塊的I/O接口可工作在同步或異步方式,本文采用同步方式。其對MCU訪問的讀寫時序要求如圖1(a)、(b)所示。
寫時序:地址至少要維持兩個時鐘周期,并且要先于數據一個有效時鐘周期,以便將FIFO的寫指針選通至RAM寫地址端口。當寫信號有效時,存儲器寫使能信號有效,寫之后一個時鐘周期FIFO指針刷新。地址有效時,片選高有效。
讀時序:一旦地址有效,存儲器輸出使能有效。地址至少維持兩個時鐘周期,前一個周期將FIFO的讀指針選通至RAM的讀地址端口,因此數據比地址晚一個時鐘周期出現在數據總線上。當讀信號有效時,MCU將總線上的數據讀走,與此同時,FIFO的指針刷新。地址有效時,片選高有效。
2 安全認證系統(tǒng)
系統(tǒng)中采用了具有加解密功能的處理器。處理器采用棧式結構,具有焦點聚合的低功耗內總線結構和超標量指令結構與多種尋址方式等特點,能高速高效地處理數據。嵌入有RSA和DES模塊,能對發(fā)送和接收的數據進行實時RSA算法或三重DES算法的加密和解密。系統(tǒng)具有8位地址總線,16位數據位寬的并行接口,其I/O訪問時序如圖2所示。從圖2可以看出,I/O訪問在一個時鐘周期內完成。 [!--empirenews.page--]
3 硬件設計
將USB接口嵌入到安全認證系統(tǒng)中,從圖1和圖2可以看出,二者的時序不匹配,不能直接連接,因此在硬件上要進行時序匹配設計,其硬件原理如圖3所示。首先將地址和片選信號展寬一個周期。對于寫時序,將寫信號往后延遲一個時鐘周期,即能滿足寫時序要求;對于讀時序,因為讀信號有效時,數據必須已出現在數據總線上。從圖1(a)可看出,FIFO的數據在地址有效一個時鐘周期后才出現在數據總線上,也就是說,微處理器必須先給出一個周期的地址,然后讀信號有效,才能得到正確的結果。為解決這個問題,采取了讀FIFO時,先寫一次FIFO,緊接著讀FIFO。但此時要將寫信號屏蔽掉,以免影響FIFO的狀態(tài)。因此設立一個讀控制端口,讀FIFO時,將其置1,其余時刻清零。假如MCU要從FIFO讀取8個字節(jié),則程序如下:
TMOV Z, 01H //讀控制端口98置1
ZOUT 98H
MOV I, 7
TMOV MD, bmRequestType //讀FIFO的數據到bmRequestType[...]
LX1: ZOUT FIFO0
ZIN FIFO0
MOV T, Z
MOV T, MD
MOV I, T
TMOV [I], T
MOV T, MD
INC
MOV MD, T
NEXT LX1
TMOV Z, 00H //數據讀完,98端口清0;
ZOUT 98H
4 軟件設計
USB系統(tǒng)通過一個列舉過程來識別和配置一個新接入的USB設備,這個過程分5步來完成:
(1)用默認0地址取得設備描述;
(2)設置設備地址;
(3)用新地址取得設備描述;
(4)取得配置描述;
(5)設置配置。 [!--empirenews.page--]
列舉過程由控制傳輸來實現。控制傳輸有三種類型:
控制讀 SETUP-IN-IN-IN……OUT
控制寫 SETUP-OUT-OUT-OUT……IN
無數據相 SETUP-IN
通信開始時,PC首先發(fā)SETUP包,SETUP包是8個字節(jié)的命令包。當USB接收完8個字節(jié)的命令,即向MCU發(fā)出中斷請求,MCU讀取這8個字節(jié),對其進行分析。當USB設備給PC發(fā)數據時,執(zhí)行控制讀操作;當PC要給USB設備輸出數據時,執(zhí)行控制寫操作。輸入或輸出數據時,數據包的最大傳送字節(jié)為8字節(jié)。
執(zhí)行控制寫操作時,當USB將接收到的數據包寫到了FIFO時,OUT_PKT_RDY標志位置1。MCU查詢標志位,讀取數據。當MCU讀空FIFO數據,即將OUT_PKT_RDY標志位清0;當MCU讀完了最后一個數據包時,將DATA_END標志位置1, 告知USB控制寫操作完成。
執(zhí)行控制讀操作時,當MCU寫了一個數據包到FIFO時,將IN_PKT_RDY標志位置1,USB成功發(fā)送完這個數據包時將IN_PKT_RDY標志位清0,MCU查詢此標志位,裝入下一個數據包。當MCU裝完最后一個數據包,即將DATA_END標志位置1,告知USB控制讀操作完成。
無數據相接收到SETUP包即告控制傳輸結束,MCU讀完SETUP數據即將OUT_PKT_RDY標志位清0,并將DATA_END標志位置1。其列舉過程的軟件實現流程如圖4所示。
該方案已在PC上通過驗證。具有USB接口的安全認證系統(tǒng),通信速度快、便于攜帶、使用方便,插入PC的USB接口即可。