harold
驱动牛犊
驱动牛犊
  • 注册日期2001-08-26
  • 最后登录2002-10-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1337回复:2

sunlion 能否提供DMA传输方面的的东东?

楼主#
更多 发布于:2001-10-14 20:07
sunlion 能否提供DMA传输方面的的东东?
sunlion
驱动牛犊
驱动牛犊
  • 注册日期2001-10-12
  • 最后登录2003-10-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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的联机文档。有比较详细的例子。
三人行,有两个都是我的老师。
harold
驱动牛犊
驱动牛犊
  • 注册日期2001-08-26
  • 最后登录2002-10-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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;
}
游客

返回顶部