阅读:2473回复:2
请教关于DMA传输的问题
我的开发环境是 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 没有生成,麻烦各位帮我看下。 |
|
沙发#
发布于:2009-01-10 12:18
这个改一下应该就可以了,把判断条件改了就好了吧。我遇到的问题是用武安河的那个9054的例子,寄存器设置改动了一下做9656的,那个DMAMODE0 的DoneInterruptEnable使能了,然后运行的时候就死机呢,不使能这一位就没事,但是不使能的话也不行吧,那就没有中断。你知道怎么解决吗
|
|
板凳#
发布于:2010-06-29 11:14
我和搂住遇到的问题一样,pXfer->SequenceTransferDescriptors(&ptd)是不是就是获得pc上的物理地址呢,这个物理地址就是应用程序提供的存贮空间呢
|
|