張 聰,張 濤
(1.中國科學院空間應用工程與技術中心,北京100094;2.中國科學院光電研究院,北京100094;3.中國科學院大學,北京100049)
在高速數據采集領域常常需要將前端設備采集到的高速數據通過高速接口實時傳輸給計算機,目前主要使用PCI 總線接口傳輸數據,但這種方式成本高昂、結構復雜、便攜性差,若采用新一代的USB3.0 接口則可以解決這些問題。USB3.0 接口在保留其固有優勢的基礎上極大的提高了數據傳輸帶寬,十分適合應用于高速數據采集領域。USB3.0 設備控制器的固件設計是開發USB3.0 接口的關鍵,本文重點介紹了USB3.0 接口設備控制器的固件設計原理和方法。
EZ-USB FX3(CYUSB3014)是Cypress 公司生產的符合USB 3.0 標準的設備控制器,利用EZ-USB FX3 可以很容易的把USB 3.0 通信端口集成到任何電子系統中,使得系統能夠與計算機實現高速連接。由于USB 3.0 傳輸帶寬大、效率高,很適合應用于對數據傳輸的速度和實時性要求較高的場合,例如高速圖像數據采集、高速光纖數據采集等領域。
FX3 擁有一個高性能的32 bit 的微處理器內核ARM926EJS,該內核的工作頻率可達200 MHz,使得FX3 能夠用在對數據處理要求較高的地方。芯片內部還集成了一個512 Kbyte 容量的內部系統存儲器(SRAM),用來存儲代碼、配置參數,同時作為芯片內部DMA 通道的緩沖區。FX3 支持多種外圍接口,包括高速的USB 接口、第二代通用可編程接口GPIFII,除此之外還有常用的UART 接口、SPI 接口、I2C 接口、I2S 接口以及普通的GPIO 接口。
FX3 的USB 模塊集成了符合USB3.0 規范1.0版的USB3. 0 和USB2. 0 外設、符合PIPI3. 0 的5 Gbit/s 帶寬的USB3.0 PHY、符合OTG 補充標準2.0 版的高速OTG 主機和外設、32 個物理端點,另外它還支持充電電池規范1.1 和輔助充電適配器檢測功能。其中的OTG 功能使得FX3 不僅僅能工作在設備模式還能工作在主機模式,工作在設備模式時支持超速、高速和全速速率,工作在主機模式時支持高速和全速速率,對主機模式的支持實現了在沒有PC 機的情況下設備之間數據的傳輸,方便了設備之間的連接。
固件是在USB 控制器芯片加電后,由其他設備加載到USB 控制器中并在其中運行完成接口數據傳送功能的一段程序,其作用是輔助或者說控制硬件來完成預期的設備功能。固件的主要功能包括:初始化工作;輔助硬件完成設備的重新枚舉(ReNumeration)過程,對主機做出適當響應;對中斷的處理;數據的接收與發送;對外圍電路的控制。EZUSB FX3 的固件設計不需要設計者過分關注底層硬件設置,而只需調用相應的庫函數,這些庫函數隱藏了硬件設備,降低了固件的開發難度。EZ-USB FX3的固件設計主要涉及到對固件數據流的理解以及對GPIFII 接口、DMA 通道、回調函數的設計。
FX3 的固件相對復雜,理解固件的各種數據流向有利于設計出好的固件,如圖1 所示為固件的數據流結構圖,從圖中可以清楚的看出設備控制器中固件數據流的相互聯系,除了ARM9 微處理器核外控制器的外圍接口、GPIFII 狀態機引擎、DMA 系統引擎都具有相應的固件管理模塊。不同外圍接口之間通過DMA 系統引擎實現數據的路由。各個固件管理模塊都可以向微處理器核發送特定的中斷信號,微處理器核通過對中斷信號的監視實現對數據流的管理。通過配置接口間的DMA 數據傳輸方式,既可以實現自動傳輸也可以實現在微處理器的干預下傳輸。有些低性能接口像UART、SPI、I2C、I2S,既可以利用DMA 模式實現數據傳輸,也可以由CPU 直接向這些接口傳輸數據,但具有較高性能的GPIFII 接口和USB 接口只能通過DMA 模式進行數據傳輸。每個固件模塊都可以向微處理器發送中斷信號,微處理器收到中斷信號后可以通過固件的回調函數機制執行相應的功能。DMA 系統引擎會向微處理器發送DMA 事件中斷信號,該信號用來通知微處理器有特定的DMA 事件發生,當微處理器接收到特定的DMA 事件時,就會調用相應的回調函數來處理這些DMA 事件。

