/** * This function should be called when a packet is ready to be read * from the interface. It uses the function low_level_input() that * should handle the actual reception of bytes from the network * interface. Then the type of the received packet is determined and * the appropriate input function is called. * * @param netif the lwip network interface structure for this ethernetif */ static void ethernetif_input(struct netif *netif) { struct eth_hdr *ethhdr; struct pbuf *p; EMAC_IntCmd(EMAC_INT_RX_DONE, ENABLE); for (;;) { sys_sem_wait(&sem_recv); /* no packet could be read, silently ignore this */ while ((p = low_level_input(netif)) != NULL) { /* points to packet payload, which starts with an Ethernet header */ ethhdr = p->payload; switch (htons(ethhdr->type)) { /* IP or ARP packet? */ case ETHTYPE_IP: case ETHTYPE_ARP: #if PPPOE_SUPPORT /* PPPoE packet? */ case ETHTYPE_PPPOEDISC: case ETHTYPE_PPPOE: #endif /* PPPOE_SUPPORT */ /* full packet send to tcpip_thread to process */ if (netif->input(p, netif)!=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; } } EMAC_IntCmd(EMAC_INT_RX_DONE, ENABLE); } }
int _EMAC_IntCmd(uint8_t * args) { uint8_t * arg_ptr; uint32_t ulIntType; FunctionalState NewState; if ((arg_ptr = (uint8_t *) strtok(NULL, " ")) == NULL) return 1; ulIntType = (uint32_t) strtoul((char *) arg_ptr, NULL, 16); if ((arg_ptr = (uint8_t *) strtok(NULL, " ")) == NULL) return 1; NewState = (FunctionalState) strtoul((char *) arg_ptr, NULL, 16); EMAC_IntCmd(ulIntType, NewState); return 0; }
/** * User EMAC initialization */ void Usr_Init_Emac(void) { /* EMAC configuration type */ EMAC_CFG_Type Emac_Config; /* pin configuration */ PINSEL_CFG_Type PinCfg; uint32_t i; /* * Enable P1 Ethernet Pins: * P1.0 - ENET_TXD0 * P1.1 - ENET_TXD1 * P1.4 - ENET_TX_EN * P1.8 - ENET_CRS * P1.9 - ENET_RXD0 * P1.10 - ENET_RXD1 * P1.14 - ENET_RX_ER * P1.15 - ENET_REF_CLK * P1.16 - ENET_MDC * P1.17 - ENET_MDIO */ PinCfg.Funcnum = 1; PinCfg.OpenDrain = 0; PinCfg.Pinmode = 0; PinCfg.Portnum = 1; PinCfg.Pinnum = 0; PINSEL_ConfigPin(&PinCfg); PinCfg.Pinnum = 1; PINSEL_ConfigPin(&PinCfg); PinCfg.Pinnum = 4; PINSEL_ConfigPin(&PinCfg); PinCfg.Pinnum = 8; PINSEL_ConfigPin(&PinCfg); PinCfg.Pinnum = 9; PINSEL_ConfigPin(&PinCfg); PinCfg.Pinnum = 10; PINSEL_ConfigPin(&PinCfg); PinCfg.Pinnum = 14; PINSEL_ConfigPin(&PinCfg); PinCfg.Pinnum = 15; PINSEL_ConfigPin(&PinCfg); PinCfg.Pinnum = 16; PINSEL_ConfigPin(&PinCfg); PinCfg.Pinnum = 17; PINSEL_ConfigPin(&PinCfg); _DBG_("Init EMAC module"); sprintf(db_,"MAC[1..6] addr: %X-%X-%X-%X-%X-%X \n\r", \ EMACAddr[0], EMACAddr[1], EMACAddr[2], \ EMACAddr[3], EMACAddr[4], EMACAddr[5]); DB; Emac_Config.Mode = EMAC_MODE_AUTO; Emac_Config.pbEMAC_Addr = EMACAddr; // Initialize EMAC module with given parameter while (EMAC_Init(&Emac_Config) == ERROR){ // Delay for a while then continue initializing EMAC module _DBG_("Error during initializing EMAC, restart after a while"); for (i = 0x100000; i; i--); } _DBG_("Setup callback functions"); // Setup callback functions EMAC_SetupIntCBS(EMAC_INT_RX_OVERRUN, RxOverrun_UsrCBS); EMAC_SetupIntCBS(EMAC_INT_RX_ERR, RxError_UsrCBS); EMAC_SetupIntCBS(EMAC_INT_RX_FIN, RxFinish_UsrCBS); EMAC_SetupIntCBS(EMAC_INT_RX_DONE, RxDone_UsrCBS); EMAC_SetupIntCBS(EMAC_INT_TX_UNDERRUN, TxUnderrun_UsrCBS); EMAC_SetupIntCBS(EMAC_INT_TX_ERR, TxError_UsrCBS); EMAC_SetupIntCBS(EMAC_INT_TX_FIN, TxFinish_UsrCBS); EMAC_SetupIntCBS(EMAC_INT_TX_DONE, TxDone_UsrCBS); #if ENABLE_WOL EMAC_SetupIntCBS(EMAC_INT_WAKEUP, WoL_UsrCBS); #endif // Enable all interrupt EMAC_IntCmd((EMAC_INT_RX_OVERRUN | EMAC_INT_RX_ERR | EMAC_INT_RX_FIN \ | EMAC_INT_RX_DONE | EMAC_INT_TX_UNDERRUN | EMAC_INT_TX_ERR \ | EMAC_INT_TX_FIN | EMAC_INT_TX_DONE), ENABLE); NVIC_SetPriority(ENET_IRQn, 0); NVIC_EnableIRQ(ENET_IRQn); _DBG_("Initialize EMAC complete"); }
void ethernetif_frame_ready() { EMAC_IntCmd(EMAC_INT_RX_DONE, DISABLE); if (sys_sem_valid(&sem_recv)) sys_sem_signal(&sem_recv); }