Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /***************************** Include Files *********************************/
- #include "xaxidma.h"
- #include "xparameters.h"
- #include "xdebug.h"
- #include "sleep.h"
- #if defined(XPAR_UARTNS550_0_BASEADDR)
- #include "xuartns550_l.h" /* to use uartns550 */
- #endif
- /******************** Constant Definitions **********************************/
- /*
- * Device hardware build related constants.
- */
- #define DMA_DEV_ID XPAR_AXIDMA_0_DEVICE_ID
- #ifdef XPAR_AXI_7SDDR_0_S_AXI_BASEADDR
- #define DDR_BASE_ADDR XPAR_AXI_7SDDR_0_S_AXI_BASEADDR
- #elif defined (XPAR_MIG7SERIES_0_BASEADDR)
- #define DDR_BASE_ADDR XPAR_MIG7SERIES_0_BASEADDR
- #elif defined (XPAR_MIG_0_C0_DDR4_MEMORY_MAP_BASEADDR)
- #define DDR_BASE_ADDR XPAR_MIG_0_C0_DDR4_MEMORY_MAP_BASEADDR
- #elif defined (XPAR_PSU_DDR_0_S_AXI_BASEADDR)
- #define DDR_BASE_ADDR XPAR_PSU_DDR_0_S_AXI_BASEADDR
- #endif
- #ifndef DDR_BASE_ADDR
- #warning CHECK FOR THE VALID DDR ADDRESS IN XPARAMETERS.H, \
- DEFAULT SET TO 0x01000000
- #define MEM_BASE_ADDR 0x01000000
- #else
- #define MEM_BASE_ADDR (DDR_BASE_ADDR + 0x1000000)
- #endif
- #define TX_BUFFER_BASE (MEM_BASE_ADDR + 0x00100000)
- #define RX_BUFFER_BASE (MEM_BASE_ADDR + 0x00300000)
- #define RX_BUFFER_HIGH (MEM_BASE_ADDR + 0x004FFFFF)
- #define MAX_PKT_LEN 1024
- #define TEST_START_VALUE 0xC
- #define NUMBER_OF_TRANSFERS 1
- #define POLL_TIMEOUT_COUNTER 1000000U
- /**************************** Type Definitions *******************************/
- /***************** Macros (Inline Functions) Definitions *********************/
- /************************** Function Prototypes ******************************/
- #if (!defined(DEBUG))
- extern void xil_printf(const char *format, ...);
- #endif
- int XAxiDma_SimplePollExample(u16 DeviceId);
- static int CheckData(void);
- /************************** Variable Definitions *****************************/
- /*
- * Device instance definitions
- */
- XAxiDma AxiDma;
- /*****************************************************************************/
- /**
- * The entry point for this example. It invokes the example function,
- * and reports the execution status.
- *
- * @param None.
- *
- * @return
- * - XST_SUCCESS if example finishes successfully
- * - XST_FAILURE if example fails.
- *
- * @note None.
- *
- ******************************************************************************/
- int main()
- {
- int Status;
- xil_printf("\r\n--- Entering main() --- \r\n");
- /* Run the poll example for simple transfer */
- Status = XAxiDma_SimplePollExample(DMA_DEV_ID);
- if (Status != XST_SUCCESS) {
- xil_printf("XAxiDma_SimplePoll Example Failed\r\n");
- return XST_FAILURE;
- }
- xil_printf("Successfully ran XAxiDma_SimplePoll Example\r\n");
- xil_printf("--- Exiting main() --- \r\n");
- return XST_SUCCESS;
- }
- #if defined(XPAR_UARTNS550_0_BASEADDR)
- /*****************************************************************************/
- /*
- *
- * Uart16550 setup routine, need to set baudrate to 9600, and data bits to 8
- *
- * @param None.
- *
- * @return None
- *
- * @note None.
- *
- ******************************************************************************/
- static void Uart550_Setup(void)
- {
- /* Set the baudrate to be predictable
- */
- XUartNs550_SetBaud(XPAR_UARTNS550_0_BASEADDR,
- XPAR_XUARTNS550_CLOCK_HZ, 9600);
- XUartNs550_SetLineControlReg(XPAR_UARTNS550_0_BASEADDR,
- XUN_LCR_8_DATA_BITS);
- }
- #endif
- /*****************************************************************************/
- /**
- * The example to do the simple transfer through polling. The constant
- * NUMBER_OF_TRANSFERS defines how many times a simple transfer is repeated.
- *
- * @param DeviceId is the Device Id of the XAxiDma instance
- *
- * @return
- * - XST_SUCCESS if example finishes successfully
- * - XST_FAILURE if error occurs
- *
- * @note None
- *
- *
- ******************************************************************************/
- int XAxiDma_SimplePollExample(u16 DeviceId)
- {
- XAxiDma_Config *CfgPtr;
- int Status;
- int Tries = NUMBER_OF_TRANSFERS;
- int Index;
- u8 *TxBufferPtr;
- u8 *RxBufferPtr;
- u8 Value;
- int TimeOut = POLL_TIMEOUT_COUNTER;
- TxBufferPtr = (u8 *)TX_BUFFER_BASE ;
- RxBufferPtr = (u8 *)RX_BUFFER_BASE;
- /* Initialize the XAxiDma device.
- */
- CfgPtr = XAxiDma_LookupConfig(DeviceId);
- if (!CfgPtr) {
- xil_printf("No config found for %d\r\n", DeviceId);
- return XST_FAILURE;
- }
- Status = XAxiDma_CfgInitialize(&AxiDma, CfgPtr);
- if (Status != XST_SUCCESS) {
- xil_printf("Initialization failed %d\r\n", Status);
- return XST_FAILURE;
- }
- if(XAxiDma_HasSg(&AxiDma)){
- xil_printf("Device configured as SG mode \r\n");
- return XST_FAILURE;
- }
- /* Disable interrupts, we use polling mode
- */
- XAxiDma_IntrDisable(&AxiDma, XAXIDMA_IRQ_ALL_MASK,
- XAXIDMA_DEVICE_TO_DMA);
- XAxiDma_IntrDisable(&AxiDma, XAXIDMA_IRQ_ALL_MASK,
- XAXIDMA_DMA_TO_DEVICE);
- Value = TEST_START_VALUE;
- for(Index = 0; Index < MAX_PKT_LEN; Index ++) {
- TxBufferPtr[Index] = Value;
- Value = (Value + 1) & 0xFF;
- }
- /* Flush the buffers before the DMA transfer, in case the Data Cache
- * is enabled
- */
- Xil_DCacheFlushRange((UINTPTR)TxBufferPtr, MAX_PKT_LEN);
- Xil_DCacheFlushRange((UINTPTR)RxBufferPtr, MAX_PKT_LEN);
- for(Index = 0; Index < Tries; Index ++) {
- Status = XAxiDma_SimpleTransfer(&AxiDma,(UINTPTR) RxBufferPtr,
- MAX_PKT_LEN, XAXIDMA_DEVICE_TO_DMA);
- if (Status != XST_SUCCESS) {
- return XST_FAILURE;
- }
- Status = XAxiDma_SimpleTransfer(&AxiDma,(UINTPTR) TxBufferPtr,
- MAX_PKT_LEN, XAXIDMA_DMA_TO_DEVICE);
- if (Status != XST_SUCCESS) {
- return XST_FAILURE;
- }
- /*Wait till tranfer is done or 1usec * 10^6 iterations of timeout occurs*/
- while (TimeOut) {
- if (!(XAxiDma_Busy(&AxiDma,XAXIDMA_DEVICE_TO_DMA)) &&
- !(XAxiDma_Busy(&AxiDma,XAXIDMA_DMA_TO_DEVICE)))
- break;
- TimeOut--;
- //usleep(1U);
- }
- //Status = CheckData();
- //if (Status != XST_SUCCESS) {
- //return XST_FAILURE;
- //}
- }
- /* Test finishes successfully
- */
- return XST_SUCCESS;
- }
- /*****************************************************************************/
- /*
- *
- * This function checks data buffer after the DMA transfer is finished.
- *
- * @param None
- *
- * @return
- * - XST_SUCCESS if validation is successful.
- * - XST_FAILURE otherwise.
- *
- * @note None.
- *
- ******************************************************************************/
- static int CheckData(void)
- {
- u8 *RxPacket;
- int Index = 0;
- u8 Value;
- RxPacket = (u8 *) RX_BUFFER_BASE;
- Value = TEST_START_VALUE;
- /* Invalidate the DestBuffer before receiving the data, in case the
- * Data Cache is enabled
- */
- Xil_DCacheInvalidateRange((UINTPTR)RxPacket, MAX_PKT_LEN);
- for(Index = 0; Index < MAX_PKT_LEN; Index++) {
- if (RxPacket[Index] != Value) {
- xil_printf("Data error %d: %x/%x\r\n",
- Index, (unsigned int)RxPacket[Index],
- (unsigned int)Value);
- return XST_FAILURE;
- }
- Value = (Value + 1) & 0xFF;
- }
- return XST_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement