APP下载

一种基于vxBus 的PPC 与FPGA 高速互联的驱动设计方法

2015-08-26孟金芳

电子设计工程 2015年24期
关键词:门铃实时性信号处理

石 炜, 孟金芳

(1. 通信信息控制和安全技术重点实验室 浙江 嘉兴 314033;2. 中国电子科技集团公司第三十六研究所 浙江 嘉兴 314033)

随着数字信号处理系统向着高实时性、 高数据吞吐率、高灵活性的方向发展,目前很多信号处理平台选择以PPC 为处理器,vxWorks 为实时操作系统,FPGA 进行信号预处理,两者利用RapidIo 为通信链路的设计架构。在这种架构下,设计和实现好PPC 与FPGA 之间的RapidIo 通信驱动尤为重要,通常驱动设计者采用直接寄存器或内存访问的方式进行驱动的设计和开发,这种开发方式虽然有开发简单直接,效率高的特点,但是驱动管理混乱,不适宜驱动的模块化设计,没有对FPGA 设备进行较好的抽象,应用开发者无法透明和灵活调用。 本文基于VxWorks 的vxBus[1]驱动开发模型对PPC与FPGA 之间以高速RapidIo[2-3]为互连的驱动设计进行了研究,实现了FPGA 设备的高抽象,大大有利于应用开发者对FPGA 设备的透明调用, 同时满足信号处理平台PPC 与FPGA 之间通信的高实时性、高数据吞吐、高灵活性、高效率。

1 vxBus 驱动开发模型

1.1 vxBus 介绍

vxBus 是vxWorks6.2 版本后推出的用于支持设备驱动的特有的驱动开发模型如图1,其主要支持:1)支持对应设备的驱动匹配;2)提供驱动程序访问硬件的机制3)支持驱动的模块化设计;4) 支持在WorkBench 开发环境中调用的组件,实现驱动的可配置。vxBus 在总线控制驱动服务程序的支持下,能在虚拟总线上发现设备并与之匹配, 执行初始化工作,完成驱动和硬件设备之间的正常通信。 其中vxBus 最核心的功能是组件功能,它把每个设备驱动程序和vxBus 支持的模块都抽象成一个组件, 所有的这些组件都可以单独在Workbench[4]中进行配置。

图1 vxBus 系统关系图Fig. 1 The vxBus system context diagram

1.2 vxBus 驱动组成

vxBus 下驱动的源程序由以下几个文件组成,详见表1。

表1 vxBus 下驱动的源程序组成Tab. 1 The sources of vxBus Driver

1.3 vxBus 开发步骤

vxBus 的开发步骤如图2 所示。

图2 vxBus 驱动开发的基本步骤Fig. 2 The step of vxBus driver design

1)驱动模块的添加

vxWorks 采用模块化机制管理各个功能单元, 驱动也同样是由一个或多个模块组成, 其驱动管理是依靠.cdf 文件完成,其添加就是对driverName.cdf[1]的创建和编写。

2)驱动模块的注册

vxWorks 驱动的注册通过driverName.cdf 和driverName.dc 进行管理,其注册的实现是通过函数vxbDevRegister 完成。其函数定义为vxbDevRegister(structvxbDevRegInfo*pDevInfo)。

3)hcfDeviceList 设备链的添加

在BSP 包中的hwconf.c 文件中根据设备结构体添加新增设备的信息表, 其设备信息结构体为:struct hcfDevice{char*devName;int devUnit;int busType;int busIndex;int count;const struct hcfResource*pResource;};

4)注册驱动代码的的编写

可知vxWorks 的驱动信息结构体为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 *);};

这一步就是添加函数devInstanceInit、devInstanceInit2、devInstanceConnect 的代码内容,对于vxBus 来说它只是给了一个驱动框架模型,使驱动程序更加统一。

2 MPC8641D 与FPGA 的Rapid Io 通讯设计

2.1 平台介绍

本文中设计的平台对象如图3 所示。Mpc8641d[5]与V7[6]系列FPGA 以RapidIo 相连接, 其驱动设计即为假设FPGA为驱动设备,通过驱动完成对设备的打开、关闭、配置、读、写操作。

图3 信号处理平台简图Fig. 3 The diagram signal processing platform

2.2 Rapid Io 通讯设计

