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;
}
//--------------------------
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: 随便买本驱动的书,都有。
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;
}
//--------------------------
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: 随便买本驱动的书,都有。
scatter/gather: 你得做一个链表,(描述符,启始地址,传输长度,下一棵描述符的地址)。大致如此,详细的请看DATASHEET。
公共缓冲区: 相对简单,大只如上贴。
如何区分总线DMA和系统DMA: 随便买本驱动的书,都有。
#4
你给的好象是DDK的代码,我用的是driverworks的模式,不知你是否有此方面的代码?我有的是系统DMA,现在是在ISA总线上实现。以后版本应该是pci上的。我写的代码老出问题不知什么原因。你知道那里有相关的资源吗??急!!!
#5
请问ddk的代码和driverworks的模式有什么区别啊!
#6
哈哈,DDK和Driverworks正如SDK 和MFC一样,DDK都能用,DriverWorks肯定能用了。