static void xemacif_recv_handler(void *arg) { struct xemac_s *xemac = (struct xemac_s *)(arg); xemacliteif_s *xemacliteif = (xemacliteif_s *)(xemac->state); XEmacLite *instance = xemacliteif->instance; struct pbuf *p; int len = 0; struct xtopology_t *xtopologyp = &xtopology[xemac->topology_index]; #if XLWIP_CONFIG_INCLUDE_EMACLITE_ON_ZYNQ == 1 #else XIntc_AckIntr(xtopologyp->intc_baseaddr, 1 << xtopologyp->intc_emac_intr); #endif p = pbuf_alloc(PBUF_RAW, XEL_MAX_FRAME_SIZE, PBUF_POOL); if (!p) { #if LINK_STATS lwip_stats.link.memerr++; lwip_stats.link.drop++; #endif /* receive and just ignore the frame. * we need to receive the frame because otherwise emaclite will * not generate any other interrupts since it cannot receive, * and we do not actively poll the emaclite */ XEmacLite_Recv(instance, xemac_tx_frame); return; } /* receive the packet */ len = XEmacLite_Recv(instance, p->payload); if (len == 0) { #if LINK_STATS lwip_stats.link.drop++; #endif pbuf_free(p); return; } /* store it in the receive queue, where it'll be processed by xemacif input thread */ if (pq_enqueue(xemacliteif->recv_q, (void*)p) < 0) { #if LINK_STATS lwip_stats.link.memerr++; lwip_stats.link.drop++; #endif pbuf_free(p); return; } #if !NO_SYS sys_sem_signal(&xemac->sem_rx_data_available); #endif }
/** * * 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; } } }
// // This function is called when a packet has been received. It's job is // to prepare to unload the packet from the hardware. Once the length of // the packet is known, the upper layer of the driver can be told. When // the upper layer is ready to unload the packet, the internal function // 'emaclite_recv' will be called to actually fetch it from the hardware. // static void emaclite_RxEvent(void *_cb) { struct eth_drv_sc *sc = (struct eth_drv_sc *)_cb; struct emaclite_info *qi = (struct emaclite_info *)sc->driver_private; cyg_uint32 len; len = (cyg_uint32)XEmacLite_Recv(&qi->dev, qi->rxbuf); if(len > 0) { qi->rxlength = len; (sc->funs->eth_drv->recv)(sc, qi->rxlength); } }
static void prvRxHandler( void *pvNetIf ) { /* This is taken from lwIP example code and therefore does not conform to the FreeRTOS coding standard. */ struct eth_hdr *pxHeader; struct pbuf *p; unsigned short usInputLength; static unsigned char ucBuffer[ 1520 ] __attribute__((aligned(32))); extern portBASE_TYPE xInsideISR; struct netif *pxNetIf = ( struct netif * ) pvNetIf; XIntc_AckIntr( XPAR_ETHERNET_LITE_BASEADDR, XPAR_ETHERNET_LITE_IP2INTC_IRPT_MASK ); /* Ensure the pbuf handling functions don't attempt to use critical sections. */ xInsideISR++; usInputLength = ( long ) XEmacLite_Recv( &xEMACInstance, ucBuffer ); /* move received packet into a new pbuf */ p = prvLowLevelInput( ucBuffer, usInputLength ); /* no packet could be read, silently ignore this */ if( p != NULL ) { /* points to packet payload, which starts with an Ethernet header */ pxHeader = p->payload; switch( htons( pxHeader->type ) ) { /* IP or ARP packet? */ case ETHTYPE_IP: case ETHTYPE_ARP: /* full packet send to tcpip_thread to process */ if( pxNetIf->input( p, pxNetIf ) != ERR_OK ) { LWIP_DEBUGF(NETIF_DEBUG, ( "ethernetif_input: IP input error\n" ) ); pbuf_free(p); p = NULL; } break; default: pbuf_free( p ); p = NULL; break; } } xInsideISR--; }
/*-----------------------------------------------------------*/ 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"); } }
/** * * This function handles the receive callback from the EmacLite driver. * * @param CallBackRef is the call back reference provided to the Handler. * * @return None. * * @note None. * ******************************************************************************/ static void EmacLiteRecvHandler(void *CallBackRef) { XEmacLite *XEmacInstancePtr; /* * Convert the argument to something useful. */ XEmacInstancePtr = (XEmacLite *)CallBackRef; /* * Handle the Receive callback. */ RecvFrameLength = XEmacLite_Recv(XEmacInstancePtr, (u8 *)RxFrame); }
/** * * This function handles the receive callback from the EmacLite driver. * * @param CallBackRef is the call back refernce provided to the Handler. * * @return None. * * @note None. * ******************************************************************************/ static void EmacLiteRecvHandler(void *CallBackRef) { XEmacLite *EmacLiteInstPtr; /* * Convert the arg to something useful. */ EmacLiteInstPtr = (XEmacLite *)CallBackRef; /* * Handle the Receive callback. */ XEmacLite_Recv(EmacLiteInstPtr, (Xuint8 *)RxFrame); }
/** * * 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; }
/** * * 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; }
int main() { static XIntc intc; Xil_ICacheEnable(); Xil_DCacheEnable(); xil_printf("Testing UART output.\r\n"); // Camera DMA Configuration XAxiDma_Config *dmaconf = XAxiDma_LookupConfig(XPAR_AXI_DMA_0_DEVICE_ID); XAxiDma dma; XAxiDma_CfgInitialize(&dma, dmaconf); XAxiDma_Resume(&dma); XAxiDma_Reset(&dma); while(!XAxiDma_ResetIsDone(&dma)); // Initialize Video InitVideo(); // Example camera DMA read // Note - transfer MUST be 4096B // Data format is 20-bit pixel number (stored in a 32 bit integer) followed by 16-bit RGB values // This will not work until you implement camera_stream.v. // (or at least, until you have it barely working) //int resdde = XAxiDma_SimpleTransfer(&dma, (u32)((unsigned char*)&camera), 4096, XAXIDMA_DEVICE_TO_DMA); //while(XAxiDma_Busy(&dma,XAXIDMA_DEVICE_TO_DMA)); int Status; XEmacLite *EmacLiteInstPtr = &EmacLiteInstance; u32 PhyAddress = 0; RecvFrameLength = 0; XEmacLite_Config *ConfigPtr; /* * Initialize the EmacLite device. */ ConfigPtr = XEmacLite_LookupConfig(XPAR_ETHERNET_LITE_DEVICE_ID); 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; } /* * Reset the receive frame length to zero. */ RecvFrameLength = 0; // Example program that sends packets and changes the color of an on-screen box upon receiving a packet. unsigned char c = 0; unsigned char r=0xFF, g=0x0, b=0x0; while(1) { c++; if(XEmacLite_IsTxDone(ConfigPtr->BaseAddress)) { Status = EmacLiteSendFrame(EmacLiteInstPtr, EMACLITE_TEST_FRAME_SIZE); if (Status != XST_SUCCESS) { if (XEmacLite_IsMdioConfigured(EmacLiteInstPtr)) { return XST_FAILURE; } } } else { RecvFrameLength = XEmacLite_Recv(EmacLiteInstPtr, (u8 *)RxFrame); if (RecvFrameLength > 0) { xil_printf("Received a packet!\r\n"); unsigned char oldr = r; r=g; g=b; b=oldr; } // Example of writing data to the screen int x, y; for (x = 0; x < 20; x++) for (y = 0; y < 20; y++) if (t[y*20 + x]) { fptr[y*640*4 + x*4] = b; fptr[y*640*4 + x*4 + 1] = g; fptr[y*640*4 + x*4 + 2] = r; } } } Xil_DCacheDisable(); Xil_ICacheDisable(); return 0; }