阅读:1573回复:14
关于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。 请各位专家给个提示。 |
|
最新喜欢:![]() |
沙发#
发布于:2003-03-13 18:46
我使用PLX9054-RDK LITE板子,EEPROM中的信息没有做任何操作, 我也在用DS做DMA,不过我是做的NT式的ISA总线的,我也在郁闷就是下不了手,你的这段程序,我感觉,存在这点毛病,不知道你是否仔细看了DS的帮助,关于KDmaTransfer的初始化和构造函数,m_CurrentTransfer = new(NonPagedPool) KDmaTransfer(this, &m_Dma); 你的传输对象用的构造函数用的是第一种形式,那么你的初始化函数就得相应的用它的非扩展形式,而你的初始化函数用的是扩展形式,和DS的帮助中说的不一致!你改一下,试试! 祝你好运! |
|
|
板凳#
发布于:2003-03-14 14:17
两种形式我都实验过了,都会出现错误,另外,我想请教楼上的一下,怎么样把外部物理地址和取的字节书直接设置好。也就是说,这些信息放在那里?
我现在考虑,可能是我的内存空间设置有问题,谢谢。 |
|
地板#
发布于:2003-03-14 14:26
两种形式我都实验过了,都会出现错误,另外,我想请教楼上的一下,怎么样把外部物理地址和取的字节书直接设置好。也就是说,这些信息放在那里? 我感觉你把我说的那个改掉后还出现问题的话,应该不是在这里了,看看你的适配器对象的的定义和初始化是不是有什么毛病,跟踪一下程序,看程序在什么地方停下来。 关于外部物理地址和取的字节数在什么地方设置,我也没想好呢,我现在在看DS的那个关于DMA的例子,是关于PCI的总线主的例子,对你应当很有帮助的,你也好好看看,他的StartDma()函数是空的,我认为是不是应当在这里填加写或读设备对象的信息!你说呢,我也不会,大家互相商量一下,你试试,我现在没有硬件,做不了实验,要不在网上交流一下,我的QQ是185240123。 |
|
|
地下室#
发布于:2003-03-18 11:28
关注中!
|
|
|
5楼#
发布于:2003-03-18 14:51
没有人这样写吗?
那谁能给点提示:DMA的MEMORY地址如何分配和得到?如何再映射到用户地址? 谢谢!! |
|
6楼#
发布于:2003-03-19 11:22
关注
|
|
7楼#
发布于:2003-03-19 13:21
[quote]没有人这样写吗?
那谁能给点提示:DMA的MEMORY地址如何分配和得到?如何再映射到用户地址? 谢谢!! [/quote 我觉得DMA的内存地址是不是就是IRP中描述的那个用MDL锁定的那段物理地址?? 那么用通用缓冲区的话,应该好象不是这个,是驱动从新另分配的一个核心虚拟地址! |
|
|
8楼#
发布于:2003-03-19 16:32
对,你说的对,我用的是KDMACOMMONBUFFER
|
|
9楼#
发布于:2003-03-20 10:57
现在问题出在了kdmacommonbuffer上,我在初始化的时候,他跳入kadapter.h,然后就出问题了.
我在初始化KDMAADAPTER时,用的是 m_Dma.Initialize(&dd, m_Lower.TopOfStack()); 这种用法有用吗? |
|
10楼#
发布于:2003-03-20 10:58
sorry!
是问这句话有问题吗? |
|
11楼#
发布于:2003-03-21 21:39
对于KDMAADAPTER和KDMATRANSFER的初始化有什么特殊的要求?
|
|
12楼#
发布于:2003-03-23 12:09
哈哈, power_lei你手上不是有PLX的源代码吗?在它上面做做改动,比你在DS上开发更快,可能更稳定。
|
|
|
13楼#
发布于:2003-03-23 14:29
我一直用的是DRIVERWORKS,不是很懂DDK,再者,自己开发的,总比别人的东西用的得心应手些,呵呵.
上面的问题已经基本解决.谢谢. |
|
14楼#
发布于:2003-03-25 16:27
power_lei
高手帮帮我 |
|
|