RapidIo 支持NreadNwrite[7]的读写、门铃、消息操作,为满足PPC 与FPGA 之间灵活快速响应的通讯设计,采用门铃响应与NreadNwrite 读写相配合的实现方式, 设计的控制和数据流图如图2 所示。

驱动的主要操作包括5 个部分, 包括初始化 (init)、读(read)、写(wite)、打开设备(open)、关闭设备(close)。 其中:

初始化包括根据配置指令进行不同的配置操作,块数据大小、数据块数、起始地址等。

读过程包括两部分,首先等待FPGA 设备发起的门铃中断,再根据门铃信息提供的数据块号发起Nread 操作读取定块数据。

写过程包括两部分,首先根据数据块号发起Nwrite 操作完成定块数据的写操作, 再向FPGA 发起门铃操作告知FPGA 有新的数据块到达。

打开设备包括申请资源、初始化等操作。

关闭设备包括释放资源、复位等操作。

3 驱动开发

按照本文第二节中介绍的vxBus 驱动开发步骤和第三节设计的MPC8641D 与FPGA 的RapidIo 通讯方案进行驱动开发。

3.1 驱动开发实例

1)驱动模块的添加

设计的驱动模块命名为 “FpgaDeviceDriver”, 将其作为BSP 包中硬件驱动的子模块,其依赖于vxBus、PLB 两个子模块, 其 注 册 函 数 为”FpgaDriverRegister”, 在BSP 调 用hardWareInterFaceBusInit 函数后再调用, 则编写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)驱动模块的注册

编 辑 FpgaDeviceDriver.dc 内 容 为 IMPORT void FpgaDriverRegister (void);

编辑FpgaDeviceDriver .dr 内容为:

#ifdef FPGA_DEV_DRIVER

void FpgaDriverRegister (void);

#endif

3)hcfDeviceList 设备链的添加

在BSP 包中的hwconf.c 文件中的hcfDeviceList[]数组中添加:

#if defined (FPGA_DEV_DRIVER)

{“FpgaDeviceDriver”,0,VXB_BUSID_PLB,0,FpgaDevNum,FpgaDevResources}

#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)注册驱动代码的的编写

这一步就是添加函数 FpgadevInstanceInit、Fpgadev Instance Init2、FpgadevInstanceConnect,FpgaDevInt,FpgaDevTx,FpgaDevRcv 的代码内容。

3.2 驱动开发实验

完成驱动开发后,FPGA 设备驱动很好的融入到work Bench 的开发系统中, 在建立Image 工程时开发者能方便的进行动态配置如图4 所示, 并且设备驱动很好的融入到vxWorks 文件系统中,其设备可以供应用程序员如操作普通文件一样open/close/write/read,大大有利于应用程序开发者的透明调用不用了解设备中的细节参数。 同时通过数据发送和接收测试其实时性虽有所损失但是其传输速率和响应时间仍然能满足实时性要求,延迟响应时间由直接中断响应的15 μs下降至20 μs,但传输速率几乎没影响同样达到800 MB/s。

图4 Workbench Image 工程配置图Fig. 4 The diagram of Workbench Image config

4 结 论

在研究了VxWorks 的vxBus 驱动模型的基础上,结合自身平台的特点设计了MPC8641D 与FPGA 之间RapidIo 通讯的驱动方案, 经过开发和实验证明, 基于vxBus 的驱动开发相比直接对寄存器、 内存直接访问方式的驱动的设计和开发更灵活,更具有可配置性,硬件设备更加抽象不失高实时性的同时更有利于应用程序开发者的透明调用。

[1] Wind River SystermsInc.VxWorks6.8DeviceDriver Developer's Guide[EB/OL]. (2009). [2014-6-16].http://www.windriver.com.

[2] 尹亚明,李琼,郭御风,等. 新型高性能RapidIo互连技术研究[J]. 计算机工程与科学,2004,26(12):85-107.

[3] 吴海燕. 基于RapidIo总线的信号处理平台设计[M]. 电子科技大学,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.

猜你喜欢

门铃实时性信号处理
锤子门铃
《信号处理》征稿简则
《信号处理》第九届编委会
《信号处理》征稿简则
《信号处理》第九届编委会
门铃前的守候
航空电子AFDX与AVB传输实时性抗干扰对比
计算机控制系统实时性的提高策略
一种车载Profibus总线系统的实时性分析
门铃“丁冬”