阅读:1269回复:17
jst7792,用过pci9054dma的分散集中功能吗
用过pci9054dma的分散集中功能吗,可否指教一二!!
|
|
最新喜欢:jackyw...
|
沙发#
发布于:2003-04-17 12:32
用过,很好用,如果用的好,可以实现些很有趣的功能.
|
|
|
板凳#
发布于:2003-04-17 14:31
这方面我一点资料都没有,可否指点一下看那方面的资料。
或者提供一些参考。 |
|
|
地板#
发布于:2003-04-17 15:52
其实就是一个链表结构,数据手册还有一些驱动的书上都有,没什么特别复杂的,有兴趣的话分析一下PLX的源代码.
|
|
|
地下室#
发布于:2003-04-22 11:42
分散集中时9054的寄存器如何设置,特别是descriper pointer resgister.谢谢!
|
|
|
5楼#
发布于:2003-04-22 14:57
有些记不清了,大概是这样:
根据你要传输的数据缓冲,取得S/G list,然后在内存页中开一块空间,初始化这个描述链表,表的每个单元组成对应于9054的4个相关寄存器(PCI地址,Local地址,传输量,下一描述表地址)最后一个单元需要把下一描述表地址写成0(end of chain).然后启动. |
|
|
6楼#
发布于:2003-04-22 15:42
松涛,你看我得如下理解对不对:
9054的分散集中列表的每一个单元(描述表)必须是如下格式: pci address local address transter size next descriper pointer 这样我采用一个两维数组实现如何,其中第一维表示有几个连续块, 第二维就是如上结构。next descriper pointer的内容为下一个 描述表的地址。我这里用数组存放分散集中列表,故每一个 next descriper pointer的内容差四个双字。还有这里next descriper pointer的内容应为内核虚拟地址吧。 这样将第一个描述表的内容付给9054,并启动之,9054传输完以后, 就可以依次找到其他的描述表,并进行传输。 |
|
|
7楼#
发布于:2003-04-22 16:30
所有地址仍然还应当是物理地址.
存放链表的空间可以选择非分页内存或者是分页内存但一定要锁定. |
|
|
8楼#
发布于:2003-04-23 11:28
松涛,不知你考虑过没有,即使申请一块非分页内存,其物理地址
也是不连续的,这样将其物理地址赋予9054dma 的descriper pionter register 会不会出问题?如果我用commonbuffer来存放分散集中列表,会不会更好? thinks!! |
|
|
9楼#
发布于:2003-04-23 12:21
当然可以,物理不连续的也可以处理,反正是链表结构.
|
|
|
10楼#
发布于:2003-04-23 14:57
我之所以需要连续的物理空间,是因为我想使用数组结构,而不是
链表结构。 |
|
|
11楼#
发布于:2003-04-23 15:08
fwzfwz1,你的二维最后一个变量是 next descriptor address,所以,你其实用的仍然是链表结构!
所以,你可以申请不连续的内存空间,只要启动DMA,这个链表就会自动找到不连续的块,看起来如同它们放在连续的空间一样。 |
|
12楼#
发布于:2003-04-23 20:52
虽然是一个链表结构,但是和一般的链表不一样。我用commombuffer
实现,不用考虑该链表的物理地址不连续。 |
|
|
13楼#
发布于:2003-04-24 14:21
松涛,我用ds编的9054的分散集中dma例程,用户程序一运行就死机。搞了两天了没头绪。本想发过去,让你看看,但是记得你没用过ds.可否将你用ddk做的发过来,一下参考。先谢过了!
|
|
|
14楼#
发布于:2003-04-24 15:55
fwzfwz1,我也是有过这种情况,看一下,你是不是在开始DMA之前进行清中断了,还有局部地址是不是正确,以及描述符指针地址是不是正确!
|
|
15楼#
发布于:2003-04-24 21:33
其实本站上的PLXsdk3.3pro版本里的驱动源代码非常完善,下载下来仔细研究一下就行,我写的9054的代码有些都是拿来小改一下就ok的.他们的代码结构非常清楚,可读性比自己从头写的强多了.
|
|
|
16楼#
发布于:2003-04-25 09:38
谢谢提醒!!!
|
|
|
17楼#
发布于:2003-04-25 09:43
zhangyanping,我是参考windriver里的那一段关于分散集中的例子
实现的。可能还有些细节没搞清楚!think you!! |
|
|