void displayGame() { frameIndex = frame_gameScreen; if (XST_FAILURE == XAxiVdma_StartParking(&videoDMAController, frameIndex, XAXIVDMA_READ)) { xil_printf("vdma parking failed\n\r"); } }
int StartParking(int writeFrame, int readFrame, int output) { if (output) xil_printf("\r\nStarting parking..."); int Status = XST_SUCCESS; //XAxiVdma_DmaStop(&AxiVdma, XAXIVDMA_WRITE); Status = XAxiVdma_StartParking(&AxiVdma, writeFrame, XAXIVDMA_WRITE); // Park write on frame 2 (to stop writing to frame 0) Status &= XAxiVdma_StartParking(&AxiVdma, readFrame, XAXIVDMA_READ); // Park read on frame 0 (output should be frozen) if (Status != XST_SUCCESS) { xil_printf( "Start Write transfer failed %d\r\n", Status); return XST_FAILURE; } if (output) xil_printf("done"); return Status; }
void initVideo() { init_platform(); // Necessary for all programs. int Status; // Keep track of success/failure of system function calls. // There are 3 steps to initializing the vdma driver and IP. // Step 1: lookup the memory structure that is used to access the vdma driver. XAxiVdma_Config * VideoDMAConfig = XAxiVdma_LookupConfig( XPAR_AXI_VDMA_0_DEVICE_ID); // Step 2: Initialize the memory structure and the hardware. if (XST_FAILURE == XAxiVdma_CfgInitialize(&videoDMAController, VideoDMAConfig, XPAR_AXI_VDMA_0_BASEADDR)) { xil_printf("VideoDMA Did not initialize.\r\n"); } // Step 3: (optional) set the frame store number. if (XST_FAILURE == XAxiVdma_SetFrmStore(&videoDMAController, 2, XAXIVDMA_READ)) { xil_printf("Set Frame Store Failed."); } // Initialization is complete at this point. // Setup the frame counter. We want two read frames. We don't need any write frames but the // function generates an error if you set the write frame count to 0. We set it to 2 // but ignore it because we don't need a write channel at all. XAxiVdma_FrameCounter myFrameConfig; myFrameConfig.ReadFrameCount = 2; myFrameConfig.ReadDelayTimerCount = 10; myFrameConfig.WriteFrameCount = 2; myFrameConfig.WriteDelayTimerCount = 10; Status = XAxiVdma_SetFrameCounter(&videoDMAController, &myFrameConfig); if (Status != XST_SUCCESS) { xil_printf("Set frame counter failed %d\r\n", Status); if (Status == XST_VDMA_MISMATCH_ERROR) xil_printf("DMA Mismatch Error\r\n"); } // Now we tell the driver about the geometry of our frame buffer and a few other things. // Our image is 480 x 640. XAxiVdma_DmaSetup myFrameBuffer; myFrameBuffer.VertSizeInput = 480; // 480 vertical pixels. myFrameBuffer.HoriSizeInput = 640 * 4; // 640 horizontal (32-bit pixels). myFrameBuffer.Stride = 640 * 4; // Dont' worry about the rest of the values. myFrameBuffer.FrameDelay = 0; myFrameBuffer.EnableCircularBuf = 1; myFrameBuffer.EnableSync = 0; myFrameBuffer.PointNum = 0; myFrameBuffer.EnableFrameCounter = 0; myFrameBuffer.FixedFrameStoreAddr = 0; if (XST_FAILURE == XAxiVdma_DmaConfig(&videoDMAController, XAXIVDMA_READ, &myFrameBuffer)) { xil_printf("DMA Config Failed\r\n"); } // We need to give the frame buffer pointers to the memory that it will use. This memory // is where you will write your video data. The vdma IP/driver then streams it to the HDMI // IP. myFrameBuffer.FrameStoreStartAddr[0] = FRAME_BUFFER_ADDR; myFrameBuffer.FrameStoreStartAddr[1] = FRAME_BUFFER_ADDR + 4*640*480; if (XST_FAILURE == XAxiVdma_DmaSetBufferAddr(&videoDMAController, XAXIVDMA_READ, myFrameBuffer.FrameStoreStartAddr)) { xil_printf("DMA Set Address Failed Failed\r\n"); } // Print a sanity message if you get this far. xil_printf("Woohoo! I made it through initialization.\n\r"); // Now, let's get ready to start displaying some stuff on the screen. // The variables framePointer and framePointer1 are just pointers to the base address // of frame 0 and frame 1. // This tells the HDMI controller the resolution of your display (there must be a better way to do this). XIo_Out32(XPAR_AXI_HDMI_0_BASEADDR, 640*480); // Start the DMA for the read channel only. if (XST_FAILURE == XAxiVdma_DmaStart(&videoDMAController, XAXIVDMA_READ)) { xil_printf("DMA START FAILED\r\n"); } // We have two frames, let's park on frame 0. Use frameIndex to index them. // Note that you have to start the DMA process before parking on a frame. if (XST_FAILURE == XAxiVdma_StartParking(&videoDMAController, frameIndex, XAXIVDMA_READ)) { xil_printf("vdma parking failed\n\r"); } }