PCI总线高速DMA数据传输驱动程序设计_第1页
PCI总线高速DMA数据传输驱动程序设计_第2页
PCI总线高速DMA数据传输驱动程序设计_第3页
PCI总线高速DMA数据传输驱动程序设计_第4页
PCI总线高速DMA数据传输驱动程序设计_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PCI总线高速DMA数据传输驱动程序设计 Design of Device Driver for High-Speed DMA Communication on PCIBus(中国电子科技集团公司第41研究所,安徽 蚌埠233006黄文南摘 要:应用PLX公司的PCI9054芯片, 开发PCI设备的DMA数据传输驱动程序, 主要介绍了在WinDriver平台上的具体实现及应注意的问题。关键词:PCI总线;DMA;设备驱动程序Abstract:The design of Windows device driver for high-speed DMA communication based on

2、 PCI bus is introduced,and its implementation on WinDriver platform is presented.Key words:PCI bus;DMA;device driverPCI总线由于其高性能、低成本、开放性,目前在工业控制计算机方面得到了广泛的应用。PCI总线工作频率为33 MHz/66 MHz,采用32位/64位地址/数据复用总线。数据传输速率在33 MHz时钟,32位总线宽度下可达132 MB/s,远远高于ISA 总线5 MB/s的传输速率;PCI总线支持突发成组传输,一个突发分组由一个地址期与多个数据期组成,大大提高了数据的

3、传输效率;PCI总线独立于处理器,采用总线控制与同步操作,具有极小的存取时延。在开发通信分析仪时需要大量高速的数据捕获,基于PCI总线的这些特性,数据捕获接口板采用了32位的PCI总线与主机接口。1 PCI9054总线控制器简介为简化电路设计与提高设计的效率与可靠性,数据捕获PCI接口板采用了专用的控制芯片PCI9054。PCI9054是由美国PLX公司生产的先进的PCI I/O加速器,采用了先进的PLX数据流水线结构技术,符合PCI本地总线规范2.2版; 针对不同的处理器及局部总线特性, 有M、C、J三种模式可选; 配有可选的串行E2PROM接口,本地总线时钟可与PCI时钟异步。PCI905

4、4内部有6种可编程的FIFO,以实现零等待突发传273输及本地总线与PCI总线之间的异步操作;支持主模式、从模式、DMA传输方式,被广泛应用于嵌入式系统中,是目前主控设备PCI桥接器的主流芯片。2 PCI设备DMA数据传输的驱动程序设计2.1 开发环境介绍Windows2000是纯32位的操作系统, 由于其运行的稳定性及可靠性较WIN9X 要高,因此在工业控制中,一般采用Windows2000作为运行平台。笔者开发的通信分析仪采用了Windows2000操作系统。由于Windows 2000禁止用户模式的程序访问I/O端口(Windows 95/98则允许用户程序直接访问I/O端口,用户应用程

5、序一般需通过设备驱动程序实现对设备的控制。为了实现PCI接口板的数据捕获必须编写相应设备驱动程序。在Windows2000下,主要设备驱动程序的模型为WDM(Win32 drivers model,它是在原WINNT驱动模型KDM(kernel driver mode上增加即插即用(P&P和电源管理等功能而形成的。开发设备驱动程序与开发用户应用程序是完全不同的,开发设备驱动程序需要对系统内核有深入的了解,因此开发的难度较大。经过比较选用了JUNGO公司提供的WinDriver驱动开发平台。 WinDriver通过提供一组底层API函数调用使开发人员可以在用户层完成设备驱动程序开发, 使

6、用通用的VC+6.0环境等就可以完成驱动程序的开发与调试。针对PCI9054接口芯片,WinDriver提供了相应API函数调用,如数据的读写,DMA操作,中断服务等,大大方便了驱动程序的开发。2.2 DMA数据传输的方案设计在PCI接口板上,设有两块128 KB的RAM用作捕获数据的缓存,采用乒乓方式与主机内存进行DMA传输,当一个缓冲区捕获满时,产生一个中断通知主机,同时下一次捕获的数据将被放入另一块缓冲区中。主机收到捕获满中断后启动一次DMA传输,将获捕的数据放入主机的内存缓冲区中,然后进行数据的处理与显示。在本设计中,PCI9054以C总线模式工作。因为数据捕获量大,达到38 MB/s

7、,为了提高数据的存取速度,采用了无限突发的DMA方式。采用DMA通道0作为传输通道,每次传输的数据量为128 KB大于一页(4 KB,所以DMA的传输方式置为分散/聚拢方式。当DMA传输结束后,以中断方式通知主机。PCI接口板与主机的DMA传输示意图如图1所示。274 图1 主机与本地设备的DMA传输示意图2.3 DMA驱动程序开发在开发PCI设备驱动程序中,首先需确定PCI9054配置E2PROM的值,因为PCI9054的初始化是根据其配置E2PROM中的值来进行的。当系统检测到PCI设备后,通过WinDriver提供的DriverWizard自动生成驱动程序框架,及*.inf文件。WinD

8、river为PCI9054提供了一组API函数,但是其提供的DMA 函数不是基于突发方式的,并且是以查询方式来检测DMA是否结束,比较适用于一次DMA读写。因此在本设计中,对其提供的DMA API函数及中断相关的函数进行改写,即在DMAOpen(函数中,需对DMAMODE寄存器的本地突发使能位(BIT8与BTERM输入使能位(BIT7置位,否则,DMA操作只能完成一个双字的突发传输,只有将此二位置1后,才能完成指定长度的DMA传输。因为传输量超过 4 KB,所以要置为分散/聚拢(scatter/gather模式(BIT9,同时使能DMA 中断完成位(BIT10与DMA通道0中断选择位(BIT1

9、7。重写DMA启动函数DMAStart(,设置每次DMA传输所需的PCI地址(主机物理内存地址、本地地址、传输大小、传输方向等,并置DMA启动位。这样每次数据捕获满中断到来,启动DMA传输时,只需调用DMAStart(函数即可。如果采用Windriver提供的DMAWriteRead函数,每进行一次DMA传输都要重新打开一个DMA,分配空间,设置各种相应的寄存器等,增加了DMA传输的CPU开销。笔者曾测试过,当进行数据全速捕获时,如果采用Windriver提供的DmaWriteRead函数及DMA完成查询方式,CPU的负荷最高可达80%,严重影响了系统其他程序的执行。当采用修改后的DmaSta

10、rt(函数及DMA中断方式后,全速进行数据捕获时, CPU的负荷只有25%左右,大幅降低了CPU的负荷,保证了整个系统软件的正常执行。在DMAStart(函数中,需要注意的是PCI地址寄存器的设置,因为传输数据量275 大于一页(4 KB,所以采用了分散/聚拢方式,即以分散的物理内存块映射连续分配的用户地址空间。与内存块分配方式不同,这时不是设置DMA 的PCI 地址与本地地址寄存器,而是设置DMA 通道描述符寄存器(DMADPR。通过函数WD_DMALock(在物理内存中锁定所需大小的存储空间,取得每页的物理地址,大小及相对应的本地地址放入地址描述块链表中,在DMADPR 寄存器中设置初始的

11、描述块地址。DMA 操作启动后,PCI9054调入第一块的地址进行传输,完成后调入第二块,直到遇到链表的结束位为止(DMADPR 的BIT1为1。在InterruptEnable(中断使能函数中,定义捕获满及DMA 完成中断的清除操作,使能本地PCI 中断(捕获中断及DMA 通道 0中断,定义中断入口程序。在用户层的中断处理程序中,按中断状态位分别处理捕获中断与DMA 完成中断。如果是捕获中断则启动一次DMA 传输;如果是DMA 完成中断,则对捕获数据进行处理。将所有与硬件有关的API 函数打包成动态链接库。在主机的用户应用程序中,程序初始化时将其调入。在数据捕获功能中对相应的DMA 函数进行

12、调用,程序流程图如图2 276图2 程序流程图与设备操作相关的API函数如表1所示。表1PCI设备操作相关的API函数列表API函数名作用LocateAndOpenBoard 定位PCI板卡打开PCI设备,分配资源ReadReg 读32位寄存器WriteReg 写32位寄存器IntEnable 使能中断IntDisable 关闭中断DMAOpen 打开一个DMADMAClose 关闭DMADMAStart 启动一次DMA传输P9054_Open 打开一个PCI设备P9054_Close 关闭一个PCI设备2.4 驱动程序设计中应注意的问题在驱动程序开发过程中,确定PCI9054配置E2PROM

13、的值是很重要的一步,需对PCI总线的工作方式及对PCI9054的各种寄存器的作用有充分的了解,如果设置不正确,系统就无法检测到PCI接口板,或者即使检测到了,读写也可能不正常,使驱动程序的开发无法进行下去。在中断使能函数中,如果中断处理部分放在用户层,那么一定要在中断使能函数中,预先定义好各种中断的清除操作,因为PCI中断为电平中断,为了保证中断的及时清除,这一部分必须由内核来做,不能放在用户层的中断处理部分来做。如果中断频率很高,则应该将中断处理部分放入内核插件中处理。在用户层中断响应为每秒10000次,而在内核方式下为每秒100000次。对于DMA传输地址的设置,要注意是用主机内存的物理地址来设置DMA的PCI地址寄存器。为了保证传输的连续进行,所分配的这段主机内存必须是非分页277内存, 以保证不会被交换出去, 所以必须用 WD_DMALock(函数来分配并锁定内存, 而不能用一般的内存分配函数. 3 结束语 PCI 总线已成为工业控制计算机中的主流总线结构, 本设计采用 PCI 总线 DMA 方式实现了大量高速的数据捕获,满足了设计的要求.采用 WinDriver 驱动开发平 台,使难度较大的 Windows 驱动程序开发变得容易,大大缩短了驱动程序开发与调 试的时间.所有 PCI 设备的操

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论