pci数据采集卡DMA驱动开发问题

时间:2022-12-31 09:35:58
本人正在开发pci9052数据采集卡的驱动有那位大侠帮帮忙,我的问题是在用driverwork中如何做DMA传输代码。有那位有源代码的施舍小弟一点将有高分送上谢谢Email-bf_bf_bf@163.com

6 个解决方案

#1


大致如下:

//--------------------------
VOID  StartWriteIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    RtlCopyMemory(dx->vaCommonBuffer,MmGetMdlVirtualAddress(Irp-   >MdlAddress),dx->TxdLength); 
}
//-----------------------------

NTSTATUS StartDevice( IN PWDM1_DEVICE_EXTENSION dx, 
  IN PCM_RESOURCE_LIST AllocatedResourcesTranslated))
{
dx->vaCommonBuffer = (*dx->WriteAdapter->DmaOperations->AllocateCommonBuffer)
(dx->WriteAdapter,
 dx->BufferLength,
 &dx->paCommonBuffer,
 FALSE);
}
//-------------------------------------
VOID PlxDmaStart (IN PWDM1_DEVICE_EXTENSION  dx)
{

WRITE_PORT_ULONG(dx->PortBasePci + PLX_DMACSR0,  PLX_DMACSR_ENABLE | PLX_DMACSR_START);
return;
}

#2


如何区分总线DMA和系统DMA呢还有scatter/gather特性?

#3


你可以采用scatter/gather模式传输,也可以采用公共缓冲区的方式传输,我当年做9054在LINUX下采用前一种方式,在WINDOWS下采用后一种。
scatter/gather: 你得做一个链表,(描述符,启始地址,传输长度,下一棵描述符的地址)。大致如此,详细的请看DATASHEET。
公共缓冲区: 相对简单,大只如上贴。
如何区分总线DMA和系统DMA: 随便买本驱动的书,都有。

#4


你给的好象是DDK的代码,我用的是driverworks的模式,不知你是否有此方面的代码?我有的是系统DMA,现在是在ISA总线上实现。以后版本应该是pci上的。我写的代码老出问题不知什么原因。你知道那里有相关的资源吗??急!!!

#5


请问ddk的代码和driverworks的模式有什么区别啊!

#6


哈哈,DDK和Driverworks正如SDK 和MFC一样,DDK都能用,DriverWorks肯定能用了。

#1


大致如下:

//--------------------------
VOID  StartWriteIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    RtlCopyMemory(dx->vaCommonBuffer,MmGetMdlVirtualAddress(Irp-   >MdlAddress),dx->TxdLength); 
}
//-----------------------------

NTSTATUS StartDevice( IN PWDM1_DEVICE_EXTENSION dx, 
  IN PCM_RESOURCE_LIST AllocatedResourcesTranslated))
{
dx->vaCommonBuffer = (*dx->WriteAdapter->DmaOperations->AllocateCommonBuffer)
(dx->WriteAdapter,
 dx->BufferLength,
 &dx->paCommonBuffer,
 FALSE);
}
//-------------------------------------
VOID PlxDmaStart (IN PWDM1_DEVICE_EXTENSION  dx)
{

WRITE_PORT_ULONG(dx->PortBasePci + PLX_DMACSR0,  PLX_DMACSR_ENABLE | PLX_DMACSR_START);
return;
}

#2


如何区分总线DMA和系统DMA呢还有scatter/gather特性?

#3


你可以采用scatter/gather模式传输,也可以采用公共缓冲区的方式传输,我当年做9054在LINUX下采用前一种方式,在WINDOWS下采用后一种。
scatter/gather: 你得做一个链表,(描述符,启始地址,传输长度,下一棵描述符的地址)。大致如此,详细的请看DATASHEET。
公共缓冲区: 相对简单,大只如上贴。
如何区分总线DMA和系统DMA: 随便买本驱动的书,都有。

#4


你给的好象是DDK的代码,我用的是driverworks的模式,不知你是否有此方面的代码?我有的是系统DMA,现在是在ISA总线上实现。以后版本应该是pci上的。我写的代码老出问题不知什么原因。你知道那里有相关的资源吗??急!!!

#5


请问ddk的代码和driverworks的模式有什么区别啊!

#6


哈哈,DDK和Driverworks正如SDK 和MFC一样,DDK都能用,DriverWorks肯定能用了。