Застрял в API XAxiDma_BdRingFromHw, почему не установлен завершенный бит дескриптора блока S2MM? - PullRequest
0 голосов
/ 05 апреля 2019

Я работаю над Zynq 7z030 и пытаюсь получить данные о DDR со стороны PL. Я использую код опроса AXI DMA SG, предоставленный в качестве примера xilinx на SDK. (xaxidma_example_sg_poll.c)

После настройки DMA -> Настройка канала RX -> Запуск DMA -> Я ввожу API CheckDmaResult. Здесь я вызываю XAxiDma_BdRingFromHw API.

while ((ProcessedBdCount = XAxiDma_BdRingFromHw(RxRingPtr,
                               XAXIDMA_ALL_BDS,
                               &BdPtr)) == 0) {
    }

Этот API вызывает Xil_DCacheInvalidateRange, который возвращает, а затем состояние дескриптора блока остается всегда 0. Таким образом, это приводит к бесконечному циклу XAxiDma_BdRingFromHw. Полный бит никогда не устанавливается. Это происходит, хотя я вижу, что TREADY S2MM поднимается высоко и получает данные в ILA (встроенный логический анализатор на конце FPGA / конце PL)

main
     ....
        Status1 = CheckDmaResult(&AxiDma);
     .....
-> static int CheckDmaResult(XAxiDma * AxiDmaInstPtr)  
....             
 while ((ProcessedBdCount = 
XAxiDma_BdRingFromHw(RxRingPtr,
                               XAXIDMA_ALL_BDS,
                               &BdPtr)) == 0) {
    } 
....
-> XAxiDma_BdRingFromHw(XAxiDma_BdRing * RingPtr, int BdLimit,
                 XAxiDma_Bd ** BdSetPtr)

   ....
      while (BdCount < BdLimit) {
        /* Read the status */
        XAXIDMA_CACHE_INVALIDATE(CurBdPtr);
        BdSts = XAxiDma_BdRead(CurBdPtr, XAXIDMA_BD_STS_OFFSET);
        BdCr = XAxiDma_BdRead(CurBdPtr, XAXIDMA_BD_CTRL_LEN_OFFSET);

        /* If the hardware still hasn't processed this BD then we are
         * done
         */
        if (!(BdSts & XAXIDMA_BD_STS_COMPLETE_MASK)) {
            break;
        }
.....

Может ли кто-нибудь предложить возможные причины или указания, которые я должен рассмотреть, чтобы решить эту проблему ... любое и каждое предложение будет большой помощью. Заранее спасибо!

...