//***************************************************************************** // //! Sets up the Ping Pong mode of transfer //! //! \param ulChannel. DMA Channel to be used //! \param pvSrcBuf1.Pointer to the Source Buffer for Primary Control Structure //! \param pvDstBuf1.Pointer to the Destination Buffer for Primary Structure //! \param pvSrcBuf2.Pointer to the Source Buffer for alternate Control Structure //! \param pvDstBuf2. Pointer to the Destination Buffer for alternate Structure //! \param size. Total size to be transferred. //! //! This function //! 1. Configures the uDMA channel //! //! \return None. // //***************************************************************************** void UDMASetupPingPongTransfer(unsigned long ulChannel, void *pvSrcBuf1, void *pvDstBuf1, void *pvSrcBuf2, void *pvDstBuf2, unsigned long size) { SetupTransfer(ulChannel, UDMA_MODE_PINGPONG, size, UDMA_SIZE_8, UDMA_ARB_8, pvSrcBuf1, UDMA_SRC_INC_8, pvDstBuf1, UDMA_DST_INC_8); SetupTransfer(ulChannel|UDMA_ALT_SELECT, UDMA_MODE_PINGPONG, size, UDMA_SIZE_8, UDMA_ARB_8, pvSrcBuf2, UDMA_SRC_INC_8, pvDstBuf2, UDMA_DST_INC_8); }
void spi_transfer(uint8_t* tx, uint8_t* rx) { MAP_SPIDisable(GSPI_BASE); SetupTransfer(UDMA_CH30_GSPI_RX,UDMA_MODE_BASIC,DMA_SIZE, UDMA_SIZE_8,UDMA_ARB_1, (void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE, rx,UDMA_DST_INC_8); SetupTransfer(UDMA_CH31_GSPI_TX,UDMA_MODE_BASIC,DMA_SIZE, UDMA_SIZE_8,UDMA_ARB_1, tx,UDMA_SRC_INC_8, (void *)(GSPI_BASE + MCSPI_O_TX0),UDMA_DST_INC_NONE); MAP_SPIEnable(GSPI_BASE); }
static void DMATransceive( bool bPowerEn, unsigned char ucZoom, unsigned char ucGain, unsigned char ucLine, unsigned char* pSndBuf, // 发送缓冲区 unsigned char* pRcvBuf // 接收缓冲区 ) { // 准备发送的命令 unsigned short usCommand = 0x0000; if (bPowerEn) usCommand |= 0x8000; usCommand |= (ucZoom & 0x03) << 6; //usCommand |= (ucGain & 0x3F); usCommand |= (ucGain & 0x7E) >> 1; usCommand |= (ucLine & 0x7F) << 8; //usCommand = 0x3F80; unsigned char ucL = (usCommand & 0x00FF); unsigned char ucH = ((usCommand & 0xFF00) >> 8); for (int i=0;i<20;i++) { pSndBuf[i*2] = ucL; pSndBuf[i*2+1] = ucH; } //TRACE("0x%x -- 0x%x\r\n",usCommand,ucLine); // 启动DMA SetupTransfer(UDMA_CH31_GSPI_TX , UDMA_MODE_BASIC, 512, UDMA_SIZE_8, UDMA_ARB_1, (void *)pSndBuf, UDMA_SRC_INC_8, (void *)(GSPI_BASE+MCSPI_O_TX0), UDMA_DST_INC_NONE); SetupTransfer(UDMA_CH30_GSPI_RX , UDMA_MODE_BASIC, 512, UDMA_SIZE_8, UDMA_ARB_1, (void *)(GSPI_BASE+MCSPI_O_RX0), UDMA_SRC_INC_NONE, (void *)pRcvBuf, UDMA_DST_INC_8); MAP_SPIDmaEnable(GSPI_BASE, SPI_RX_DMA | SPI_TX_DMA); }
//***************************************************************************** // //! Sets up the Auto Memory transfer //! //! \param ulChannel. DMA Channel to be used //! \param pvSrcBuf. Pointer to the source buffer //! \param pvDstBuf. Pointer to the destination buffer //! \param size. Items to be transfered //! //! This function //! 1. Configures the uDMA channel //! //! \return None. // //***************************************************************************** void UDMASetupAutoMemTransfer(unsigned long ulChannel, void *pvSrcBuf, void *pvDstBuf, unsigned long size) { SetupTransfer(ulChannel, UDMA_MODE_AUTO, size, UDMA_SIZE_8, UDMA_ARB_8, pvSrcBuf, UDMA_SRC_INC_8, pvDstBuf, UDMA_DST_INC_8); }
/** * The example to do the scatter gather transfer through polling. * * @param DeviceId is the Device Id of the XAxiCdma instance * * @return * - XST_SUCCESS if example finishes successfully * - XST_FAILURE if error occurs * * @note None * ******************************************************************************/ int XAxiCdma_SgPollExample(u16 DeviceId) { XAxiCdma_Config *CfgPtr; int Status; u8 *SrcPtr; u8 *DstPtr; SrcPtr = (u8 *)TransmitBufferPtr; DstPtr = (u8 *)ReceiveBufferPtr; #ifdef __aarch64__ Xil_SetTlbAttributes(BD_SPACE_BASE, MARK_UNCACHEABLE); #endif /* Initialize the XAxiCdma device. */ CfgPtr = XAxiCdma_LookupConfig(DeviceId); if (!CfgPtr) { xdbg_printf(XDBG_DEBUG_ERROR, "Cannot find config structure for device %d\r\n", XPAR_AXICDMA_0_DEVICE_ID); return XST_FAILURE; } Status = XAxiCdma_CfgInitialize(&AxiCdmaInstance, CfgPtr, CfgPtr->BaseAddress); if (Status != XST_SUCCESS) { xdbg_printf(XDBG_DEBUG_ERROR, "Initialization failed with %d\r\n", Status); return XST_FAILURE; } /* Setup the BD ring */ Status = SetupTransfer(&AxiCdmaInstance); if (Status != XST_SUCCESS) { xdbg_printf(XDBG_DEBUG_ERROR, "Setup BD ring failed with %d\r\n", Status); return XST_FAILURE; } Done = 0; Error = 0; /* Start the DMA transfer */ Status = DoTransfer(&AxiCdmaInstance); if (Status != XST_SUCCESS) { xdbg_printf(XDBG_DEBUG_ERROR, "Do transfer failed with %d\r\n", Status); return XST_FAILURE; } /* Wait until the DMA transfer is done or error occurs */ while ((CheckCompletion(&AxiCdmaInstance) < NUMBER_OF_BDS_TO_TRANSFER) && !Error) { /* Wait */ } if(Error) { int TimeOut = RESET_LOOP_COUNT; xdbg_printf(XDBG_DEBUG_ERROR, "Transfer has error %x\r\n", Error); /* Need to reset the hardware to restore to the correct state */ XAxiCdma_Reset(&AxiCdmaInstance); while (TimeOut) { if (XAxiCdma_ResetIsDone(&AxiCdmaInstance)) { break; } TimeOut -= 1; } /* Reset has failed, print a message to notify the user */ if (!TimeOut) { xdbg_printf(XDBG_DEBUG_ERROR, "Reset hardware failed with %d\r\n", Status); } return XST_FAILURE; } /* Transfer completed successfully, check data */ Status = CheckData(SrcPtr, DstPtr, MAX_PKT_LEN * NUMBER_OF_BDS_TO_TRANSFER); if (Status != XST_SUCCESS) { xdbg_printf(XDBG_DEBUG_ERROR, "Check data failed for sg " "transfer\r\n"); return XST_FAILURE; } /* Test finishes successfully, return successfully */ return XST_SUCCESS; }
int XAxiCdma_SgIntrExample(XScuGic *IntcInstancePtr, XAxiCdma *InstancePtr, u16 DeviceId,u32 IntrId) #endif { XAxiCdma_Config *CfgPtr; int Status; u8 *SrcPtr; u8 *DstPtr; SrcPtr = (u8 *)TransmitBufferPtr; DstPtr = (u8 *)ReceiveBufferPtr; #ifdef __aarch64__ Xil_SetTlbAttributes(BD_SPACE_BASE, MARK_UNCACHEABLE); #endif /* Initialize the XAxiCdma device. */ CfgPtr = XAxiCdma_LookupConfig(DeviceId); if (!CfgPtr) { xdbg_printf(XDBG_DEBUG_ERROR, "Cannot find config structure for device %d\r\n", XPAR_AXICDMA_0_DEVICE_ID); return XST_FAILURE; } Status = XAxiCdma_CfgInitialize(InstancePtr, CfgPtr, CfgPtr->BaseAddress); if (Status != XST_SUCCESS) { xdbg_printf(XDBG_DEBUG_ERROR, "Initialization failed with %d\r\n", Status); return XST_FAILURE; } /* Setup the BD ring */ Status = SetupTransfer(InstancePtr); if (Status != XST_SUCCESS) { xdbg_printf(XDBG_DEBUG_ERROR, "Setup BD ring failed with %d\r\n", Status); return XST_FAILURE; } /* Setup the interrupt system */ Status = SetupIntrSystem(IntcInstancePtr, InstancePtr, IntrId); if (Status != XST_SUCCESS) { xdbg_printf(XDBG_DEBUG_ERROR, "Setup Intr system failed with %d\r\n", Status); return XST_FAILURE; } /* Enable completion and error interrupts */ XAxiCdma_IntrEnable(InstancePtr, XAXICDMA_XR_IRQ_ALL_MASK); /* Start the DMA transfer */ Status = DoTransfer(InstancePtr); if (Status != XST_SUCCESS) { xdbg_printf(XDBG_DEBUG_ERROR, "Do transfer failed with %d\r\n", Status); return XST_FAILURE; } /* Wait until the DMA transfer is done */ while ((Done < NUMBER_OF_BDS_TO_TRANSFER) && !Error) { /* Wait */ } if(Error) { xdbg_printf(XDBG_DEBUG_ERROR, "Transfer has error %x\r\n", (unsigned int)XAxiCdma_GetError(InstancePtr)); DisableIntrSystem(IntcInstancePtr, IntrId); return XST_FAILURE; } /* Transfer completes successfully, check data */ Status = CheckData(SrcPtr, DstPtr, MAX_PKT_LEN * NUMBER_OF_BDS_TO_TRANSFER); if (Status != XST_SUCCESS) { xdbg_printf(XDBG_DEBUG_ERROR, "Check data failed for sg " "transfer\r\n"); DisableIntrSystem(IntcInstancePtr, IntrId); return XST_FAILURE; } /* Test finishes successfully, clean up and return */ DisableIntrSystem(IntcInstancePtr, IntrId); return XST_SUCCESS; }
void main() { // // Initailizing the board // BoardInit(); bRxDone = false; // // Initialize uDMA // UDMAInit(); // // Muxing for Enabling UART_TX and UART_RX. // PinMuxConfig(); // // Register interrupt handler for UART // MAP_UARTIntRegister(UARTA0_BASE,UARTIntHandler); // // Enable DMA done interrupts for uart // MAP_UARTIntEnable(UARTA0_BASE,UART_INT_DMARX); // // Initialising the Terminal. // MAP_UARTConfigSetExpClk(CONSOLE,MAP_PRCMPeripheralClockGet(CONSOLE_PERIPH), UART_BAUD_RATE, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE)); // // Clear terminal // ClearTerm(); // // Display Banner // DisplayBanner(APP_NAME); Message("\t\t****************************************************\n\r"); Message("\t\t Type in a string of 8 characters, the characters \n\r"); Message("\t\t will not be displayed on the terminal until \n\r"); Message("\t\t 8th character is entered.\n\r") ; Message("\t\t****************************************************\n\r"); Message("\n\n\n\r"); // // Set the message // Message("Type in 8 characters:"); // // Configure the UART Tx and Rx FIFO level to 1/8 i.e 2 characters // UARTFIFOLevelSet(UARTA0_BASE,UART_FIFO_TX1_8,UART_FIFO_RX1_8); // // Setup DMA transfer for UART A0 // SetupTransfer(UDMA_CH8_UARTA0_RX, UDMA_MODE_BASIC, 8, UDMA_SIZE_8, UDMA_ARB_2, (void *)(UARTA0_BASE+UART_O_DR), UDMA_SRC_INC_NONE, (void *)BannerText, UDMA_DST_INC_8); // // Enable DMA request from UART // MAP_UARTDMAEnable(UARTA0_BASE,UART_DMA_RX); while(!bRxDone) { } // // Setup DMA transfer for UART A0 // SetupTransfer(UDMA_CH9_UARTA0_TX, UDMA_MODE_BASIC, 8, UDMA_SIZE_8, UDMA_ARB_2, (void *)BannerText, UDMA_SRC_INC_8, (void *)(UARTA0_BASE+UART_O_DR), UDMA_DST_INC_NONE); MAP_UARTDMAEnable(UARTA0_BASE,UART_DMA_TX); while(1) { // // Inifite loop // } }