圖1 EZ USB-FX3 固件數據流結構圖
GPIFII 接口是FX3 的重要組成部分,利用該接口可以完成與任何外部設備的高速并行數據傳輸。GPIFII 具有一個完全可編程的狀態機,提供多達256 個可編程狀態,可實現各種具體的接口時序或協議,可實現與任何處理器、ASIC、DSP 或FPGA 等設備的無縫連接。GPIFII 能夠在100 MHz 的頻率下實現32 bit 數據的并行傳輸,最高有效數據的傳輸速率為400 Mbyte/s。該接口通過配置能工作在主模式或從模式,而且數據總線的位數可以在8 bit、16 bit、32 bit 之間靈活選擇。當數據總線配置為32 bit 時,該接口支持14 根可配置的控制信號,所有這些控制信號可以是輸入、輸出或者雙向的;當數據總線配置為8 bit 或16 bit 時,該接口可以支持16 根可配置的控制信號,所有這些控制信號也可以是輸入、輸出或者雙向的。
本設計將該接口配置為一個32 bit 的同步FIFO,并且工作在從模式,由外部的時鐘信號PCLK作為接口狀態機的工作時鐘。外部設備通過檢測標志信號FLAGA 和FLAGB 來判斷FIFO 緩沖區的空或者滿。對外部設備而言,USB3.0 設備控制器就如同它的一個存儲區,可以向該存儲區隨意地讀寫數據。配置為同步從模式FIFO 的GPIFII 接口與外部設備的信號連接如圖2 所示。

圖2 GPIFII 接口信號連接圖
FX3 利用內部的DMA 網絡把不同外圍接口連接起來,以實現不同接口之間的數據傳輸。DMA 數據通道是一種軟件結構,該軟件結構封裝了3 種硬件元素:套接口(Sockets)、緩沖區(Buffers)、描述符(Descriptors)。套接口是存在于外部接口中的硬件模塊,一個外部接口可以包含多個套接口,在固件系統中套接口處于DMA 數據通道的兩個終端,一個套接口用于輸入數據,另一個用于輸出數據。數據通過套接口可以流入或流出已經建立好的DMA 數據通道。緩沖區是設備控制器系統內存中數據緩沖區,相當于DMA 數據通道的中轉站,流入套接口的數據首先被存放到緩沖區中,然后才能被輸出數據的套接口將緩沖區中的數據讀出。描述符作為一種數據結構把與數據流相關的套接口和緩沖區關聯起來。
固件設計一個很重要的工作就是建立DMA 數據通道,利用高層的DMA 管理函數可以大大降低DMA通道編程的復雜性,通過調用和配置相應的DMA 管理函數,可以很容易地建立任意兩個套接口間的DMA 數據通道并能實現對數據流的監控或修改。
為了適應不同的應用需要,FX3 提供了多種DMA 通道模式,大體可分為2 種,一種是自動DMA通道,另一種是手動DMA 通道。自動DMA 通道在通道建立起來并開始運行后,固件就不再干預數據流的傳輸,數據將連續不斷的流過自動數據通道,由于不需要固件干預,這種通道模式能提供最大的數據效率;手動DMA 通道在數據流動過程中需要CPU 干預,這樣可以監視或者修改數據流,但可能會降低數據傳輸效率。
固件通過回調函數來完成對各種中斷事件的處理,當設備控制器的某個接口模塊產生了某種事件,它就會觸發相應的中斷,然后已經被注冊的該事件對應的回調函數就會被調用,如圖3 所示為固件函數調用結構圖。回調函數由中斷服務程序(ISR)調用,用戶可在回調函數里實現具體的應用功能。任何一個接口模塊都可以產生特定的中斷信號通知應用邏輯以回調函數地方式進行處理。本設計采用了自動DMA 通道方式,沒有注冊DMA 回調函數,但USB 的setup 和event 事件都是通過回調函數處理的。
FX3 的固件開發需要2 個開發工具:固件集成開發環境和GPIFII Designer。固件集成開發環境集成了第三方工具鏈compiler、linker、assembler 和JTAG debugger,可幫助用戶快速開發、構建和調試FX3 的固件應用程序,GPIFII Designer 是GPIFII 接口設計工具,它提供了一種圖形化狀態機的設計方式,可使用戶直觀的配置該接口的時序行為。
固件程序主要由兩部分組成:RTOS(實時操作系統)和固件框架。RTOS 是固件工作的軟件平臺,設備控制器的所有硬件模塊和軟件模塊都由RTOS管理控制。固件框架通用性比較強,它完成設備最初的初始化,其初始化流程如圖4 所示。在初始化過程顯示的調用main()函數之前,固件會先做一些必要的硬件初始化,為后面進一步初始化和RTOS的運行建立良好環境,CyU3PFirmwareEntry()函數負責這部分的初始化。RTOS 的入口函數CyU3PKernelEntry()主要用來初始化RTOS,該函數最后將調用CyFxApplicationDefine(),這個函數將創建與具體應用相關的用戶線程。

