power_lei
驱动小牛
驱动小牛
  • 注册日期2002-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1573回复:14

关于9054的DMA驱动问题

楼主#
更多 发布于:2003-03-13 13:26
我使用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。
请各位专家给个提示。

最新喜欢:

yuri69yuri69
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-03-13 18:46
我使用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。
请各位专家给个提示。

 

我也在用DS做DMA,不过我是做的NT式的ISA总线的,我也在郁闷就是下不了手,你的这段程序,我感觉,存在这点毛病,不知道你是否仔细看了DS的帮助,关于KDmaTransfer的初始化和构造函数,m_CurrentTransfer = new(NonPagedPool) KDmaTransfer(this, &m_Dma);
你的传输对象用的构造函数用的是第一种形式,那么你的初始化函数就得相应的用它的非扩展形式,而你的初始化函数用的是扩展形式,和DS的帮助中说的不一致!你改一下,试试!
祝你好运!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
power_lei
驱动小牛
驱动小牛
  • 注册日期2002-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-03-14 14:17
两种形式我都实验过了,都会出现错误,另外,我想请教楼上的一下,怎么样把外部物理地址和取的字节书直接设置好。也就是说,这些信息放在那里?

我现在考虑,可能是我的内存空间设置有问题,谢谢。
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-03-14 14:26
两种形式我都实验过了,都会出现错误,另外,我想请教楼上的一下,怎么样把外部物理地址和取的字节书直接设置好。也就是说,这些信息放在那里?

我现在考虑,可能是我的内存空间设置有问题,谢谢。


我感觉你把我说的那个改掉后还出现问题的话,应该不是在这里了,看看你的适配器对象的的定义和初始化是不是有什么毛病,跟踪一下程序,看程序在什么地方停下来。
    关于外部物理地址和取的字节数在什么地方设置,我也没想好呢,我现在在看DS的那个关于DMA的例子,是关于PCI的总线主的例子,对你应当很有帮助的,你也好好看看,他的StartDma()函数是空的,我认为是不是应当在这里填加写或读设备对象的信息!你说呢,我也不会,大家互相商量一下,你试试,我现在没有硬件,做不了实验,要不在网上交流一下,我的QQ是185240123。
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
yuri69
驱动小牛
驱动小牛
  • 注册日期2002-07-12
  • 最后登录2005-12-31
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-03-18 11:28
关注中!

我不会停止对你的思念,就像呼吸一样,我不去特意的想,但是,只能屏息,而不可能停止
power_lei
驱动小牛
驱动小牛
  • 注册日期2002-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-03-18 14:51
没有人这样写吗?
那谁能给点提示:DMA的MEMORY地址如何分配和得到?如何再映射到用户地址?
谢谢!!
bigbuffalo
驱动牛犊
驱动牛犊
  • 注册日期2002-10-25
  • 最后登录2007-06-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-03-19 11:22
关注
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-03-19 13:21
[quote]没有人这样写吗?
那谁能给点提示:DMA的MEMORY地址如何分配和得到?如何再映射到用户地址?
谢谢!! [/quote

我觉得DMA的内存地址是不是就是IRP中描述的那个用MDL锁定的那段物理地址??
那么用通用缓冲区的话,应该好象不是这个,是驱动从新另分配的一个核心虚拟地址!
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
power_lei
驱动小牛
驱动小牛
  • 注册日期2002-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-03-19 16:32
对,你说的对,我用的是KDMACOMMONBUFFER
power_lei
驱动小牛
驱动小牛
  • 注册日期2002-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-03-20 10:57
现在问题出在了kdmacommonbuffer上,我在初始化的时候,他跳入kadapter.h,然后就出问题了.
我在初始化KDMAADAPTER时,用的是
m_Dma.Initialize(&dd, m_Lower.TopOfStack());
这种用法有用吗?
power_lei
驱动小牛
驱动小牛
  • 注册日期2002-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-03-20 10:58
sorry!
是问这句话有问题吗?
power_lei
驱动小牛
驱动小牛
  • 注册日期2002-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-03-21 21:39
对于KDMAADAPTER和KDMATRANSFER的初始化有什么特殊的要求?
Sunbeam
驱动小牛
驱动小牛
  • 注册日期2001-10-29
  • 最后登录2010-01-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-03-23 12:09
哈哈, power_lei你手上不是有PLX的源代码吗?在它上面做做改动,比你在DS上开发更快,可能更稳定。
堂堂正正做人,明明白白做事
power_lei
驱动小牛
驱动小牛
  • 注册日期2002-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-03-23 14:29
我一直用的是DRIVERWORKS,不是很懂DDK,再者,自己开发的,总比别人的东西用的得心应手些,呵呵.

上面的问题已经基本解决.谢谢.
tiangj
驱动牛犊
驱动牛犊
  • 注册日期2002-07-25
  • 最后登录2006-04-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-03-25 16:27
power_lei

高手帮帮我
tianguojun@eyou.com
游客

返回顶部