/** * * This function transmits one packet non-blockingly through the DMA engine. * * @param AxiDmaInstPtr points to the DMA engine instance * * @return - XST_SUCCESS if the DMA accepts the packet successfully, * - XST_FAILURE otherwise. * * @note None. * ******************************************************************************/ static int SendPacket(XAxiDma * AxiDmaInstPtr,int c) { XAxiDma_BdRing *TxRingPtr; //TxRing cplx_data_t *TxPacket; //PacketPointer //cplx_data_t *RxClean; //CleanData Do in RxSetup XAxiDma_Bd *BdPtr; //Start BDPointer int Status; int Index; char str[30]; TxRingPtr = XAxiDma_GetTxRing(AxiDmaInstPtr); TxPacket = (cplx_data_t *)stim_buf; //setPointerForPacket /* Flush the SrcBuffer before the DMA transfer, in case the Data Cache * is enabled */ Xil_DCacheFlushRange((u32)TxPacket, MAX_PKT_LEN*64); //8 point each packet int FreeBdCount = XAxiDma_BdRingGetFreeCnt(TxRingPtr); xil_printf("TxFreeBdCount %d", FreeBdCount); /* Allocate a BD */ Status = XAxiDma_BdRingAlloc(TxRingPtr, 32, &BdPtr); if (Status != XST_SUCCESS) { return XST_FAILURE; } xil_printf("check1"); XAxiDma_Bd *BdCurPtr; u32 TxBufferPtr; BdCurPtr = BdPtr; // Set Current BDptr TxBufferPtr = (u32)stim_buf; for (Index = 0; Index < 32; Index++) { Status = XAxiDma_BdSetBufAddr(BdCurPtr, TxBufferPtr); if (Status != XST_SUCCESS) { xil_printf("Tx set buffer addr %x on BD %x failed %d\r\n", (unsigned int)TxBufferPtr, (unsigned int)BdCurPtr, Status); return XST_FAILURE; } Status = XAxiDma_BdSetLength(BdCurPtr, MAX_PKT_LEN*4, TxRingPtr->MaxTransferLen); if (Status != XST_SUCCESS) { xil_printf("Tx set length %d on BD %x failed %d\r\n", MAX_PKT_LEN*4, (unsigned int)BdCurPtr, Status); return XST_FAILURE; } #if (XPAR_AXIDMA_0_SG_INCLUDE_STSCNTRL_STRM == 1) Status = XAxiDma_BdSetAppWord(BdCurPtr, XAXIDMA_LAST_APPWORD, MAX_PKT_LEN*2); /* If Set app length failed, it is not fatal */ if (Status != XST_SUCCESS) { xil_printf("Set app word failed with %d\r\n", Status); } #endif /* For single packet, both SOF and EOF are to be set */ XAxiDma_BdSetCtrl(BdCurPtr, XAXIDMA_BD_CTRL_TXEOF_MASK | XAXIDMA_BD_CTRL_TXSOF_MASK); XAxiDma_BdSetId(BdCurPtr, (u32) TxBufferPtr); TxBufferPtr += MAX_PKT_LEN*4; BdCurPtr = XAxiDma_BdRingNext(TxRingPtr, BdCurPtr); } /* Give the BD to DMA to kick off the transmission. */ Status = XAxiDma_BdRingToHw(TxRingPtr, 32, BdPtr); if (Status != XST_SUCCESS) { xil_printf("to hw failed %d\r\n", Status); return XST_FAILURE; } return XST_SUCCESS; }
/** * * This function transmits one packet non-blockingly through the DMA engine. * * @param AxiDmaInstPtr points to the DMA engine instance * * @return - XST_SUCCESS if the DMA accepts the packet successfully, * - XST_FAILURE otherwise. * * @note None. * ******************************************************************************/ static int SendPacket(XAxiDma * AxiDmaInstPtr) { XAxiDma_BdRing *TxRingPtr; u8 *TxPacket; u8 Value; XAxiDma_Bd *BdPtr; int Status; int Index; TxRingPtr = XAxiDma_GetTxRing(AxiDmaInstPtr); /* Create pattern in the packet to transmit */ TxPacket = (u8 *) Packet; Value = TEST_START_VALUE; for(Index = 0; Index < MAX_PKT_LEN; Index ++) { TxPacket[Index] = Value; Value = (Value + 1) & 0xFF; } /* Flush the SrcBuffer before the DMA transfer, in case the Data Cache * is enabled */ Xil_DCacheFlushRange((u32)TxPacket, MAX_PKT_LEN); /* Allocate a BD */ Status = XAxiDma_BdRingAlloc(TxRingPtr, 1, &BdPtr); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* Set up the BD using the information of the packet to transmit */ Status = XAxiDma_BdSetBufAddr(BdPtr, (u32) Packet); if (Status != XST_SUCCESS) { xil_printf("Tx set buffer addr %x on BD %x failed %d\r\n", (unsigned int)Packet, (unsigned int)BdPtr, Status); return XST_FAILURE; } Status = XAxiDma_BdSetLength(BdPtr, MAX_PKT_LEN, TxRingPtr->MaxTransferLen); if (Status != XST_SUCCESS) { xil_printf("Tx set length %d on BD %x failed %d\r\n", MAX_PKT_LEN, (unsigned int)BdPtr, Status); return XST_FAILURE; } #if (XPAR_AXIDMA_0_SG_INCLUDE_STSCNTRL_STRM == 1) Status = XAxiDma_BdSetAppWord(BdPtr, XAXIDMA_LAST_APPWORD, MAX_PKT_LEN); /* If Set app length failed, it is not fatal */ if (Status != XST_SUCCESS) { xil_printf("Set app word failed with %d\r\n", Status); } #endif /* For single packet, both SOF and EOF are to be set */ XAxiDma_BdSetCtrl(BdPtr, XAXIDMA_BD_CTRL_TXEOF_MASK | XAXIDMA_BD_CTRL_TXSOF_MASK); XAxiDma_BdSetId(BdPtr, (u32) Packet); /* Give the BD to DMA to kick off the transmission. */ Status = XAxiDma_BdRingToHw(TxRingPtr, 1, BdPtr); if (Status != XST_SUCCESS) { xil_printf("to hw failed %d\r\n", Status); return XST_FAILURE; } return XST_SUCCESS; }