阅读:3870回复:9
请各位高手看看,vxWorks DMA 问题
我如何分配一段内存供DMA使用,
另外,为什么9054在Win98下可以读写正确 而vxWorks下,读到的数据不对,似乎是32为的数据错位,Big Edian 似乎不对,我该如何解决。谢谢 |
|
沙发#
发布于:2003-08-20 12:36
please in detail!
|
|
板凳#
发布于:2003-08-20 12:42
val32 = sysInLong(base0 + PCI9054_DMA0_MODE);
val32 |= //Demand mode sysOutLong(base0 + PCI9054_DMA0_MODE, val32); sysOutLong(base0 + PCI9054_DMA0_PCI_ADDR,Buffer)); val32 = sysInLong(base0 + PCI9054_SPACE0_REMAP); sysOutLong(base0 + PCI9054_DMA0_LOCAL_ADDR, val32&0xFFFFFFFE); sysOutLong(base0 + PCI9054_DMA0_COUNT,BufferSize); sysOutLong(base0 + PCI9054_DMA0_DESC_PTR, BIT3); val32 = sysInLong(base0 + PCI9054_INT_CTRL_STAT); val32 |= BIT18; sysOutLong(base0 + PCI9054_INT_CTRL_STAT, val32); sysOutLong(base0 + PCI9054_DMA_COMMAND_STAT,BITs) |
|
地板#
发布于:2003-08-20 16:24
这是什么呀?
|
|
|
地下室#
发布于:2003-08-21 20:10
就是说例如我有4k的数据,需要从外面的fifo中通过DMA传输到系统内存
中,我必然需要一段4k的系统内存,这一段系统内存应该不可以被应用 程序占用,但应用程序可以访问。专供dma来写。我想问一问这段内存如何锁定给dma。 另外,vxWorks中什么语句可以引起pci总线一次猝发传输,谢谢 |
|
5楼#
发布于:2003-08-22 08:20
就是说例如我有4k的数据,需要从外面的fifo中通过DMA传输到系统内存 内存应该是在你的驱动里面分配的。关于pci总线的猝发传输,好像不是由什么语句引起的吧,我觉得应该是由你的硬件设备决定的。 |
|
|
6楼#
发布于:2004-09-09 16:18
好象 VXWORKS 只支持 LITTLE 端模式
|
|
7楼#
发布于:2004-09-09 21:27
查看tornado帮助有关cacheLib的内容,可能对你有帮助。
cacheDmaMalloc()分配一块区域,CACHE_DMA_FLUSH刷新该区域,再用CACHE_DMA_VIRT_TO_PHYS把虚地址转换成物理地址,然后直接对这块区域操作,看看能不能行,个人愚见。 |
|
8楼#
发布于:2004-09-12 09:59
cacheDmaMalloc() 就可以了~
沙漠之鹰,如果硬件支持猝发,那就一定是猝发的吗? |
|
|
9楼#
发布于:2004-10-14 21:38
就是说例如我有4k的数据,需要从外面的fifo中通过DMA传输到系统内存 可以通过USER_RESERVED_MEM宏从内存空间的最后保留一块内存专供dma使用。这块内存操作系统不会使用,用户可以通过绝对地址来访问。 至于你说的突发功能,那是pci的功能。而不是vxworks的功能。你见过windows下有引起pci总线突发传输的函数吗?如果你的两次连续地址的pci传输足够快,这个传输就会以突发方式传输。 |
|
|