使用DSP加速PCI接口产品的开发作者:南京电子技术研究所(210013)林振华来源:《电子技术应用》摘要:一种基于PLX公司的PCI接口芯片的辅助开发工具,可极大地方便PCI产品的硬件调试,以及驱动程序和应用软件的开发。给出了一个以PCI9052为接口芯片的图形控制器的开发实例,以及在Windows操作系统下如何调用SDK中的API函数。关键词:PCI桥PCI9052芯片SDKVC++6.01PCI总线和PCI桥接芯片PCI总线就一种目前较为流行的、先进的高速同步总线。它的历史较短,正式的2.2版本于1999年2月发布。其优点在于能够满足设备之间实现快速访问,因为PCI总线的全部读写传送都可以用突发方式进行,且总线速度可达33/66MHz,数据宽度为32/64bit。此外,低功耗以及与处理器无关也是其优点。PCI有三个相互独立的物理空间:存储器地址空间、I/O地址空间和配置地址空间。配置空间用于访问PCI设备的配置寄存器,以完成启动时的初始化,并由配置软件给PCI设备分配存储器和I/O地址空间。由于PCI总线协议较为复杂,在设计具有PCI接口的产品时,如果CPU或MCU没有PCI接口,一般采用专用的桥接芯片,或者是可嵌入PLD中的IP核来实现PCI协议。Altera、Xilinx等PLD生产厂商大都提供可以嵌入自己产品中的支持PCI协议的IPCore,使用起来较为灵活,但是对应用者的要求也较高。采用专用PCI桥芯片,可以让工程师工必精通PCI规范的各种细节,甚至不需完全了解PCI总线的时序,只要理解了桥电路的局部总线的性能,就可以顺利地进行PCI产品的设计开发,不失为一种低成本、高效率的解决方案。主流的PCI桥芯片主要有AMCC公司S593X和PLX公司的PCI9050、9054、9060等。其中PLX公司为其产品还提供一套软件开发工具包SDK,它可以很好地帮助工程师进行硬件调试,并大大简化PCI设备驱动程序及应用软件的编制。2用PCI9052构成的PCI接口电路按照是否具有控制总线的功能,可以将PCI的设备功能划分为主设备(Master)功能和目标设备(Target)功能,总线上可以有多个具有Master功能的设备,因此PCI是一个独立于CPU的总线。PCI9050、9052、9030是PLX公司生产的具有完全Target接口功能的PCI桥接芯片,支持32位、33MHz即132MB/s传送速度的PCI总线规范。其中PCI9030是最新推出的,支持高达60MHz的局部总线时钟,并具备热插拔功能。PCI9052集成了一个与标准ISA兼容的总线接口,简化了接口电路的设计,应用较为方便。图1是以PCI9052作为PCI桥的图形控制板的接口逻辑电路框图。与PCI9052接口的是一个具有二维图形显示功能的图形控制器TMS34010。它拥有一个16位的I/O映射功能的主机接口(HPI),通用ISA总线的时序就可以满足其要求,因此利用PCI9052的ISA端口可以非常简便地实现图形控制器与PCI总线的接口,并且由于只需要I/O接口操作功能,不需要ISA标准的存储器读写功能,所以许多不需要的相关信号可以被省略。图1中CPLD中的逻辑电路是将ISA地址线进行HPI端口的译码,并与读写选通(IOWR、IORD)相或产生主机片选HCS选中TMS34010。由于PCI9052的ISA接口不是芯片上电后的缺省状态,所以还要对硬件进行预先设备。首先,将PCI9052的MODE引脚接地,设置成非复用总线方式;然后对串行EEPROM进行预编程,也就是对芯片内部的寄存器进行设置。由于PCI9052的ISA模式已指定将局部总线的CS0分配给了ISA的存储器地址空间,CS1分配给了ISA的I/O地址空间,所以要对CS0、CS1对应的两组相关寄存器进行设置。其中LAS0RR、LAS0BA、CS0BASE用于设置PCI到ISA的存储器地址空间的映射;LAS1RR、LAS1BA、CS1BASE用于设置PCI到ISA的I/O地址空间的映射;LAS0BRD、LAS1BRD用于将时序设置成能满足ISA总线的要求。此外,须将INTCSR寄存器的第12位置成ISA模式,还要设置CNTRL寄存器,将第138、139脚置为ISA总线输出信号IORD、IOWR。3使用SDK实现PCI设备的驱动和应用软件的开发要完成对PCI设备产品的开发和调试,相关的软件调试工具是必不可少的。PLX公司的SoftwareDevelopmentKits(SDK)就是这样一个功能较为完善的工具包。3.1SDK软件包的内容和特点SDK软件包主要包括以下内容:(1)Windows98/NT/2000兼容的设备驱动程序和以此为基础的HOSTAPI库函数;(2)一个Windows下的调试应用软件PLXMon,它可以对PLX公司的所有PCI接口芯片进行配置和操作,使用非常方便;(3)可以支持多种嵌入式CPU的LocalAPI库函数;(4)可以支持VxWorks、Linux、pSOS等多种RTOS的BSP。其中(3)、(4)项是专业版SDK-PRO的内容,对于在嵌入式实时操作系统(RTOS)上开发具有嵌入式CPU的PCIMASTER设备是很有帮助的。而在Windows操作系统上开发PCI的TARGET设备,(1)、(2)项即可满足要求,而且利用SDK的HOSTAPI就可方便地进行设备驱动程序的开发。3.2使用SDK开发步骤将PCISDK安装后,Windows的驱动程序就已被放置在SDK的目录下,插入PCI设备后上电,操作系统自动搜索到新的PCI硬件,并且识别出PLX接口芯片的型号,要求安装驱动程序,将SDK的相应目录给出,便自动完成安装。如要进行硬件调试,PLXMon是一个使用简便的基于Windows98/NT/2000操作系统的调试工具。它可以查看和修改PLX公司的PCI桥芯片内的所有寄存器的值,并支持FLASH和EEPROM编程,可极大地方便硬件的调试。而要开发用户自己的设备驱动或应用程序,还需要Microsoft的WindowsDDK和VisualC/C++6.0;步骤如下:1、将PLX公司的SDK包含在工程目录下;2、程序中要设置PCI_CODE和LITTLE_ENDIAN宏定义;3、包含头文件PlxApi.h;4、将PlxApi.lib插入到工程中去;5、调用PLX公司的API函数完成相应的功能操作。3.3实例说明下面是一段在VisualC++6.0环境下编写的代码,仅为了说明如何在计算机局部总线上调用SDK的API函数对上设备进行I/O读写等基本操作,这也是编写一个设备驱动程序的基础。为了节省篇幅,省略了程序中变量和函数的详细说明部分,具体可参考文献[4]。PlxPciDeviceFind(&Device,&DeviceNum);//首先在PCI总线上寻找PLX公司的PCI接口芯片,获得一个指向DEVICE_LOCATION类型的指针变量Device;rc=PlxPciDeviceOpen(&Device,&hDevice);//打开这个设备,获得一个句柄hDevice;PlxChipTypeGet(hDevice,&ChipType,&Rivision);//通过句柄读出芯片的型号;port=PlxPciConfigRegisterRead(Device.BusNumber,Device.SlotNumber,0x1c,&rc);//利用获得的设备总线和插座的序号信息定位该设备,并调用函数读取PCI9052内部寄存器关于该设备被分配在PCI总线上I/O空间的端口地址(0xlc是要读的PCIBAR3寄存器的地址偏移量);prot=port&~(10);//清第零位,得到真正的端口其地址;rc=PlxIoPortRead(hDevice,port+0x2b0,BitSize16,&RegValue);//将基地址加上偏移地址,读取局部总线扩展端口的数据,写操作与此类似;……PlxPciDeviceClose(hDevice);//程序结束时,与PlxPciDeviceOpen()相对应,释放该设备本文介绍的只是最简单的应用SDKAPI库的步骤和方法。目前3.2版SDK提供的API库函数功能已非常完善,可完成PCI总线上的包括存储器、I/O和配置寄存器的读写、中断响应以及DMA通道等要求的各种功能,完全可以满足应用软件开发的需要。SDK最大的优点是使用方便简单,不过它只是面向PLX公司的PCI接口芯片的开发工具,不能做到与芯片无关;另外,它提供的API库只是基于Windows操作系统的,并且要预先安装在提供的各类芯片的驱动程序,然后通过DLL的调用来实现驱动,因此无法开发运行在核心态的真正的VxD。这些是它的局限性。