fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:1349回复:9

有用过 pci9054dma的分散/集中功能的,可否谈一谈!!20分等着你

楼主#
更多 发布于:2003-04-17 12:09
有用过 pci9054dma的分散/集中功能的,可否谈一谈!!
有了驱动,人才有了力量。
fengli_long
驱动牛犊
驱动牛犊
  • 注册日期2003-03-22
  • 最后登录2003-06-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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)

万分感谢!!



雅芳
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-04-22 22:37
winddriver还是不熟,再加上你的程序不全,所以看得似懂非懂。但是总的来说,所谓的分散集中列表是一个两维数组。第一维表示有多少块连续的物理地址,第二维有四项组成,包括每一块的物理首地址;局部地址;尺寸;及下一个如上四项的地址。
我再用ds试一下,看看这几天有没有结果。
有了驱动,人才有了力量。
zhangyanping
驱动小牛
驱动小牛
  • 注册日期2003-02-23
  • 最后登录2004-07-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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个长字,怎么回事?
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-04-22 11:28
我看到你已经开始9054的dma的分散集中了,现在分散集中的概念我看了一些,你知不知道9054的分散集中列表怎么建立。
有了驱动,人才有了力量。
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-04-22 11:23
谢谢,9054的datebook我有,一直没仔细看.
有了驱动,人才有了力量。
zhangyanping
驱动小牛
驱动小牛
  • 注册日期2003-02-23
  • 最后登录2004-07-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-04-21 21:52
9054的databook比较多,你要是需要,我可以给你发过去,是E文的,但是感觉写的比较好!
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-04-21 07:51
谢谢提醒,我一直看得是9080的一本较薄的dateabook,觉得和9054
的差不多,就没有看9054的datebook.
有了驱动,人才有了力量。
zhangyanping
驱动小牛
驱动小牛
  • 注册日期2003-02-23
  • 最后登录2004-07-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-04-19 12:06
fwzfwz1,我是要调试分散集中模式的DMA,因为在选择模式时,我感觉这种模式比较好用,而且在9054databook里面讲的比较详细,其实,它的本质仍然是块模式的,只是,分散集中把各个块用链表链起来了方便传输!

不知道理解的正确否?多指教!
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-04-18 17:01
难道大家都不用分散集中功能吗??
同志们支援一下!!!
有了驱动,人才有了力量。
游客

返回顶部