/** * * The entry point for the EmacLite Ping reply example in polled mode. * * @param DeviceId is device ID of the XEmacLite Device. * * @return XST_FAILURE to indicate failure, otherwise XST_SUCCESS is * returned. * * @note This is in a continuous loop generating a specified number of * ping replies as defined by MAX_PING_REPLIES. * ******************************************************************************/ int EmacLitePingReplyExample(u16 DeviceId) { int Status; XEmacLite *EmacLiteInstPtr = &EmacLiteInstance; XEmacLite_Config *ConfigPtr; NumOfPingReplies = 0; /* * Initialize the EmacLite device. */ ConfigPtr = XEmacLite_LookupConfig(DeviceId); if (ConfigPtr == NULL) { return XST_FAILURE; } Status = XEmacLite_CfgInitialize(EmacLiteInstPtr, ConfigPtr, ConfigPtr->BaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Set the MAC address. */ XEmacLite_SetMacAddress(EmacLiteInstPtr, LocalMacAddr); /* * Empty any existing receive frames. */ XEmacLite_FlushReceive(EmacLiteInstPtr); while (1) { /* * Wait for a Receive packet. */ while (RecvFrameLength == 0) { RecvFrameLength = XEmacLite_Recv(EmacLiteInstPtr, (u8 *)RxFrame); } /* * Process the Receive frame. */ ProcessRecvFrame(EmacLiteInstPtr); RecvFrameLength = 0; /* * If the number of ping replies sent is equal to that * specified by the user then exit out of this loop. */ if (NumOfPingReplies == MAX_PING_REPLIES) { return XST_SUCCESS; } } }
/** * * The entry point for the EmacLite driver to ping request example in polled * mode. This function will generate specified number of request packets as * defined in "NUM_OF_PING_REQ_PKTS. * * @param DeviceId is device ID of the XEmacLite Device. * * @return XST_FAILURE to indicate failure, otherwise it will return * XST_SUCCESS. * * @note None. * ******************************************************************************/ static int EmacLitePingReqExample(u16 DeviceId) { int Status; int Index; int Count; int EchoReplyStatus; XEmacLite_Config *ConfigPtr; XEmacLite *EmacLiteInstPtr = &EmacLiteInstance; SeqNum = 0; RecvFrameLength = 0; EchoReplyStatus = XST_FAILURE; NumOfPingReqPkts = NUM_OF_PING_REQ_PKTS; /* * Initialize the EmacLite device. */ ConfigPtr = XEmacLite_LookupConfig(DeviceId); if (ConfigPtr == NULL) { return XST_FAILURE; } Status = XEmacLite_CfgInitialize(EmacLiteInstPtr, ConfigPtr, ConfigPtr->BaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Set the MAC address. */ XEmacLite_SetMacAddress(EmacLiteInstPtr, LocalMacAddr); /* * Empty any existing receive frames. */ XEmacLite_FlushReceive(EmacLiteInstPtr); while (NumOfPingReqPkts--) { /* * Introduce delay. */ Count = DELAY; while (Count--) { } /* * Send an ARP or an ICMP packet based on receive packet. */ if (SeqNum == 0) { SendArpReqFrame(EmacLiteInstPtr); } else { SendEchoReqFrame(EmacLiteInstPtr); } /* * Check next 10 packets for the correct reply. */ Index = NUM_RX_PACK_CHECK_REQ; while (Index--) { /* * Wait for a Receive packet. */ Count = NUM_PACK_CHECK_RX_PACK; while (RecvFrameLength == 0) { RecvFrameLength = XEmacLite_Recv( EmacLiteInstPtr, (u8 *)RxFrame); /* * To avoid infinite loop when no packet is * received. */ if (Count-- == 0) { break; } } /* * Process the Receive frame. */ if (RecvFrameLength != 0) { EchoReplyStatus = ProcessRecvFrame( EmacLiteInstPtr); } RecvFrameLength = 0; /* * Comes out of loop when an echo reply packet is * received. */ if (EchoReplyStatus == XST_SUCCESS) { break; } } /* * If no echo reply packet is received, it reports * request timed out. */ if (EchoReplyStatus == XST_FAILURE) { xil_printf("Packet No: %d", NUM_OF_PING_REQ_PKTS - NumOfPingReqPkts); xil_printf(" Seq NO %d Request timed out\r\n", SeqNum); } } return XST_SUCCESS; }