何 磊 肖迎春
光通信系统中基于Vxworks的CPCI总线驱动设计
何 磊1肖迎春2
1.重庆光电技术研究所,重庆 400060 2.中国移动通信集团重庆有限公司,重庆 40112
为了满足某通信设备实时性、可靠性的要求,研制了一种基于CPCI总线的光传输系统,给出了其在VxWorks环境下驱动程序设计的详细过程。试验结果表明:该驱动程序工作正常可靠,较好地满足了VxWorks操作系统下的CPCI数据的透明传输的要求,应用前景广泛。
Vxworks;CPCI;驱动程序
VxWorks 实时操作系统是一种非常流行的嵌入式实时操作系统。由于其良好的实时性及可靠性高的特点,已广泛应用于各类嵌入式计算机系统,并得到了广大设备厂家及各军工单位的广泛应用[1]。
CPCI(Compact Peripheral Component Interconnect)是国际PICMG协会于制定的一种总线接口标准。CPCI具有高开放性、高可靠性、可热插拔(Hot Swap)、连接可靠、抗震动强和抗腐蚀高的特点,已广泛应用于通信骨干网及军事系统等领域。
本文在VxWorks 操作系统下,通过编写CPCI总线驱动程序,实现了VxWorks操作系统下CPCI数据的光传输的功能。为多种实际的程应用提供了完 备的解决方案[2]。
本系统由两台VxWorks操作系统的主机、两个CPCI光端机及光纤传输链路组成,为达到CPCI数据在操作系统中透明传输的要求,基于VxWorks操作系统的CPCI驱动程序的设计尤为关键。系统结构框图1所示:
图1 系统结构框图
CPCI数据光纤传输系统工作流程为操作系统通过驱动函数将CPCI数据发送到总线上,CPCI光端机通过PCI9054将CPCI总线上的数据送到FPGA内部进行处理。FPGA将处理后的数据进行复用后,将复用后的数据经TLK2501芯片进行并串转变后,将串行数据送入光模块进行电/光变换,通过光纤进行传输。在接收端,光模块将光信号转换成串行电信号送入TLK2501进行串并变换,并行信号进入FPGA,FPGA对数据信号进行解复用处理后,然后通过PCI9054芯片,VxWorks操作系统通过调用驱动函数中的读函数,将CPCI数据取出,以待系统进行分析处理。经过上述分析,驱动函数为硬件接口与Vxworks操作系统之间的桥梁,下面就驱动函数的详细设计进行讨论[3]。
Vxworks操作系统主要有两种驱动函数的编写方式,一种是与系统内核进行,在操作系统启动过程中直接调用内核中的驱动函数,完成对CPCI设备的初始化;另一种是将驱动函数当作应用函数使用,在系统启动加载内核的过程中,不调用初始化函数,在需要对设备进行读写操作时,再调用初始化函数。由于光传输系统的驱动函数最终要嵌入到整机的操作系统中,因此我们采用第二种驱动实现方案,尽量不改动系统启动过程需加载的内核文件,采用在应用过程中调用驱动函数,完成对CPCI数据的读写过程[4]。
3.1 初始化函数
初始化程序是PCI设备驱动程序开发最重要的环节,初始化过程必须在系统为所有设备分配内存完成以前进行,否则将无法为PCI设备分配内存空间。初始化函数包括获取PCI设备信息和内存映射2部分。
3.1.1获取PCI设备信息
CPCI光端机上电后,系统BIOS会配置PCI设备,分配中断号。列出找到的PCI设备vendor ID、device ID、设备类型以及分配的中断号等信息。
初始化函数先根据设备vendorID和deviceID利用函数pciFindDevice()找到对应的设备,继续扫描PCI总线,找出设备所在的BusNo、DeviceNo以及FuncNo。然后根据总线号、设备号和功能号调用pciconfigInLong()及pciConfiglnByte()函数确定设备的基地址以和中断号。
3.1.2内存映射
VxWorks提供了标准的内存管理单元,用户可以使用内存管理单元来为PCI设备分配内存空间。在确定了基地址和内存空间大小后,通过调用函数sysMmuMapAdd()就将内存空间配置到内存管理单元。
经过上述两个步骤,PCI设备就映射到了系统的内存空间。操作系统对CPCI光端机的读写操作,就变化成对内存空间的读写。
3.2 功能函数
本文介绍的CPCI光端机在执行I/O操作时,都是按照字符的形式接收和发送数据。各功能模块主要完成对PCI9054寄存器的读写、读写板卡的内存空间的操作。因此功能函数主要包括读操作和写操作。
本设计采用查询模式,操作系统中上层应用程序调用读写函数,实现对CPCI数据的操作。VxWorks驱动中的读写函数与FPGA中的RAM空间进行数据交互操作必须遵守一定的逻辑关系,本设计中所采用的逻辑关系为:读过程,在读数据之前,要判定标志位是否0x8888,若是,则按照长度标志从RAM中读出数据;若读标志位不是0x8888,则等待,直到标志位变为0x8888后,才取出数据,数据读完之后,将标志位置为0x0000;写过程,写数据之前,要判断标志位是否为0x0000,若不是,则等待,直到标志位变为0x0000,若是,则将数据写入RAM,数据写完之后,将标志位置为0xffff,等待FPGA取出数据。FPGA取数据之前,判断标志位是否为0xffff,若不是,则等待,若是,将数据取走,待复用后,将数据调制到光上发出。整个读写过程的逻辑如图2所示:
图2 驱动读写逻辑流程
数据在RAM中的格式如图3所示:
图3 数据格式
根据以上逻辑过程,主要开发了以下四个功能函数:
STATUS sysPlx9054MemWrite(UINT32 instance,UINT32* pSource,int len)
函数功能:向板卡编号为instance的CPCI板卡写len长度的32位数据pSource。
STATUS sysPlx9054MemRead(UINT32 instance,UINT32* pDesc,int* pLen)
函数功能:从板卡编号为instance的CPCI板卡读出32位数据到pDesc,len为读出的数据长度。
STATUS sysPlx9054RegWrite(UINT32 instance,UINT32 value,BOOL type)
函数功能:向板卡编号为instance的CPCI板卡的寄存器空间写数据value,type为寄存器类型,0为写空间寄存器;1为读空间寄存器。
STATUS sysPlx9054RegRead(UINT32 instance,UINT32* pValue,BOOL type)
函数功能:从板卡编号为instance的CPCI板卡寄存器空间读出数据pValue,type为寄存器类型,0为写空间寄存器;1为读空间寄存器。
本文概括介绍了Vxworks操作系统下基于CPCI总线驱动的设计,其中详细介绍了Vxworks驱动程序的开发过程。该驱动程序在实际整机系统上得到了验证。根据误码率及光传输时延的测试结果表明,驱动程序设计合理,工作可靠,且很好di 满足了整机系统的实时性、通用性。
[1]王学龙.嵌入式VxWorks系统开发与应用[M].北京:人民邮电出版社,2003:1-8.
[2]Wind River System Inc. VxWorks Programmer’s Guide [M].1999:1-18
[3]陈养平.基于VxWorks的实时多任务软件设计[J] .微电子学与计算机,2002(10):10-12.
[4]T.Shanley, D.Anderson, 刘晖. PCI系统结构[M]. 电子工业出版社, 2000.
Design of CPCI Bus Driver Based on Vxworks in Optical Communication System
He Lei1Xiao Yingchun2
1.Chongqing Optoelectronics Research Institute, Chongqing 40060 2.China Mobile Communications Corporation Cmcc Chongqing Co., Ltd., Chongqing 401121
In order to meet the real-time and reliability of a communication equipment requirements, an optical transmission system based on CPCI bus is developed.The detailed procedure of driver design in VxWorks environment is given.Test results prove that the driver works properly, has high reliability, can meet the requirements of transparent transmission of CPCI data in VxWorks operating system , can be applied to many areas.
Vxworks; CPCI; Drivers
TP316.2
A
1009-6434(2017)04-0048-03