阅读:1337回复:2
sunlion 能否提供DMA传输方面的的东东?
sunlion 能否提供DMA传输方面的的东东?
|
|
沙发#
发布于:2001-10-15 09:45
手头有一点点资料,因为不算多,就敲出来供大家参考吧。
DMA数据传输时要求REGION是一块物理连续的内存,当这一条件不满足时,VDMAD提供BUFFER服务来支持DMA数据传输。VTOOLSD中的一个类VDMABUFFER则封装了这个服务。 这个类的几个主要成员函数是: 1、VDMABuffer(PVOID regionAddress,DWORD regionSize) regionAddress region的线性地址; regionSize region字节数 2、 COPYFROM(PVOID region,DWORD size,DWORD bufOffset,DWORD& errCode)// 在DMA传输后,BUFFER内存放着外设传来的数据。该函数把BUFFER内的数据取出放到RING3层程序的内存里,即REGION内,返回TRUE表示COPY成功。 3、BOOL VDMABuffer::copyTo(PVOID region,DWORD size,DWORD bufferOffset,DWORD& errCode) 在DMA传输之前,先用COPYTO把RING3层数据从REGION拷贝到BUFFER中,DMA在BUFFER和外设间做DMA传输。 有关详细内容可以参阅VTOOLSD的联机文档。有比较详细的例子。 |
|
|
板凳#
发布于:2001-10-15 11:07
我用了这些东东生成了VXD,而且VDMABuffer,之类的也工作正常,当问题时老是没打开DMA(因为我有一个DOS的采集程序,在window下工作采集到数据后,再用我自己做的VXD来采集,发现它只是简单地把前面DOS程序采到数据COPY到我内存中,而不是从新开始采集)。谁能帮我看看:DWORD MysampleDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)
{ DMARegion *pDMARegion1; DWORD Lockable; DWORD ErrCode; PVOID PhysAddr; switch(pDIOCParams->dioc_IOCtlCode) { case DIOC_OPEN: pDmasamplDMA=new DmasamplDMAChannel; if(!pDmasamplDMA->hook()) { delete pDmasamplDMA; return -1; } break; case DIOC_CLOSEHANDLE: if(pDmasamplDMA) { pDmasamplDMA->physicalMask(TRUE); pDmasamplDMA->unhook(); delete pDmasamplDMA; } break; case DMASAMPL_DIOC_TRANSFER_DATA: if(!pDmasamplDMA) return -1; pDMARegion1=(DMARegion *)pDIOCParams->dioc_InBuf; if(pDmasamplDMA->lockRegion(pDMARegion1->Address,pDMARegion1->Count,0,Lockable,ErrCode,PhysAddr)) { pDmasamplDMA->setRegion(NULL,TRUE,pDMARegion1->Address,pDMARegion1->Count,PhysAddr); pDmasamplDMA->physicalUnmask(pDIOCParams->dioc_hvm,TRUE); } else { VDMABuffer DmasamplBuffer(pDMARegion1->Address,pDMARegion1->Count); if(!DmasamplBuffer.m_createError) { pDmasamplDMA->setRegion(&DmasamplBuffer,FALSE,pDMARegion1->Address,pDMARegion1->Count,DmasamplBuffer.m_physAddress); pDmasamplDMA->physicalUnmask(pDIOCParams->dioc_hvm,TRUE); DmasamplBuffer.copyFrom(pDMARegion1->Address,pDMARegion1->Count,0,ErrCode); } else return -1; } break; default: break; } return 0; } |
|