阅读:969回复:3
DMA传数?
在Driver Works中,我的驱动程序能够顺利的启动设备进行主控DMA的传输。设备一次DMA操作的最大数据量64k(65535)个字节。但是,我的dma 操作的最大数据量不能够超过28960个字节,一超过这个值,机器就回自动重新启动。
当指定一个比28960大的数据量比如30000时,在调用SequenceTransferDescriptor之前,通过驱动程序输出的调试信息能够看到30000个字节的缓冲确实传给了驱动程序,但是,当调用 SequenceTransferDescriptor()函数获取应用程序30000个字节缓冲的段描述时,他返回的缓冲的大小却始终是,28960。 他怎么会把应用程序的缓冲区变小了?请问这是什么原因?驱动程序只传送28960个字节,当执行到延迟过程调用函数的时后,机器就重起了。请各位高手帮帮忙? 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); } |
|
沙发#
发布于:2004-05-18 15:23
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2004-05-18 16:31
HI:
TOM.Cat,你好! 我用的是TMS320C6416的主控DMA Write 从DSP那边取数据到计算机内存。 DMA我能够启动,而且也能够进行数据传输。就是一次DMA操作的数据不能够超过28960个字节,他的最大数据是64KB,才接进一半就不行了。 下面有我的程序的原代吗:你能够帮我看一下么?谢谢,TOM.Cat. |
|
|
地板#
发布于:2004-05-18 16:32
HI:
TOM.Cat,你好! 我用的是TMS320C6416的主控DMA Write 从DSP那边取数据到计算机内存。 DMA我能够启动,而且也能够进行数据传输。就是一次DMA操作的数据不能够超过28960个字节,他的最大数据是64KB,才接进一半就不行了。 下面有我的程序的原代吗:你能够帮我看一下么?谢谢,TOM.Cat. 开发环境:win2000,driverstudio |
|
|