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

9054的DMA驱动问题

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

最新喜欢:

hapihapi
flying
驱动小牛
驱动小牛
  • 注册日期2002-08-01
  • 最后登录2016-06-19
  • 粉丝0
  • 关注0
  • 积分197分
  • 威望70点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-03-13 19:19
你有PCI9054-RDK板,为什么不直接用PLX提供的驱动和API呢?
power_lei
驱动小牛
驱动小牛
  • 注册日期2002-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-03-14 14:09
自己写的驱动,应用起来才可以得心应手,而且可以简化很多硬件工作,这是软硬件一体化设计的好处。

仁兄可以给点提示吗?
power_lei
驱动小牛
驱动小牛
  • 注册日期2002-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-03-18 14:44
另外,寄存器已经全部配置正确。
tiangj
驱动牛犊
驱动牛犊
  • 注册日期2002-07-25
  • 最后登录2006-04-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-03-19 15:36
power_lei
我遇到的问题和你差不多,我怀疑是根本就没有启动
不知道你现在解决没有
tianguojun@eyou.com
power_lei
驱动小牛
驱动小牛
  • 注册日期2002-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-03-19 16:22
我还没有解决,但是我已经断定是我的驱动程序写的有问题!

可惜不知道问题在那里,给点提示?
tiangj
驱动牛犊
驱动牛犊
  • 注册日期2002-07-25
  • 最后登录2006-04-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-03-19 17:17
DMA能进入中断么?
能给我你的code,我看看行么
tiangj@chinadigipro.com
tianguojun@eyou.com
power_lei
驱动小牛
驱动小牛
  • 注册日期2002-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-03-20 10:41
你是指怎样的中断?
我现在是数据传完,发出中断.

CODE是工程用,实在抱歉.

我的mail:little_lei@sina.com,有问题你就说.
power_lei
驱动小牛
驱动小牛
  • 注册日期2002-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-03-20 11:01
现在问题出在了kcommonbuffer上,我在初始化的时候,他跳入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分
9楼#
发布于:2003-03-21 10:01
大家做卡,难道都用的是PLX的驱动?
tiangj
驱动牛犊
驱动牛犊
  • 注册日期2002-07-25
  • 最后登录2006-04-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-03-21 13:49
DMA物理地址怎么设置
tianguojun@eyou.com
power_lei
驱动小牛
驱动小牛
  • 注册日期2002-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-03-21 18:23
LOCAL ADDRESS是你在PLD中设置好的
PCI ADDRESS是你用回调函数ONDMAREADY()中得到后设置的.
如果你是个I.MDL()
可以直接获得.
tiangj
驱动牛犊
驱动牛犊
  • 注册日期2002-07-25
  • 最后登录2006-04-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-03-21 18:47
我能不能用DMA直接将LOCAL MEMORY的东东传到应用程序
tianguojun@eyou.com
power_lei
驱动小牛
驱动小牛
  • 注册日期2002-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-03-21 21:38
 只能传给IRP,当然,你可以直接用READFILE()来获得。
tiangj
驱动牛犊
驱动牛犊
  • 注册日期2002-07-25
  • 最后登录2006-04-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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,怎么加大???
我渴望你的回答谢谢.

tianguojun@eyou.com
jst7792
论坛版主
论坛版主
  • 注册日期2001-12-10
  • 最后登录2006-11-16
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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信号,估计是文档错误,可能是其他的位.
兄弟们,给点分吧
tiangj
驱动牛犊
驱动牛犊
  • 注册日期2002-07-25
  • 最后登录2006-04-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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
那位高手能帮帮我????
tianguojun@eyou.com
power_lei
驱动小牛
驱动小牛
  • 注册日期2002-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-03-26 09:29
已经给你回信了。
tiangj
驱动牛犊
驱动牛犊
  • 注册日期2002-07-25
  • 最后登录2006-04-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-03-26 09:54
谢谢回信我不是用PLX9054,
我现在DMA能工作了,就是
再m_CurrentTransfer->Continue(UseTransferSize);
为什么我执行完上述语句后,PC 就over 了;
有时能够进入OnDmaReady

 
tianguojun@eyou.com
游客

返回顶部