阅读:1348回复:9
有用过 pci9054dma的分散/集中功能的,可否谈一谈!!20分等着你
有用过 pci9054dma的分散/集中功能的,可否谈一谈!!
|
|
|
沙发#
发布于:2003-04-18 17:01
难道大家都不用分散集中功能吗??
同志们支援一下!!! |
|
|
板凳#
发布于:2003-04-19 12:06
fwzfwz1,我是要调试分散集中模式的DMA,因为在选择模式时,我感觉这种模式比较好用,而且在9054databook里面讲的比较详细,其实,它的本质仍然是块模式的,只是,分散集中把各个块用链表链起来了方便传输!
不知道理解的正确否?多指教! |
|
地板#
发布于:2003-04-21 07:51
谢谢提醒,我一直看得是9080的一本较薄的dateabook,觉得和9054
的差不多,就没有看9054的datebook. |
|
|
地下室#
发布于:2003-04-21 21:52
9054的databook比较多,你要是需要,我可以给你发过去,是E文的,但是感觉写的比较好!
|
|
5楼#
发布于:2003-04-22 11:23
谢谢,9054的datebook我有,一直没仔细看.
|
|
|
6楼#
发布于:2003-04-22 11:28
我看到你已经开始9054的dma的分散集中了,现在分散集中的概念我看了一些,你知不知道9054的分散集中列表怎么建立。
|
|
|
7楼#
发布于:2003-04-22 20:40
我因为使用的是WINDRIVER所以,他有现成的API函数让我调用,他是用链表方式的,如下:
DWORD dwAlignShift, dwPageNumber, dwMemoryCopied; typedef struct { DWORD dwPADR; DWORD dwLADR; DWORD dwSIZ; DWORD dwDPR; } DMA_LIST; DMA_LIST *pList; // dma of more then one page ==> chain dma // includes extra 0x10 bytes for quadword alignment hDma->dmaList.dwBytes = hDma->dma.dwPages * sizeof(DMA_LIST) + 0x10; hDma->dmaList.pUserAddr = NULL; hDma->dmaList.dwOptions = DMA_KERNEL_BUFFER_ALLOC; WD_DMALock (hPlx->hWD, &hDma->dmaList); if (!hDma->dmaList.hDma) { sprintf (P9054_ErrorString, \"Failed allocating the chain buffer!\\n\"); goto Exit; } //setting chain of dma pages in the memory dwMemoryCopied = 0; dwAlignShift = 0x10 - (DWORD) hDma->dmaList.pUserAddr & 0xf; // verification that bits 0-3 are zero (quadword aligned) pList = (DMA_LIST *) ((DWORD) hDma->dmaList.pUserAddr + dwAlignShift); for (dwPageNumber=0; dwPageNumber<hDma->dma.dwPages; dwPageNumber++) { pList[dwPageNumber].dwPADR = (DWORD) hDma->dma.Page[dwPageNumber].pPhysicalAddr; //pList[dwPageNumber].dwLADR = dwLocalAddr + (fAutoinc ? dwMemoryCopied : 0); pList[dwPageNumber].dwLADR = 0x20000000 + (fAutoinc ? dwMemoryCopied : 0); pList[dwPageNumber].dwSIZ = hDma->dma.Page[dwPageNumber].dwBytes; // pList[dwPageNumber].dwDPR = // ((DWORD) hDma->dmaList.Page[0].pPhysicalAddr + dwAlignShift + sizeof(DMA_LIST)*(dwPageNumber+1)) // | BIT0 | (fIsRead ? BIT3 : 0); pList[dwPageNumber].dwDPR = ((DWORD) hDma->dmaList.Page[0].pPhysicalAddr + dwAlignShift + sizeof(DMA_LIST)*(dwPageNumber+1)) |BIT0| (fIsRead ? BIT3 : 0); dwMemoryCopied += hDma->dma.Page[dwPageNumber].dwBytes; } pList[dwPageNumber - 1].dwDPR |= BIT1; // mark end of chain // dwDMAMODE = (fAutoinc ? 0 : BIT11) // | BIT6 // | BIT9 // chain transfer // | (mode==P9054_MODE_BYTE ? 0 : mode==P9054_MODE_WORD ? BIT0 : (BIT1 | BIT0)); dwDMAMODE=0x243; //dwDMADPR = ((DWORD)hDma->dmaList.Page[0].pPhysicalAddr + dwAlignShift) | BIT0; dwDMADPR = ((DWORD)hDma->dmaList.Page[0].pPhysicalAddr + dwAlignShift)|BIT0; // starting the dma P9054_WriteReg (hPlx, P9054_DMAMODE + dwChannelShift, dwDMAMODE); P9054_WriteReg (hPlx, P9054_DMADPR + dwChannelShift, dwDMADPR); } return hDma; 但是现在我调试的时候有点问题,还是没有成功呢,所以,你看看我得设置是不是不对,因为,我申请了内存为1024个长字,每个块大小设为512个,可是结果虽然可以收到DMAISDONE信号,可是只正确读出了SRAM的127个长字,怎么回事? |
|
8楼#
发布于:2003-04-22 22:37
winddriver还是不熟,再加上你的程序不全,所以看得似懂非懂。但是总的来说,所谓的分散集中列表是一个两维数组。第一维表示有多少块连续的物理地址,第二维有四项组成,包括每一块的物理首地址;局部地址;尺寸;及下一个如上四项的地址。
我再用ds试一下,看看这几天有没有结果。 |
|
|
9楼#
发布于:2003-05-11 15:08
请教: zhangyanping !
我也用9054的函数,但在VC++6下包含进去 P9054_LIB.H /C 之后,还没有条用任何函数,编译即出现如下: --------------------Configuration: Mypci - Win32 Debug------Compiling... p9054_lib.c c:\\windrvr\\plx\\9054\\lib\\p9054_lib.c(916) : fatal error C1010: unexpected end of file while looking for precompiled header directive Error executing cl.exe. Mypci.exe - 1 error(s), 0 warning(s) 万分感谢!! |
|
|