阅读:1277回复:6
关于9054local端请求传输的问题
要做一个数据采集卡的驱动。使用9054的片子做pci接口。我的问题是:当local端请求DMA操作或是其他数据传输时,它的请求是以什么形式通过什么样的路径通知给驱动程序进行处理的?我知道如果是用户请求就由操作系统以IRP的形式发给驱动程序,那么硬件请求呢?也是IRP吗?那又是怎么产生的?
|
|
沙发#
发布于:2005-03-04 14:17
现在,有人告诉我本地端发起的DMA传输过程是不需要系统和驱动程序参与就可以完成的.但是需要在DMA完成之后发出中断通知驱动.那么在得到中断的情况下,驱动还需要做些什么呢?应用程序怎样才可以使用这些数据呢?求求知道的人不要怕麻烦,回答我一下啊!一直想不明白是十分痛苦的 :(
|
|
板凳#
发布于:2005-03-04 14:49
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于:2005-03-09 16:21
我是使用DRIVERSTUDIO进行编程的。
具体的工作情况是:由用户在应用程序中输入采集卡的各种设置,然后把设置传给采集卡,当采集结束就由Local端发起DMA数据传递。之后应用程序再得到数据进行处理。 我的想法是这样的:当用户输入结束,系统产生Irp,驱动得到该Irp的信息并将设置传递给硬件,然后将Irp设为pending,等待数据。当采集结束后,9054将数据以DMA方式从Local传递PCI端,这时产生DMA完成中断,驱动程序收到中断,调用中断处理程序,将PCI端的数据读到应用程序缓存中,然后将Irp设置为完成。当应用程序收到Irp完成的信息,就知道采集的数据已经准备就绪可以使用了。 目前的问题是:这样的过程是不是合理?在这个过程中,驱动是不是实际没有参与DMA传输的过程,那么是不是不需要建立KDmaAdapter等实例,而只需要知道DMA传输PCI端的基地址,将从这个基地址开始的对应数量的数据读到应用程序缓存中即可。 可能我的想法有很多可笑的地方,但是,希望知道正确答案的人能抽空回答我一下啊?先谢过了 :) |
|
地下室#
发布于:2005-03-10 11:23
实际上是应用程序发出一个读请求,用ReadFile或DeviceIoControl,从而系统产生一个相应的IRP,驱动程序收到IRP后对硬件进行操作,比如写9054的DMA寄存器,设置相应的通道,启动DMA传输等等,对硬件的操作都是由驱动程序完成的。
要进行DMA传输一般要用到三个类,KDmaAdapter,KDmaTransfer,KCommomBuffer,它们的作用分别是建立DMA适配器,DMA传输控制和申请系统提供的公用缓冲区。 另外,推荐一本书,《Windows 2000/XP WDM 设备驱动程序开发》,对我们DriverStudio的初学者是有用的。当然,要有提高,还要看深层次的书。 以上是我的愚见,希望能对你有所帮助 |
|
5楼#
发布于:2005-03-10 12:26
我看的就是这本《Windows 2000/XP WDM 设备驱动程序开发》,我也明白你所说的KDmaAdapter,KDmaTransfer,KCommomBuffer这些类的用法,但是我的问题是在我的实际情况下,这些类是不是需要用?
因为有人告诉我:在我的使用情况下,由local端发起DMA的时候是不需要驱动介入的,我只需要把传递到PCI端的数据传给应用程序即可。 现在的问题就是我不知道这种说法对不对。你能给我一个明白的回答吗? |
|
6楼#
发布于:2005-03-17 17:13
不知道你的硬件是怎么样的,其实用于DMA操作的那几个类实际上就是用来配置9054的,也就是写PCI9054的寄存器
|
|