icewindheart
驱动牛犊
驱动牛犊
  • 注册日期2008-01-08
  • 最后登录2009-06-23
  • 粉丝1
  • 关注0
  • 积分13分
  • 威望39点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2402回复:2

请教关于DMA传输的问题

楼主#
更多 发布于:2008-12-31 10:29
我的开发环境是 ds2.7 + vc6.0 +winxpddk,板卡是tms320c6416dsp,用的是6416自带pci接口,开发其pci驱动。          现在有一个dma的问题,用ds生成的代码:
VOID C6403Device::OnDmaReady(KDmaTransfer* pXfer, KIrp I)
{
    t << "Entering OnDmaReady, " << I << EOL;
    t << "BytesRemaining: " << (ULONG)pXfer->BytesRemaining() << EOL << EOL;
    if (pXfer->BytesRemaining() == 0)
    {
        t << "Entering BytesRemaining " << EOL;
        t << "BytesRemaining: " << (ULONG)pXfer->BytesRemaining() << EOL << EOL;
        pXfer->Terminate();
        I.Information() = I.ReadSize(CURRENT);
        I.Status() = STATUS_SUCCESS;
        PnpNextIrp(I);
        m_CurrentTransfer = NULL;
        delete pXfer;
        return;
    }
   PTRANSFER_DESCRIPTOR ptd;
    while (pXfer->SequenceTransferDescriptors(&ptd)) {

        t << "Physical Address: " << ptd->td_PhysAddr.LowPart << EOL << EOL
            << "Length is: " <<  ptd->td_Length<<"."<<EOL<<EOL;    
    }
    if ((ULONG) pXfer->BytesRemaining() == I.ReadSize())
        StartDMA(ptd->td_PhysAddr.LowPart,ptd->td_Length);
}

我想请问这个关于dma的问题:
   比如应用程序传给驱动的缓冲区是64kBytes,但是一次DMA传输只能传0X7F98个字节数据,之后中断然后,进入continue()之后再次调用OnDmaReady,但是有个判断: if((ULONG)pXfer->BytesRemaining()==I.ReadSize())
     StartDMA(ptd->td_PhysAddr.LowPart,ptd->td_Length);
I.ReadSize()一直是应用程序要求的64kBytes,但是BytesRemaining()自动减少了,也就是说 if ((ULONG) pXfer->BytesRemaining() == I.ReadSize()) 不成立,所以就不再调用StartDMA,以至于没有DMA传输完成中断,无法返回应用程序而死。
PTRANSFER_DESCRIPTOR ptd;当进行第一次dma时其保存的是正确的值,continue()之后再次调用OnDmaReady的时候根本没有进入while (pXfer->SequenceTransferDescriptors(&ptd)),也就是说第二次的transfer descriptor 没有生成,麻烦各位帮我看下。
jinyong
驱动牛犊
驱动牛犊
  • 注册日期2008-12-22
  • 最后登录2009-05-18
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望131点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-01-10 12:18
这个改一下应该就可以了,把判断条件改了就好了吧。我遇到的问题是用武安河的那个9054的例子,寄存器设置改动了一下做9656的,那个DMAMODE0 的DoneInterruptEnable使能了,然后运行的时候就死机呢,不使能这一位就没事,但是不使能的话也不行吧,那就没有中断。你知道怎么解决吗
yadun
驱动牛犊
驱动牛犊
  • 注册日期2008-05-17
  • 最后登录2014-08-17
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望161点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-06-29 11:14
我和搂住遇到的问题一样,pXfer->SequenceTransferDescriptors(&ptd)是不是就是获得pc上的物理地址呢,这个物理地址就是应用程序提供的存贮空间呢
游客

返回顶部