/*-----------------------------------------------------------*/ static void prvRxTask( void *pvParameters ) { char Recdstring[15] = ""; int i; int Status; u32 prev_btns = 0; /* Print the received data. */ xil_printf( "Rx task starting.\r\n"); for( ;; ) { RecvFrameLength = 0; /* * Poll for receive packet. */ while ((volatile u32)RecvFrameLength == 0) { vTaskDelay(1); u32 btns = XGpio_DiscreteRead(&gpio_btns, 1); if (btns != prev_btns) { xil_printf("btns=%d\r\n", btns); if (btns == 1) { /* send a frame */ xil_printf( "Rx emac: sending a frame\r\n"); Status = EmacLiteSendFrame(&emac, 128); if (Status != XST_SUCCESS) { xil_printf( "Rx emac: send frame fail\r\n"); } } prev_btns = btns; } RecvFrameLength = XEmacLite_Recv(&emac, (u8 *)RxFrame); } xil_printf( "Rx emac: frame recv, len=%d\r\n", RecvFrameLength); /* * Check the received frame. */ Status = EmacLiteRecvFrame(128); if ((Status != XST_SUCCESS) && (Status != XST_NO_DATA)) { xil_printf( "Rx emac: frame rx check no success\r\n"); } for (i = 0; i < RecvFrameLength; ++i) { xil_printf("%02x:", RxFrame[i]); } xil_printf("\r\n"); } }
/** * * The main entry point for the EmacLite driver example in polled mode. * * This function will transmit/receive the Ethernet frames and verify the * data in the received frame (if the MDIO interface is configured in the * EmacLite core). * This function simply transmits a frame if the MDIO interface is not * configured in the EmacLite core. * * @param DeviceId is device ID of the XEmacLite Device , typically * XPAR_<EMAC_instance>_DEVICE_ID value from xparameters.h. * * @return XST_SUCCESS to indicate success, XST_FAILURE otherwise. * * @note None. * ******************************************************************************/ int EmacLitePolledExample(u16 DeviceId) { int Status; XEmacLite *EmacLiteInstPtr = &EmacLiteInstance; u32 PhyAddress = 0; RecvFrameLength = 0; XEmacLite_Config *ConfigPtr; /* * 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, LocalAddress); /* * Empty any existing receive frames. */ XEmacLite_FlushReceive(EmacLiteInstPtr); /* * Check if there is a TX buffer available, if there isn't it is an * error. */ if (XEmacLite_TxBufferAvailable(EmacLiteInstPtr) != TRUE) { return XST_FAILURE; } /* * If the MDIO is configured in the device. */ if (XEmacLite_IsMdioConfigured(EmacLiteInstPtr)) { /* * Detect the PHY device and enable the MAC Loop back * in the PHY. */ PhyAddress = EmacLitePhyDetect(EmacLiteInstPtr); Status = EmacLiteEnablePhyLoopBack(EmacLiteInstPtr, PhyAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } } /* * Reset the receive frame length to zero. */ RecvFrameLength = 0; Status = EmacLiteSendFrame(EmacLiteInstPtr, EMACLITE_TEST_FRAME_SIZE); if (Status != XST_SUCCESS) { if (XEmacLite_IsMdioConfigured(EmacLiteInstPtr)) { /* * Disable the MAC Loop back in the PHY. */ EmacLiteDisablePhyLoopBack(EmacLiteInstPtr, PhyAddress); return XST_FAILURE; } } /* * If the MDIO is not configured in the core then return XST_SUCCESS * as the frame has been transmitted. */ if (!XEmacLite_IsMdioConfigured(EmacLiteInstPtr)) { return XST_SUCCESS; } /* * Poll for receive packet. */ while ((volatile u32)RecvFrameLength == 0) { RecvFrameLength = XEmacLite_Recv(EmacLiteInstPtr, (u8 *)RxFrame); } /* * Check the received frame. */ Status = EmacLiteRecvFrame(EMACLITE_TEST_FRAME_SIZE); if ((Status != XST_SUCCESS) && (Status != XST_NO_DATA)) { /* * Disable the MAC Loop back in the PHY. */ EmacLiteDisablePhyLoopBack(EmacLiteInstPtr, PhyAddress); return XST_FAILURE; } /* * Disable the MAC Loop back in the PHY. */ EmacLiteDisablePhyLoopBack(EmacLiteInstPtr, PhyAddress); return XST_SUCCESS; }
/** * * The main entry point for the EmacLite driver in interrupt mode example. * This function will transmit/receive the frame using internal loop back and * verify the data in the received frame. * * @param DeviceId is device ID of the XEmacLite Device , typically * XPAR_<EMAC_instance>_DEVICE_ID value from xparameters.h. * * @return XST_SUCCESS to indicate success, otherwise XST_FAILURE. * * @note None. * ******************************************************************************/ int EmacLiteIntrLoopbackExample(u16 DeviceId) { int Status; XIntc *IntcInstancePtr; XEmacLite *EmacLiteInstPtr; u32 TxLength; XEmacLite_Config *ConfigPtr; RecvFrameLength = 0; IntcInstancePtr = &IntcInstance; EmacLiteInstPtr =&EmacLiteInstance; /* * 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, LocalAddress); /* * Set up the interrupt infrastructure. */ Status = EmacLiteSetupIntrSystem(IntcInstancePtr, EmacLiteInstPtr, INTC_EMACLITE_ID); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Setup the EmacLite handlers. */ XEmacLite_SetRecvHandler((EmacLiteInstPtr), (void *)(EmacLiteInstPtr), (XEmacLite_Handler)EmacLiteRecvHandler); XEmacLite_SetSendHandler((EmacLiteInstPtr), (void *)(EmacLiteInstPtr), (XEmacLite_Handler)EmacLiteSendHandler); /* * Empty any existing receive frames. */ XEmacLite_FlushReceive(EmacLiteInstPtr); /* * Enable the EmacLite interrupts. */ XEmacLite_EnableInterrupts(EmacLiteInstPtr); /* * Check if there is a Tx buffer available. */ if (XEmacLite_TxBufferAvailable(EmacLiteInstPtr) != TRUE) { return XST_FAILURE; } /* * Enable internal loop back. */ XEmacLite_EnableLoopBack(EmacLiteInstPtr); /* * Send/Receive frames of varying sizes and verify the data in the * received frames. */ for (TxLength = 1; TxLength <= XEL_MTU_SIZE; ) { RecvFrameLength = 0; /* * Send a frame. */ Status = EmacLiteSendFrame(EmacLiteInstPtr, TxLength); if (Status != XST_SUCCESS) { /* * Disable internal loop back. */ XEmacLite_DisableLoopBack(EmacLiteInstPtr); return XST_FAILURE; } /* * Wait for the frame to be transmitted and received back. * As the core is in loopback the transmit interrupt and the * receive interrupt occur simulataneously. */ while ((RecvFrameLength == 0) && (TransmitComplete == FALSE)); /* * Check the receive frame. */ Status = EmacLiteRecvFrame(TxLength++); if ((Status != XST_SUCCESS) && (Status != XST_NO_DATA)) { /* * Disable internal loop back. */ XEmacLite_DisableLoopBack(EmacLiteInstPtr); /* * Disable and disconnect the EmacLite Interrupts. */ XEmacLite_DisableInterrupts(EmacLiteInstPtr); EmacLiteDisableIntrSystem(IntcInstancePtr, INTC_EMACLITE_ID); return XST_FAILURE; } } /* * Disable internal loop back. */ XEmacLite_DisableLoopBack(EmacLiteInstPtr); /* * Disable and disconnect the EmacLite Interrupts. */ XEmacLite_DisableInterrupts(EmacLiteInstPtr); EmacLiteDisableIntrSystem(IntcInstancePtr, INTC_EMACLITE_ID); return XST_SUCCESS; }
/** * * The main entry point for the EmacLite driver example in interrupt mode. * This function will transmit/receive the Ethernet frames and verify the * data in the received frame (if the MDIO interface is configured in the * EmacLite core). * This function simply transmits a frame if the MDIO interface is not * configured in the EmacLite core. * * @param IntcInstancePtr is a pointer to the instance of the Intc. * @param EmacLiteInstPtr is a pointer to the instance of the EmacLite. * @param EmacLiteDeviceId is device ID of the XEmacLite Device , * typically XPAR_<EMACLITE_instance>_DEVICE_ID value from * xparameters.h. * @param EmacLiteIntrId is the interrupt ID and is typically * XPAR_<INTC_instance>_<EMACLITE_instance>_VEC_ID value from * xparameters.h. * * @return XST_SUCCESS if successful, otherwise XST_FAILURE. * * @note None. * ******************************************************************************/ int EmacLiteIntrExample(INTC *IntcInstancePtr, XEmacLite *EmacLiteInstPtr, u16 EmacLiteDeviceId, u16 EmacLiteIntrId) { int Status; u32 PhyAddress = 0; XEmacLite_Config *ConfigPtr; /* * Initialize the EmacLite device. */ ConfigPtr = XEmacLite_LookupConfig(EmacLiteDeviceId); 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, LocalAddress); /* * Empty any existing receive frames. */ XEmacLite_FlushReceive(EmacLiteInstPtr); /* * Check if there is a Tx buffer available, if there isn't it is an * error. */ if (XEmacLite_TxBufferAvailable(EmacLiteInstPtr) != TRUE) { return XST_FAILURE; } /* * Set up the interrupt infrastructure. */ Status = EmacLiteSetupIntrSystem(IntcInstancePtr, EmacLiteInstPtr, EmacLiteIntrId); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Setup the EmacLite handlers. */ XEmacLite_SetRecvHandler((EmacLiteInstPtr), (void *)(EmacLiteInstPtr), (XEmacLite_Handler)EmacLiteRecvHandler); XEmacLite_SetSendHandler((EmacLiteInstPtr), (void *)(EmacLiteInstPtr), (XEmacLite_Handler)EmacLiteSendHandler); /* * Enable the interrupts in the EmacLite controller. */ XEmacLite_EnableInterrupts(EmacLiteInstPtr); RecvFrameLength = 0; /* * If the MDIO is configured in the device. */ if (XEmacLite_IsMdioConfigured(EmacLiteInstPtr)) { /* * Detect the PHY device and enable the MAC Loop back * in the PHY. */ PhyAddress = EmacLitePhyDetect(EmacLiteInstPtr); Status = EmacLiteEnablePhyLoopBack(EmacLiteInstPtr, PhyAddress); if (Status != XST_SUCCESS) { XEmacLite_DisableInterrupts(EmacLiteInstPtr); EmacLiteDisableIntrSystem(IntcInstancePtr, EmacLiteIntrId); return XST_FAILURE; } } /* * Transmit an Ethernet frame. */ Status = EmacLiteSendFrame(EmacLiteInstPtr, EMACLITE_TEST_FRAME_SIZE); if (Status != XST_SUCCESS) { if (XEmacLite_IsMdioConfigured(EmacLiteInstPtr)) { /* * Disable the MAC Loop back in the PHY and * disable/disconnect the EmacLite Interrupts. */ EmacLiteDisablePhyLoopBack(EmacLiteInstPtr, PhyAddress); XEmacLite_DisableInterrupts(EmacLiteInstPtr); EmacLiteDisableIntrSystem(IntcInstancePtr, EmacLiteIntrId); return XST_FAILURE; } } /* * Wait for the frame to be transmitted. */ while (TransmitComplete == FALSE); /* * If the MDIO is not configured in the core then return XST_SUCCESS * as the frame has been transmitted. */ if (!XEmacLite_IsMdioConfigured(EmacLiteInstPtr)) { /* * Disable and disconnect the EmacLite Interrupts. */ XEmacLite_DisableInterrupts(EmacLiteInstPtr); EmacLiteDisableIntrSystem(IntcInstancePtr, EmacLiteIntrId); return XST_SUCCESS; } /* * Wait for the frame to be received. */ while (RecvFrameLength == 0); /* * Check the received frame. */ Status = EmacLiteRecvFrame(EMACLITE_TEST_FRAME_SIZE); /* * Diasble the Loop Back. */ if (XEmacLite_IsMdioConfigured(EmacLiteInstPtr)) { /* * Disable the MAC Loop back in the PHY. */ Status |= EmacLiteDisablePhyLoopBack(EmacLiteInstPtr, PhyAddress); } /* * Disable and disconnect the EmacLite Interrupts. */ XEmacLite_DisableInterrupts(EmacLiteInstPtr); EmacLiteDisableIntrSystem(IntcInstancePtr, EmacLiteIntrId); if ((Status != XST_SUCCESS) && (Status != XST_NO_DATA)) { return XST_FAILURE; } return XST_SUCCESS; }