基于PCI9054的DMA和突发数据传输实现
扫描二维码
随时随地手机看文章
引言
随着ISA总线逐步被淘汰,基于PCI总线的扩展板越来越被广泛地应用于各种高速、大数据量的处理系统中。尽管有许多供应商提供了各种通用的PCI总线扩展板,但在较多应用场合,用户还必须自行设计能满足自己特殊需求的PCI扩展板,这就不可避免地会遇到PCI总线接口问题。对于绝大多数用户而言,选择专用PCI接口芯片进行PCI接口设计是必然的选择。PCI9054是PLX公司推出的一种32位33MHz的PCI总线主控I/O加速器。它采用多种先进技术,使复杂的PCI接口应用设计变得相对简单。该芯片是目前主流的PCI接口芯片之一。
1 PCI9054的工作模式及DMA处理机制
PCI是外围设备互连(PeripheralComponentInterconnect)的简称,它是一种通用总线接口标准。PCI提供了一组完整的总线接口规范、电气特性和行为规约,通过该规范,计算机系统中的外围设备能够实现结构化、可控化的连接以及正确地进行交互。PCI设备上有三种地址空间:I/O空间、存储空间和配置空间。其中配置空间的信息主要包括设备识别号、供应商代码号、Local总线三个空间的大小以及三个空间的基址等。
在计算机启动时,系统将根据配置信息分配系统资源。CPU可以访问PCI设备上的所有地址空间,其中I/O空间和存储空间提供给设备驱动程序使用,而配置空间则由操作系统内核中的PCI初始化代码使用。PCI总线接口因其传输速度快、即插即用、自动配置的优点而成为实现数据采集设备到主机之间接口的首选。
PCI9054是PLX公司生产的PCI总线接口控制器芯片,符合PCIV2.2规范,32位,工作频率为33MHz,拥有两个独立的DMA通道,传输速率达132MB/s。PCI9054提供有PCI总线、EEPROM、LOCAL总线三个接口,其中LOCAL总线有三种工作模式:M模式、C模式和J模式,可通过模式选择控制引脚MODE[1:0]进行控制。当MODE[1:0]为“11”时,PCI9054工作在M模式;当MODE[1:0]为"00"时,PCI9054工作在C模式;当MODE[1:0]为“01”时,PCI9054工作在J模式;当MODE[1:0]为“10”时,保留工作状态。M模式可与Motorola公司的MPC850或MPC860系列高性能微处理器进行无缝连接;C模式可与Inteli960系列高性能微处理器进行无缝连接;J模式地址和数据线可以复用,但应用很复杂,不过在一些特殊的应用场合,利用J模式可以和TI公司6000系列DSP的HPI口进行接口,其控制逻辑将比其它模式简单得多。
在实际的数据采集时,LOCAL总线接口一般设置为C模式。PCI9054芯片在PCI总线和LO-CAL总线之间有三种直接的数据传输模式,其中,在PCIInitiator模式,LOCAL总线主设备可通过PCI9054访问PCI总线存储空间和I/O空间;在PCITarget模式,PCI总线主设备可通过PCI9054访问LOCAL总线存储空间和I/O空间;而在DMA方式,PCI9054作为两总线的主设备,可实现PCI总线存储空间与LOCAL总线存储空间之间的数据传输。
在PCI9054中,DMA传输主要用于PCI总线与LOCAL总线间的数据传输,此时,PCI9054将接管两总线的控制权,可进行两个方向的数据传输。和DMA操作相关的寄存器包括:DMA模式寄存器(DMAMODE)、PCI基地址寄存器(DMAPADR)、LOCAL基地址寄存器(DMALADR),传输大小寄存器(DMASIZ)和描述符指针寄存器(DMADPR)o
通过这些寄存器的操作,就可以实现PCI到LOCAL或LOCAL到PCI的DMA数据传输。但是,这只是在硬件上的实现,而要在Windows操作系统上进行操作,还必须具有相应的驱动程序支持。
2 DMA方式数据传输
虽然DriverWorks已设计好了程序框架,但其流程较为复杂。下面简要介绍如何编写DMA的WDM驱动程序。DriverWorks提供了三个类:kd--maAdapter、KDmaTransfer和KCommonDmaBuffer类,可用于实现DMA操作。其中,KDmaTransfer类用来管理和操纵DMA传送,它能够管理所有类型的DMA传送操作;KDmaAdapter类用于建立一个DMA适配器,以说明DMA通道的特性,描述DMA传送类型。例如,是总线主设备DMA还是系统DMA?如果是系统DMA,还有使用哪个DMA通道,DMA通道的宽度是8b还是16b等?而Kcom-monDmaBuffer类用于申请系统提供的公用缓冲区。利用上述几个类来编写DMA驱动程序的步骤如下:
(1) 创建一个KDmaAdapter类的实例,并且正确地描述要进行的DMA信息。
(2) 决定驱动程序使用的内存类型是“Packet”还是“CommonBuffer”。DMA传送可以使用Com-monBuffer暂时存放所要传送的数据。CommonBuffer是由系统预先分配的一块物理地址连续的内存区域,处理器和设备都能对它进行访问。Kcom-monDmaBuffer类可对CommonBuffer进行描述。另外一种方法是使用MDL(MemoryDescriptorList)描述的内存区域来作为DMA传送数据的源与目标,这种方法被称为"PacketDMA”;
(3) 创建—KDmaTransfer类的实例,并使用成员函数Initiate给实例加入一个回调函数(callbackfunction)。
(4) 编写上面所说的回调函数。当一次DMA传送由于硬件设备的限制或由于缓冲区容量大小的限制而不得不分成多段传送时,回调函数将会被多次调用。它首先通知设备开始进行传送,然后立即返回,而并不是等待传送结束再返回。
(5) 编写代码来处理分段传送结束。驱动程序应能判定何时DMA传送的一个分段传送结束。驱动程序必须调用成员函数Continue来通知传送对象当前分段已传送完毕,如果整个DMA传送还未完成,它会设置下一次传送,并调用回调函数。DMA数据传输的程序流程图如图1所示。
3 DMA和突发数据传输
在《PCI9054-DataBook》中,每种工作模式都将DMA和突发数据传输的时序图放在一起,这并不意味着DMA和突发数据传输是等同的,这是两个不同的概念。事实上,既可利用一周期的总线操作,也可以利用DMA方式进行数据传输。
DMA和突发数据传输的作用不同。PCI9054中有两个DMA通道,可以独立工作,互不干扰。釆用DMA方式传输数据可以节省CPU资源;而采用突发方式传输数据可以提高数据的传输率,充分发挥PCI总线数据传输速率高的优点。因此,在高速大容量数据传输和处理系统中,将DMA和突发数据传输方式结合在一起是比较理想的,这样一方面可以充分发挥PCI总线的性能,另一方面,也可以用节省出的CPU资源对数据处理算法进行优化。用状态机实现该控制逻辑是比较理想的-PCI9054在C模式下,釆用单一周期和突发相结合的总线访问状态转换程序流程图如图2所示。
用该状态转换图设计出的逻辑电路,既可满足单一周期总线访问的需要,又可以满足突发方式传输数据的需要,因而具有很大的实用价值。使用DMA和突发方式相结合进行数据传输时,其驱动程序应作如下设置:
(1) 调用驱动程序中相应的API函数,找到PC机的物理地址;
(2) 在设备驱动程序中使能突发寄存器;
(3) 在设备驱动程序中使能总线位宽寄存器;
(4) 在设备驱动程序中使能相应的寄存器,指明DMA传输的方向是PCI—LOCAL还是LOCAL
—PCI;
(5) 在设备驱动程序中指明本次DMA传输需要传输的字节数。
完成上述设置后,即可在突发方式下进行DMA传输,否则,DMA传输就会失败。
4 结论
计算机接口技术的变化主要是由以前的以基本接口设计为中心转变为以PCI总线相关技术为中心。在8/16位的系统环境下,硬件扩展卡的设计主要是面向ISA总线,所有的可用资源都是固定不变的;在编程方面是直来直去,并没有什么保护措施。而在32位系统环境下,所有的资源都是动态分配的,而且在设计扩展卡时,并不是直接与系统打交道,而是要经过多次的逻辑转换。对于软件的设计,也需要编写32位程序,并且需要经过不同层次的软件设计。
DMA通信高度依赖操作系统、硬件特性和资源。在实现DMA通信的过程中,其项目要求、DMA本身的特点、操作系统提供的支持、具体硬件特性以及系统资源之间是相互作用的。DMA环境的建立过程,就是各部分相互协调、互为支持的过程。DMA编程必须充分了解控制芯片所提供的手段和限制,这些手段和限制是实现DMA的基础。实现DMA通信,需要处理的主要问题有:DMA缓冲区的物理连续问题、PCI设备检测和初始化问题、缓冲区的大小问题、PCI设备信息的收集问题等。