石 煒, 孟金芳
(1. 通信信息控制和安全技術(shù)重點(diǎn)實(shí)驗(yàn)室 浙江 嘉興 314033;2. 中國(guó)電子科技集團(tuán)公司第三十六研究所 浙江 嘉興 314033)
隨著數(shù)字信號(hào)處理系統(tǒng)向著高實(shí)時(shí)性、 高數(shù)據(jù)吞吐率、高靈活性的方向發(fā)展,目前很多信號(hào)處理平臺(tái)選擇以PPC 為處理器,vxWorks 為實(shí)時(shí)操作系統(tǒng),F(xiàn)PGA 進(jìn)行信號(hào)預(yù)處理,兩者利用RapidIo 為通信鏈路的設(shè)計(jì)架構(gòu)。在這種架構(gòu)下,設(shè)計(jì)和實(shí)現(xiàn)好PPC 與FPGA 之間的RapidIo 通信驅(qū)動(dòng)尤為重要,通常驅(qū)動(dòng)設(shè)計(jì)者采用直接寄存器或內(nèi)存訪(fǎng)問(wèn)的方式進(jìn)行驅(qū)動(dòng)的設(shè)計(jì)和開(kāi)發(fā),這種開(kāi)發(fā)方式雖然有開(kāi)發(fā)簡(jiǎn)單直接,效率高的特點(diǎn),但是驅(qū)動(dòng)管理混亂,不適宜驅(qū)動(dòng)的模塊化設(shè)計(jì),沒(méi)有對(duì)FPGA 設(shè)備進(jìn)行較好的抽象,應(yīng)用開(kāi)發(fā)者無(wú)法透明和靈活調(diào)用。 本文基于VxWorks 的vxBus[1]驅(qū)動(dòng)開(kāi)發(fā)模型對(duì)PPC與FPGA 之間以高速RapidIo[2-3]為互連的驅(qū)動(dòng)設(shè)計(jì)進(jìn)行了研究,實(shí)現(xiàn)了FPGA 設(shè)備的高抽象,大大有利于應(yīng)用開(kāi)發(fā)者對(duì)FPGA 設(shè)備的透明調(diào)用, 同時(shí)滿(mǎn)足信號(hào)處理平臺(tái)PPC 與FPGA 之間通信的高實(shí)時(shí)性、高數(shù)據(jù)吞吐、高靈活性、高效率。
vxBus 是vxWorks6.2 版本后推出的用于支持設(shè)備驅(qū)動(dòng)的特有的驅(qū)動(dòng)開(kāi)發(fā)模型如圖1,其主要支持:1)支持對(duì)應(yīng)設(shè)備的驅(qū)動(dòng)匹配;2)提供驅(qū)動(dòng)程序訪(fǎng)問(wèn)硬件的機(jī)制3)支持驅(qū)動(dòng)的模塊化設(shè)計(jì);4) 支持在WorkBench 開(kāi)發(fā)環(huán)境中調(diào)用的組件,實(shí)現(xiàn)驅(qū)動(dòng)的可配置。vxBus 在總線(xiàn)控制驅(qū)動(dòng)服務(wù)程序的支持下,能在虛擬總線(xiàn)上發(fā)現(xiàn)設(shè)備并與之匹配, 執(zhí)行初始化工作,完成驅(qū)動(dòng)和硬件設(shè)備之間的正常通信。 其中vxBus 最核心的功能是組件功能,它把每個(gè)設(shè)備驅(qū)動(dòng)程序和vxBus 支持的模塊都抽象成一個(gè)組件, 所有的這些組件都可以單獨(dú)在Workbench[4]中進(jìn)行配置。
圖1 vxBus 系統(tǒng)關(guān)系圖Fig. 1 The vxBus system context diagram
vxBus 下驅(qū)動(dòng)的源程序由以下幾個(gè)文件組成,詳見(jiàn)表1。
表1 vxBus 下驅(qū)動(dòng)的源程序組成Tab. 1 The sources of vxBus Driver
vxBus 的開(kāi)發(fā)步驟如圖2 所示。
圖2 vxBus 驅(qū)動(dòng)開(kāi)發(fā)的基本步驟Fig. 2 The step of vxBus driver design
1)驅(qū)動(dòng)模塊的添加
vxWorks 采用模塊化機(jī)制管理各個(gè)功能單元, 驅(qū)動(dòng)也同樣是由一個(gè)或多個(gè)模塊組成, 其驅(qū)動(dòng)管理是依靠.cdf 文件完成,其添加就是對(duì)driverName.cdf[1]的創(chuàng)建和編寫(xiě)。
2)驅(qū)動(dòng)模塊的注冊(cè)
vxWorks 驅(qū)動(dòng)的注冊(cè)通過(guò)driverName.cdf 和driverName.dc 進(jìn)行管理,其注冊(cè)的實(shí)現(xiàn)是通過(guò)函數(shù)vxbDevRegister 完成。其函數(shù)定義為vxbDevRegister(structvxbDevRegInfo*pDevInfo)。
3)hcfDeviceList 設(shè)備鏈的添加
在BSP 包中的hwconf.c 文件中根據(jù)設(shè)備結(jié)構(gòu)體添加新增設(shè)備的信息表, 其設(shè)備信息結(jié)構(gòu)體為:struct hcfDevice{char*devName;int devUnit;int busType;int busIndex;int count;const struct hcfResource*pResource;};
4)注冊(cè)驅(qū)動(dòng)代碼的的編寫(xiě)
可知vxWorks 的驅(qū)動(dòng)信息結(jié)構(gòu)體為struct vxb Dev RegInfo,其定義為:
Struct vxbDevRegInfo { Struct vxbDevRegInfo *pNext;UINT32? devID; UINT32? busID; UINT32? vxbVersion; char???drvName [MAX_DRV_NAME_LEN+1]; struct drvBusFuncs *pDrvBusFuncs; struct vxbDeviceMethod * pMethods; BOOL(*devProbe) (struct vxbDev * pDevInfo0;struct vxbParams *pParamDefaults;};其中:
struct drvBusFuncs{void (*devInstanceInit) (struct vxbDev*);void (*devInstanceInit2 (struct vxbDev *);void(*devInstanceConnect) (struct vxbDev *);};
這一步就是添加函數(shù)devInstanceInit、devInstanceInit2、devInstanceConnect 的代碼內(nèi)容,對(duì)于vxBus 來(lái)說(shuō)它只是給了一個(gè)驅(qū)動(dòng)框架模型,使驅(qū)動(dòng)程序更加統(tǒng)一。
本文中設(shè)計(jì)的平臺(tái)對(duì)象如圖3 所示。Mpc8641d[5]與V7[6]系列FPGA 以RapidIo 相連接, 其驅(qū)動(dòng)設(shè)計(jì)即為假設(shè)FPGA為驅(qū)動(dòng)設(shè)備,通過(guò)驅(qū)動(dòng)完成對(duì)設(shè)備的打開(kāi)、關(guān)閉、配置、讀、寫(xiě)操作。
圖3 信號(hào)處理平臺(tái)簡(jiǎn)圖Fig. 3 The diagram signal processing platform
RapidIo 支持NreadNwrite[7]的讀寫(xiě)、門(mén)鈴、消息操作,為滿(mǎn)足PPC 與FPGA 之間靈活快速響應(yīng)的通訊設(shè)計(jì),采用門(mén)鈴響應(yīng)與NreadNwrite 讀寫(xiě)相配合的實(shí)現(xiàn)方式, 設(shè)計(jì)的控制和數(shù)據(jù)流圖如圖2 所示。
驅(qū)動(dòng)的主要操作包括5 個(gè)部分, 包括初始化 (init)、讀(read)、寫(xiě)(wite)、打開(kāi)設(shè)備(open)、關(guān)閉設(shè)備(close)。 其中:
初始化包括根據(jù)配置指令進(jìn)行不同的配置操作,塊數(shù)據(jù)大小、數(shù)據(jù)塊數(shù)、起始地址等。
讀過(guò)程包括兩部分,首先等待FPGA 設(shè)備發(fā)起的門(mén)鈴中斷,再根據(jù)門(mén)鈴信息提供的數(shù)據(jù)塊號(hào)發(fā)起Nread 操作讀取定塊數(shù)據(jù)。
寫(xiě)過(guò)程包括兩部分,首先根據(jù)數(shù)據(jù)塊號(hào)發(fā)起Nwrite 操作完成定塊數(shù)據(jù)的寫(xiě)操作, 再向FPGA 發(fā)起門(mén)鈴操作告知FPGA 有新的數(shù)據(jù)塊到達(dá)。
打開(kāi)設(shè)備包括申請(qǐng)資源、初始化等操作。
關(guān)閉設(shè)備包括釋放資源、復(fù)位等操作。
按照本文第二節(jié)中介紹的vxBus 驅(qū)動(dòng)開(kāi)發(fā)步驟和第三節(jié)設(shè)計(jì)的MPC8641D 與FPGA 的RapidIo 通訊方案進(jìn)行驅(qū)動(dòng)開(kāi)發(fā)。
1)驅(qū)動(dòng)模塊的添加
設(shè)計(jì)的驅(qū)動(dòng)模塊命名為 “FpgaDeviceDriver”, 將其作為BSP 包中硬件驅(qū)動(dòng)的子模塊,其依賴(lài)于vxBus、PLB 兩個(gè)子模塊, 其 注 冊(cè) 函 數(shù) 為”FpgaDriverRegister”, 在BSP 調(diào) 用hardWareInterFaceBusInit 函數(shù)后再調(diào)用, 則編寫(xiě)Fpga Device Driver.cdf 文件如下:
Component FPGA_DEV_DRIVER {
NAME FPGA VxBus driver
SYNOPSIS FPGA VxBus driver provided by JEC
_CHILDREN FOLDER_DRIVERS
REQUIRES INCLUDE_VXBUS
INCLUDE_PLB_BUS
INIT_RTN FpgaDriverRegister();
INIT_AFTER INCLUDE_PLB_BUS
_INIT_ORDER hardWareInterFaceBusInit
_CHILDREN FOLDER_DRIVERS }
2)驅(qū)動(dòng)模塊的注冊(cè)
編 輯 FpgaDeviceDriver.dc 內(nèi) 容 為 IMPORT void FpgaDriverRegister (void);
編輯FpgaDeviceDriver .dr 內(nèi)容為:
#ifdef FPGA_DEV_DRIVER
void FpgaDriverRegister (void);
#endif
3)hcfDeviceList 設(shè)備鏈的添加
在BSP 包中的hwconf.c 文件中的hcfDeviceList[]數(shù)組中添加:
#if defined (FPGA_DEV_DRIVER)
{“FpgaDeviceDriver”,0,VXB_BUSID_PLB,0,F(xiàn)pgaDevNum,F(xiàn)pgaDevResources}
#endif
其中FpgaDevResources 和FpgaDevNum 分別定義為:
const struct hcfResource FpgaDevResources [] =
{{ "irq", HCF_RES_INT, {(void*)(INUM_TO_IVEC(8))} },
{ "irqLevel", HCF_RES_INT, {(void *)1} },
{ " BlockSize ", HCF_RES_INT, {(void *)16*1024 },
{ " Blocks", HCF_RES_INT, {(void *)2} }
};
#define FpgaDevNumNELEMENTS(FpgaDevResources)
4)注冊(cè)驅(qū)動(dòng)代碼的的編寫(xiě)
這一步就是添加函數(shù) FpgadevInstanceInit、Fpgadev Instance Init2、FpgadevInstanceConnect,FpgaDevInt,FpgaDevTx,FpgaDevRcv 的代碼內(nèi)容。
完成驅(qū)動(dòng)開(kāi)發(fā)后,F(xiàn)PGA 設(shè)備驅(qū)動(dòng)很好的融入到work Bench 的開(kāi)發(fā)系統(tǒng)中, 在建立Image 工程時(shí)開(kāi)發(fā)者能方便的進(jìn)行動(dòng)態(tài)配置如圖4 所示, 并且設(shè)備驅(qū)動(dòng)很好的融入到vxWorks 文件系統(tǒng)中,其設(shè)備可以供應(yīng)用程序員如操作普通文件一樣open/close/write/read,大大有利于應(yīng)用程序開(kāi)發(fā)者的透明調(diào)用不用了解設(shè)備中的細(xì)節(jié)參數(shù)。 同時(shí)通過(guò)數(shù)據(jù)發(fā)送和接收測(cè)試其實(shí)時(shí)性雖有所損失但是其傳輸速率和響應(yīng)時(shí)間仍然能滿(mǎn)足實(shí)時(shí)性要求,延遲響應(yīng)時(shí)間由直接中斷響應(yīng)的15 μs下降至20 μs,但傳輸速率幾乎沒(méi)影響同樣達(dá)到800 MB/s。
圖4 Workbench Image 工程配置圖Fig. 4 The diagram of Workbench Image config
在研究了VxWorks 的vxBus 驅(qū)動(dòng)模型的基礎(chǔ)上,結(jié)合自身平臺(tái)的特點(diǎn)設(shè)計(jì)了MPC8641D 與FPGA 之間RapidIo 通訊的驅(qū)動(dòng)方案, 經(jīng)過(guò)開(kāi)發(fā)和實(shí)驗(yàn)證明, 基于vxBus 的驅(qū)動(dòng)開(kāi)發(fā)相比直接對(duì)寄存器、 內(nèi)存直接訪(fǎng)問(wèn)方式的驅(qū)動(dòng)的設(shè)計(jì)和開(kāi)發(fā)更靈活,更具有可配置性,硬件設(shè)備更加抽象不失高實(shí)時(shí)性的同時(shí)更有利于應(yīng)用程序開(kāi)發(fā)者的透明調(diào)用。
[1] Wind River SystermsInc.VxWorks6.8DeviceDriver Developer's Guide[EB/OL]. (2009). [2014-6-16].http://www.windriver.com.
[2] 尹亞明,李瓊,郭御風(fēng),等. 新型高性能RapidIo互連技術(shù)研究[J]. 計(jì)算機(jī)工程與科學(xué),2004,26(12):85-107.
[3] 吳海燕. 基于RapidIo總線(xiàn)的信號(hào)處理平臺(tái)設(shè)計(jì)[M]. 電子科技大學(xué),2009.
[4] Wind River Systerms Inc.Wind River Workbench, 3.2 User's Guide[EB/OL]. (2009). [2014-6-16]. http://www.windriver.com.
[5] Freescale. MPC8641D Integrated Host Processor Family Reference Manual [EB/OL].(2008).[2014-6-16].http://www.freescale.com.
[6] Xilinx. 7 Series FPGAs Overview[EB/OL]. (2011).[2014-6-16] http://www.xilinx.com.
[7] RapidIo Trade Assocition.RapidIo Interconnect Specification,Rev.1.3[EB/OL].(2005). [2014-6-16] .http://www.RapidIo.com.