1.1基于PCI总线接口技术的DMA传输系统
设计基于PCI总线接口技术的DMA传输系统,需要解决的主要问题是基于PCI总线的接口电路的
设计,以及在Windows操作系统下的DMA驱动程序的开发。
一般来说,一个PCI接口电路的设计主要围绕需要实现的功能来考虑[2]。(1) PCI总线的命令译码。接口电路对C/BE[3:0]和IDSEL总线信号进行译码,以确定来自主机的PCI命令是I/O访问还是存储器访问,并产生相应的控制信号。(2) 地址产生电路。在PCI突发传输方式中包含一个地址周期和若干个数据周期,因此PCI接口电路必须能向前端的数据采集电路提供连续的地址。(3) 控制信号产生。PCI总线的数据传输基本上由FRAME#、IRDY#、TRDY#、DEVSEL#四个总线信号控制,因此,PCI接口电路必须产生这些控制信号。(4) DMA控制器的功能。在DMA传输时,接口电路必须能够实现DMA。综合以上四个方面,设计中选用PLX公司的PCI9054作为接口芯片,能够完全实现PCI总线控制器以及DMA控制器的功能。基于PCI接口电路的数据传输系统原
理框图如图1所示[3]。系统中,存储模块用于采集数据的缓存;控制模块实现对存储模块的读写控制;EEPROM存储PCI接口模块的配置信息。
配置信息是PC机识别接口设备并分配相应资源的依据,如果配置不当,会引起计算机不能正常启动。在本文系统中,当主机启动时,EEPROM完成对PCI9054内部的PCI总线配置寄存器和局部总线(Local Bus)配置寄存器的初始化。局部总线配置寄存器主要实现局部地址资源的分配,即局部总线端映射到PCI端的地址,包括存储器空间与I/O空间。
PCI9054有PCI BAR0~PCI BAR5六个基址寄存器[5] 。其中PCI BAR0 和PCI BAR1 用来访问
PCI9054 Local端配置寄存器的基地址,BAR0映射到内存,BAR1映射I/O空间的基地址,就可以以内存方式或I/O的方式访问PCI9054 Local端配置寄存器。BAR2~BAR3提供访问Local端的芯片,其他的保留不用。在本文系统设计中,BAR2映射到Local端的“0地址空间”,使用内存映射方式。当Local端内存基地址为0x20000000 , 且大小为1 M时, 配置LAS0BA为0x20000000、LAS0RR为0xFFF00000。
2.1 DMA数据传输简介
为了实现DMA数据传输,首先要了解PCI总线接口协议,在这里介绍与DMA数据传输有关的PCI智能桥路9054芯片用到的主要寄存器。
(1) 中断控制/状态寄存器(INTCSR):偏移量是BAR0的68H单元,它是32位寄存器,与DMA传输有关的位定义如下:
D8:PCI中断使能位,写“1”允许PCI中断;D10:异常中断使能位,写“1”允许PCI异常中断,与D8联合使用;D11:本地中断使能
位,写“1”允许本地中断,与D8联合使用;D18:DMA通道0中断使能,写“1”允许DMA通道0中断,与本地中断使能位D11联合使用;
D21:DMA通道0中断产生位,该位为“1”表示有DMA通道0中断产生; (2) DMA通道0方式字寄存器(DMAMODE0):偏移量是BAR0的80H单元,它是32位寄存器,用于设置DMA通道0的工作方式。
(3) DMA通道0本地地址寄存器(DMALADR0):偏移量是BAR0的88H单元,它是32位寄存器,表示DMA传输操作中应该从缓冲区的什么地方开始。
(4) DMA通道0传输字节数(DMASIZ0):偏移量是BAR0的8CH单元,它是32位寄存器,用D0到D22表示DMA传输的字节数。
PCI9054芯片支持两个DMA通道,每个DMA通道有DMA控制器和一个双向的FIFO组成,两个通道均支持Block方式传输和Scatter/Gather方式传输,驱动程序必须为传输操作设置DMA控制器。对于Block传输方式,主机处理器或本地处理器设置本地或PCI起始地址、传输字节数、传输方向,在开始传输时设置DMA启动位,PCI9054请求PCI或本地总线传输数据,传输完成后,PCI9054 设置传输完成位 (DMACSR0[4]=1或DMACSR1[4]=1) ,它要求分配存储区为一整块缓冲区,一次完
成全部数据的传输,这种传输方式实现起来比较简单,但内存开销比较大,并且不能满足连续的数据传输要求。
对于Scatter/Gather传输方式,主机处理器或本地处理器设置本地或PCI起始地址、传输字节数、传输方向,使用DMA数据传输的驱动程序必须为一个缓冲区分配内存,DMA传输使用这个缓冲区完成操作。在分配一个缓冲区后,从属设备的驱动程序可以开始处理一个请求DMA传输。它从锁定的用户缓冲区拷贝数据到驱动程序分配的公用缓冲区,在传输期间,驱动程序读DMASIZ0或DMASIZ1寄存器以确定有多少字节被传输,读DMALADR0或DMALADR1寄存器以确定应该在缓冲区的什么地方开始传输,以保证任何在系统DMA控制器中高速缓存的数据被读到系统内存中或者写到设备。Scatter/Gather DMA方式内存描
述指针初始化见图。
3. DMA数据传输系统中各个模块的设计 3.1 PCI接口模块
PCI接口模块由PCI9054来实现。PCI9054是一个32位33 MHz总线主控I/O加速器,它是当今最先进的通用总线主控设备,能完美地实施PCI 2.2版规范的要求,可获得高达132 MB/s的突发传输速度。PCI9054提供PCI总线、E2PROM总线和Local总线三个接口。Local总线有J、M和C三种工作模式。本文系统里将Local总线设置为C模式。PCI9054作为桥接芯片,在PCI总线和Local总线
之间有PCI Initiator(PCI 起始器)、PCI Target(目标数据传输模式)和DMA传输模式三种数据传输模式。PCI Initiator传输模式支持局部总线直接访问PCI总线的存储空间和I/O空间,而PCI Target模式则支持PCI总线主设备通过9054访问局