[X]关闭

MZ7100執行PCIE DMA範例卻一直重複中斷的情況

文档创建者:longlong7822
浏览次数:5156
最后更新:2018-08-30
本帖最后由 longlong7822 于 2018-8-24 10:22 编辑

各位好,小弟將7035中PCIE_DMA_64BIT 這個範例嘗試移植到7100上,編譯沒有問題也燒錄到板子上了,但是在執行DMA Write或是DMA Read時候,上位機的程式一直在重複執行中斷時候的函式,之後我直接將上位機程式中的VIRTEX5_DMAStart()函式給註釋掉,竟然也是會自己產生中斷.....請問有人知道這是什麼情況嗎?

執行影片在這
https://pan.baidu.com/s/13Av-o1wbRou_LXMDxZ7FKA




发表评论已发布 5

菲尼克兔

发表于 2018-8-28 14:42:20 | 显示全部楼层

你好,请问你用的是XInt中断不?
我按照教程做,如果用的是Xint中断+windrv确实会重复进入中断。
如果是MSI的话,应该没有这个问题哈

longlong7822

发表于 2018-8-28 17:42:55 | 显示全部楼层

菲尼克兔 发表于 2018-8-28 14:42
你好,请问你用的是XInt中断不?
我按照教程做,如果用的是Xint中断+windrv确实会重复进入中断。
如果是M ...

您指的是Intx嗎? 是的
您也是用MZ7100的板子嗎? 因為我用MA701就沒有這個問題
如果改成MSI您有試過嗎

菲尼克兔

发表于 2018-8-28 21:33:57 | 显示全部楼层

你好,
我使用的板子是MIA702, 如果你这里说的DMA指的是Xapp1052的实验的话,那么改成MSI就不会有这个问题了。
具体的解释,你可以参考附件的“9.2. Handling Interrupts”  里面讲的非常的清楚。
简单的,对于IntX,这是一个level-trigger的中断,如果没有发出Deassert INTX的话,那么中断会不断的重复进入,主机会hang。
但是对于MSI/X,这是edge-trigger的中断,不会有这个问题。

   你可以在阅读附件“9.2. Handling Interrupts” 之后尝试解决IntX的问题。如果不愿意的话,可以直接用MSI。
另外的,我看了Xapp1052的代码,置位其0x48的bit8 可以让xapp1052的BMD发出Deassert Intx。这个似乎1052的guide上没写,但是代码里有的。
   你不妨尝试一下哈。

菲尼克兔

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

菲尼克兔

发表于 2018-8-29 22:49:20 | 显示全部楼层

你好,
    我对windrv给的代码中的virtex5_lib.c 中的VIRTEX5_IntEnable函数中的相关代码做了一些修改 如下:(主要是参考上面的UG)
    //for intx
        WDC_ADDR_DESC *pAddrDesc;
        WD_TRANSFER trans[1]; /* Array of 1 WinDriver transfer command structures */
        BZERO(trans);
        pAddrDesc = WDC_GET_ADDR_DESC(hDev, 0);
        trans[0].cmdTrans = WM_DWORD;
        trans[0].dwPort = pAddrDesc->kptAddr+0x48;
        trans[0].Data.Dword = 0x100;
dwStatus = WDC_IntEnable(hDev, &trans, 1, 0, VIRTEX5_IntHandler,
        (PVOID)pDev, WDC_IS_KP(hDev));
    你可以尝试一下。
菲尼克兔

longlong7822

发表于 2018-8-30 15:36:50 | 显示全部楼层

菲尼克兔 发表于 2018-8-29 22:49
你好,
    我对windrv给的代码中的virtex5_lib.c 中的VIRTEX5_IntEnable函数中的相关代码做了一些修改 如 ...

我試了你的代碼,有發現dma write不會再重複了但是在dma read會重複2次才停止,所以我修改了代碼便解決這問題
    //for intx
   WDC_ADDR_DESC *pAddrDesc;
   WD_TRANSFER trans[3]; // Array of 1 WinDriver transfer command structures
   BZERO(trans);
   pAddrDesc = WDC_GET_ADDR_DESC(hDev, 0);
   trans[0].cmdTrans = RM_DWORD;
   trans[0].dwPort = pAddrDesc->kptAddr + 0x04;

   trans[1].cmdTrans = CMD_MASK;
   trans[1].Data.Dword = (pDevCtx->fIsRead)? 0x810000: 0x101;

   trans[2].cmdTrans = WM_DWORD;
   trans[2].dwPort = pAddrDesc->kptAddr + 0x48;
   trans[2].Data.Dword = 0x100;

  dwStatus = WDC_IntEnable(hDev, &trans, 3, 0, VIRTEX5_IntHandler, (PVOID)pDev, WDC_IS_KP(hDev));

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则