WINDOWS下PCI接口卡WDM驱动程序的DMA编程技术1

  摘要:
 
    本文主要讨论了在Windows环境下开发PCI接口卡DMA应用的WDM编程技术,并给出了一个应用DriverWorks和VC++开发的实例程序代码。 关键词:Windows、PCI总线、WDM驱动程序、DMA Abstract: This paper introduced DMA program with WDM for PCI in Windows, And gives some program code for an example with DriverWorks and VC++.
 
    前言
 
    现化微机的扩展槽通常有ISA总线和PCI总线两种接口标准,而PCI总线以其优良的性能和更好的适应性已成为现代高档微机的主流总线。以操作系统观点来看,不论Windows 95/98/2000/NT/XP等都是由一个操作系统核心和多个驱动程序组成,驱动程序总是与系统中的硬件相对应。在Windows环境下共有三种类型的驱动程序,分别是VxD、NT驱动程序和WDM。VxD应用在Windows 9x下,而WDM应用在Windows 98/2000/XP下。WDM是Win32 Driver Model的缩写,是Microsoft公司力推的新型的驱动程序工作模式。 在Windows操作系统下开发设备驱动程序需要专门的开发工具,目前应用广泛的工具主要是DriverStudio----NuMega公司提供的一个大的开发工具包,它包含VtoolsD、DriverWorks和SoftICE等开发工具。DriverStudio是一个全面的Windows设备驱动程序开发工具。DriverWorks是DriverStudio的一个组成部分,它能够非常方便地实现针对 NT驱动程序和 WDM 驱动程序的开发。DriverWorks中的类库封装了针对驱动程序的各种通用操作,使用其中的DriverWizard向导功能,可让开发人员直接进行到设备驱动程序的开发过程,从一段关于硬件设备的描述自动产生驱动程序的源代码程序框架,在帮助你缩短整个开发周期的同时开发出高质量的,结构化的驱动程序。
 
    Windows环境下涉及DMA驱动程序编程的内容 DriverWorks提供了三个类:KDmaAdapter、KDmaTransfer和KCommonDmaBuffer类,用于实现DMA操作。KDmaAdapter类用于建立一个DMA适配器,它说明DMA通道的特性。KDmaTransfer类用于DMA传输控制。KCommonDmaBuffer类用于申请系统提供的公用缓冲区。下面简单介绍一下这三个类的主要成员函数:
(1)KDmaAdapter类 Initialize( pDesc,,pPdo)或Initialize( pDesc,pPdo,nMaxScatterGatherPairs)。参数pDesc为设备描述结构指针;pPdo为物理设备对象指针;nMaxScatterGatherPairs为支持分散/聚集的总线主控设备的物理不连续缓冲区个数。
(2)KDmaTransfer类
   ①KDmaTransfer( pDevice,pAdapter,pBuffer)或KDmaTransfer( void )。是该类的构造函数。参数pDevice为相关的设备对象指针;pAdapter为相关的适配器对象指针;pBuffer为相关的公用缓冲区对象指针。

   ②Initiate( Memory,Dir,Callback,pContext,BusMasterKeepAdapter )或 Initiate(pDevice,pAdapter,Memory,Dir,Callback,pBuffer,pContext,BusMasterKeepAdapter)。用于初始化DMA传输。参数Memory为内存对象指针;Dir为传输方向,取值为FromDeviceToMemory或FromMemoryToDevice;Callback为DMA准备就绪回调例程;pContext为传递给回调例程的环境参数地址指针;BusMasterKeepAdapter为是否保持适配器对象,正常情况下,总线主控设备释放适配器对象,但保持映射寄存器。

   ③BytesRemaining( void )。返回当前传输的剩余字节数。

   ④Terminate( void )。终止传输并释放适配器。

   ⑤SequenceTransferDescriptors( ppTD )。获取当前传输段的单个描述符。只能在DMA准备就绪回调例程中调用。返回TRUE,表示取得下一个传输描述符。

   ⑥Continue(XferCountType,Count)。继续传输,在一段传输完成后调用。参数XferCountType为传输长度类型;Count为指定的传输字节数。 另外,KDevice类还有一个成员函数DEVMEMBER_DMAREADY( class_name, function_name )与DMA准备就绪回调例程有关。用于声明DMA准备就绪回调例程为KDevice派生类的一个成员函数。参数class_name为定义DMA准备就绪回调例程为其成员函数的类名;function_name:DMA准备就绪回调例程名。

(3)KCommonDmaBuffer类

     ①Initialize( pAdapter,size,CacheEnabled)。初始化一个用缺省构造函数定义的类对象。参数pAdapter为相关的适配器对象指针;size为要求的缓冲区字节长度;CacheEnabled为是否允许CPU内部的高速缓冲区作为公用缓冲区。

     ②VirtualAddress( void )。返回缓冲区的内核模式地址。

     ③LogicalAddress( void )。返回缓冲区的物理地址。

     ④Size( void )。返回缓冲区的字节长度。

     ⑤KMemory Mdl( void )。返回和缓冲区相关的的内存对象。 要开发DMA驱动程序,通常还要涉及到硬件访问和中断处理的问题。因此,在DMA驱动程序中应包含有硬件访问编程部分和中断处理编程部分。通常可以使用KIoRange类实现对I/O映射芯片的访问, KMemoryRange类实现对内存映射芯片的访问,KInterrupt类实现硬件中断的处理。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值