圖4 固件框架程序流程圖
固件框架中的CyFxApplicationDefine 函數創建用戶應用線程SlFifoAppThread_Entry,本設計中該應用線程建立了一條從GPIFII 端口到USB 端口的自動DMA 通道,一旦啟動該通道,數據將自動的通過DMA 通道傳輸到USB 主機。由于GPIFII 端口被配置為同步FIFO 模式,GPIFII 的接口信號時序服從普通FIFO 的接口信號時序,因而在外部設備看來它只是在訪問一個FIFO。
應用相關程序的流程圖如圖5 所示,在USB 事件回調函數中配置GPIFII 端口、配置USB 端口,建立DMA 通道。最后通過調用CyU3PConnectState(CyTrue,CyTrue)實現FX3 與USB 主機的硬件連接,該函數的第一個參數用于使能連接,第二個參數表示將FX3 枚舉為超速設備。

圖5 應用程序流程圖
USB Setup 回調函數用來處理USB 主機發來的枚舉請求,當USB 接口的驅動線程接收到枚舉請求時就會調用該回調函數進行處理。這里采用快速枚舉方式,除了制造商和未知的請求外,都不需要該函數處理,而由USB 接口驅動線程自動處理,因而該回調函數可以直接返回。USB Event 回調函數與USB Setup 回調函數有相似的處理方式,當USB 驅動線程檢測到主機的USB 事件請求時就會調用該回調函數,來處理USB 主機的各種事件請求。本設計在USB Event 回調函數中配置USB 端點并建立DMA 通道。
(1)配置USB 端點
FX3 共有32 個USB 端點,USB 端口使用一個消費者端點,端點號為0x81,端點類型為bulk 類型。當采用超速傳輸時,端點數據包大小為1 024 byte,突發傳輸數據包數量為16。端點配置函數如下:
epCfg.enable=CyTrue;
epCfg.epType=CY_U3P_USB_EP_BULK;//bulk 類型端點
epCfg.burstLen=16;//突發傳輸數據包個數
epCfg.streams=0;
epCfg.pcktSize=size;//端點數據包大小1 024 byte
apiRetStatus=CyU3PSetEpConfig(CY_FX_EP_CONSUMER,
&epCfg);//配置消費者端點
if(apiRetStatus !=CY_U3P_SUCCESS)
{CyFxAppErrorHandler(apiRetStatus);}
(2)建立DMA 通道
通過設置DMA 配置數據結構并調用DMA 通道創建函數來建立DMA 通道,該DMA 通道發送數據的一端為GPIFII生產者套接口,接收數據的一端為USB 消費者套接口。
dmaCfg.size=16×1 024;//DAM 緩沖區大小16 kbyte
dmaCfg.count=CY_FX_SLFIFO_DMA_BUF_COUNT;//DMA
緩沖區個數
dmaCfg. prodSckId = CY _ FX _ PRODUCER _ PPORT _
SOCKET;//生產者套接口號
dmaCfg.consSckId=CY_FX_CONSUMER_USB_SOCKET;//消費者套接口號
dmaCfg. dmaMode = CY_U3P_DMA_MODE_BYTE;//DMA
模式
dmaCfg.notification=0;
dmaCfg.cb=NULL;
dmaCfg.prodHeader=0;
dmaCfg.prodFooter=0;
dmaCfg.consHeader=0;
dmaCfg.prodAvailCount=0;
/* 創建自動DMA 通道* /
apiRetStatus=
CyU3PDmaChannelCreate(&glChHandleSlFifoPtoU,CY_U3P_
DMA_TYPE_AUTO,&dmaCfg);
if(apiRetStatus !=CY_U3P_SUCCESS)
{CyFxAppErrorHandler(apiRetStatus);}
固件設計完成后需要從多方面對固件進行實際測試以驗證其正確性,對固件測試首先要建立固件的測試系統,固件測試系統結構如圖6 所示,該測試系統由激勵源、USB3.0 控制器和主機組成,激勵源產生激勵數據通過GPIFII 接口傳送給控制器,然后控制器按照USB3.0 協議將數據轉發給主機。下面主要從兩個方面驗證固件設計的正確性。
(1)固件枚舉測試
固件能夠正常工作的一個重要標志是當USB3.0控制器連接到主機上時,主機能夠成功的枚舉設備控制器。使用主機測試軟件USB Control Center 對固件枚舉功能進行測試。經過測試,測試軟件成功的接收了由固件發來的各種描述符,根據描述符中的各字段數值可以判斷枚舉的正確與否。其中的部分描述符字段如下:
VendorID =" 04 B4",ProductID =" 00 F1",BcdUSB="03 00"
根據供應商號字段VendorID 和產品號字段ProductID 的值可知主機已識別出設備控制器,根據BcdUSB=”03 00”字段可知設備控制器符合USB3.0協議、能夠進行超速傳輸。

圖6 固件測試系統結構
(2)數據傳輸測試
發送端:發送端使用FPGA(可編程邏輯控制器)作為測試系統的激勵源,由FPGA 生成測試數據,按照FIFO 時序向GPIFII 接口寫入數據,利用FPGA 在線調試工具抓取該接口的各個信號變化波形如圖7 所示。

圖7 GPIFII 接口信號實測波形
接口信號波形的時鐘頻率USB_PCLK 為25 MHz,數據總線USB_DQ 寬度為32 bit,易知發送端的數據發送速率為100 Mbyte/s。當USB_WR 和USB_CS 有效(低電平有效)時在時鐘下降沿輸出數據,第1 個發送字為AA0000BB(16 進制表示,高字節在前),之后從00000000 開始遞增。
接收端:接收端使用主機測試軟件USB Control Center 接收發送端的激勵數據,圖8 為實際接收的數據,接收到的數據的第1 個32 bit 字為AA0000BB(16 進制表示,高字節在前),之后數據從00000000開始遞增,因而接收端與發送端的數據完全一樣,數據接收正確。在接收數據的過程中使用速率測試軟件測試數據傳輸平均速率為94 Mbyte/s,與實際發送的數據速率接近。

圖8 實際接收數據顯示
本文介紹了USB3.0 設備控制器FX3 固件的主要工作機制并概述了固件程序的運行過程,并且通過實驗驗證了所設計固件運行的穩定性和正確性。對固件工作機制的深入把握是設計高質量固件的前提,在設計過程中還應充分利用固件框架,在此基礎上修改或增加具體應用相關的程序,以提高設計效率和正確性。另外,GPIFII 端口強大的可編程性使得FX3 能更加靈活的處理與其他設備的連接問題,因而有必要對該接口做進一步的研究以充分發揮該接口強大的靈活性。
[1] USB 3.0 Promoter Group,Universal Serial Bus 3.0 Specification[S].www.usb.org,2008.
[2] Cypress Semiconductor Corporation,EZ-USB FX3 SuperSpeed USBController[EB/OL].www.cypress.com,2011,1-35.
[3] Cypress Semiconductor Corporation,GPIFII Designer 1. 0[EB/OL].ww.cypress.com,2012,3-42.
[4] Cypress Semiconductor Corporation,FX3Programmers Manual[EB/OL].www.cypress.com,2011,3-161.
[5] Cypress Semiconductor Corporation,FX3 SDK Firmware API Guide Revision 1.1[EB/OL].www.cypress.com,135-285.
[6] Cypress Semiconductor Corporation,Designing with the EZ-USB FX3 Slave FIFO Interface[EB/OL].www.cypress.com,2011,1-11.
[7] 一種USB3.0 高速高清工業攝像機[P].中國:201210056565.2.
[8] 嚴石,楊定禮,張宇林.基于USB2.0 的數據采集系統設計[J].電子器件,2008,31(6):1959-1962.
[9] 曹玲芝,張恒. 視頻處理系統高速USB 接口設計[J]. 電子器件,2007,30(4):1337-1340.
[10] 楊磊,郁道銀,陳曉冬. 醫用超聲內窺鏡高速成像系統的USB2.0 接口設計[J].傳感技術學報,2006,19(3):621-624.
[11] 陳云飛,胡榮強,李偉.基于EZ-USB FX2 的固件程序設計[J].電子器件應用,2007,9(1):42-44.
[12] 劉延波,鄭世強,王斌.USB 設備固件程序設計[J]. 信息工程大學學報,2004,5(2):56-60.