阅读:1947回复:18
9054的DMA驱动问题
我使用PLX9054-RDK LITE板子,EEPROM中的信息没有做任何操作,
单次的read()和WRITE()的驱动程序已经成功,现在编写DMA的驱动,出现如下问题: 1、我用DRIVERWORKS自己编写他的DMA驱动程序,不知道可行否? 2、如果可行,是否需要什么特别的设置,下面的设置是否正确。 #define MAX_DMA_LENGTH 0x100000 // 0x100000 is 1 MB // Initialize the device descriptor for the DMA object using the assigned resource DEVICE_DESCRIPTION dd; RtlZeroMemory(&dd, sizeof(dd)); dd.Version = DEVICE_DESCRIPTION_VERSION; dd.Master = TRUE; dd.ScatterGather = FALSE; dd.DemandMode = FALSE; dd.AutoInitialize = FALSE; dd.Dma32BitAddresses = TRUE; dd.IgnoreCount = FALSE; // dd.BusNumber = 0; dd.DmaChannel = 0; dd.InterfaceType = PCIBus; dd.DmaWidth = Width32Bits; // PCI default width dd.DmaSpeed = Compatible; dd.MaximumLength = MAX_DMA_LENGTH; // Initialize the DMA adapter object m_Dma.Initialize(&dd, m_Lower.TopOfStack()); 3、如果上面正确,我是使用下面的方法,为什么不能执行LOCAL->PCI的DMA操作? m_CurrentTransfer = new(NonPagedPool) KDmaTransfer(this, &m_Dma); if ( m_CurrentTransfer == NULL ) { status = STATUS_INSUFFICIENT_RESOURCES; //DbgPrint(\"BMDmaTstDevice: unable to allocate transfer object: %x\\n\", status); I.Information() = 0; I.Status() = status; NextIrp(I); } status=m_CurrentTransfer->Initiate( this, &m_Dma, I.Mdl(), FromDeviceToMemory, LinkTo(OnDmaReady), NULL, NULL, false ); 出现的现象是: 1>、决大多数情况下不能进入ONDMAREADY()回调程序。 2>、有的时候,会直接跳入KMEMORY.h文件,提示:break due to page fault。 请各位专家给个提示。 |
|
最新喜欢:hapi |
沙发#
发布于:2003-03-13 19:19
你有PCI9054-RDK板,为什么不直接用PLX提供的驱动和API呢?
|
|
板凳#
发布于:2003-03-14 14:09
自己写的驱动,应用起来才可以得心应手,而且可以简化很多硬件工作,这是软硬件一体化设计的好处。
仁兄可以给点提示吗? |
|
地板#
发布于:2003-03-18 14:44
另外,寄存器已经全部配置正确。
|
|
地下室#
发布于:2003-03-19 15:36
power_lei
我遇到的问题和你差不多,我怀疑是根本就没有启动 不知道你现在解决没有 |
|
|
5楼#
发布于:2003-03-19 16:22
我还没有解决,但是我已经断定是我的驱动程序写的有问题!
可惜不知道问题在那里,给点提示? |
|
6楼#
发布于:2003-03-19 17:17
DMA能进入中断么?
能给我你的code,我看看行么 tiangj@chinadigipro.com |
|
|
7楼#
发布于:2003-03-20 10:41
你是指怎样的中断?
我现在是数据传完,发出中断. CODE是工程用,实在抱歉. 我的mail:little_lei@sina.com,有问题你就说. |
|
8楼#
发布于:2003-03-20 11:01
现在问题出在了kcommonbuffer上,我在初始化的时候,他跳入kadapter.h,然后就出问题了.
我在初始化KDMAADAPTER时,用的是 m_Dma.Initialize(&dd, m_Lower.TopOfStack()); 这种用法有问题吗? |
|
9楼#
发布于:2003-03-21 10:01
大家做卡,难道都用的是PLX的驱动?
|
|
10楼#
发布于:2003-03-21 13:49
DMA物理地址怎么设置
|
|
|
11楼#
发布于:2003-03-21 18:23
LOCAL ADDRESS是你在PLD中设置好的
PCI ADDRESS是你用回调函数ONDMAREADY()中得到后设置的. 如果你是个I.MDL() 可以直接获得. |
|
12楼#
发布于:2003-03-21 18:47
我能不能用DMA直接将LOCAL MEMORY的东东传到应用程序
|
|
|
13楼#
发布于:2003-03-21 21:38
只能传给IRP,当然,你可以直接用READFILE()来获得。
|
|
14楼#
发布于:2003-03-24 10:46
while (pXfer->SequenceTransferDescriptors(&ptd)) {
// program the h/w using ppTD // t << \" Physical address 0x\" << ptd->td_PhysAddr.LowPart << \". Length is 0x\" // << ptd->td_Length << \".\" << EOL; m_PAddr =ptd->td_PhysAddr.LowPart; m_PAddr =ptd->td_PhysAddr.HighPart; m_length = ptd->td_Length; m_length = ptd->td_Length;长度只为0xfd0,为什么这么短, 怎么改变这值 而且整个传输才一段(chunks) ULONG nTds = pXfer->GetTransferDescriptors(&ptd); // t << \"nTds = \" << nTds << EOL; for (ULONG ii=0; ii < nTds; ii++) { m_PAddr =ptd[ii].td_PhysAddr.LowPart; m_length = ptd[ii].td_Length; } ii值为0x01,怎么加大??? 我渴望你的回答谢谢. |
|
|
15楼#
发布于:2003-03-25 08:44
把PLX的驱动卸载,用你自己的驱动上去,只做下面的几件事情:
1.找到显存的物理地址. 2.80h写0x1c3 3.84h写显存物理地址 4.88h写rdk板子的首地址0x20000000 5.8ch写size:0x1000 6.8ah写0x2000 7.90h写0x0a 8.a8h写3. 现在DMA应该已经启动,屏幕上应该有乱七八糟的东西. 如果还没有DMA传输,估计是见鬼了. 另外昨晚上试了一下,DMA完成后确实没有读到done信号,估计是文档错误,可能是其他的位. |
|
|
16楼#
发布于:2003-03-25 16:22
我是搞硬件的DSP,ARM等,对硬件设备驱动实在是知道的太少.
遇到点问题折磨我好几天了,望多指教. while (pXfer->SequenceTransferDescriptors(&ptd)) { m_PAddr =ptd->td_PhysAddr.LowPart; m_length = ptd->td_Length; } ULONG nTds = pXfer->GetTransferDescriptors(&ptd); for (ULONG ii=0; ii < nTds; ii++) { m_PAddr =ptd[ii].td_PhysAddr.LowPart; m_length = ptd[ii].td_Length; } 在这里是要通过硬件将数据(local bus)写到地址m_PAddr么 写完以后再m_CurrentTransfer->Continue(UseTransferSize); 为什么我执行完上述语句后,PC 就over 了?? 有时能够进入OnDmaReady 那位高手能帮帮我???? |
|
|
17楼#
发布于:2003-03-26 09:29
已经给你回信了。
|
|
18楼#
发布于:2003-03-26 09:54
谢谢回信我不是用PLX9054,
我现在DMA能工作了,就是 再m_CurrentTransfer->Continue(UseTransferSize); 为什么我执行完上述语句后,PC 就over 了; 有时能够进入OnDmaReady |
|
|