diff --git a/main.c b/main.c index c2068f4..4206632 100644 --- a/main.c +++ b/main.c @@ -79,14 +79,12 @@ int main() { netif_add(&g_netif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input); - + // netif_set_link_callback(&g_netif, link_status_callback); netif_set_default(&g_netif); netif_set_up(&g_netif); dhcp_start(&g_netif); - ethernetif_init(&g_netif); - uint32_t last_led_toggle = 0; uint32_t last_send_time = 0; int led_state = 0; diff --git a/port/ethernetif.c b/port/ethernetif.c index 9659075..29cf070 100644 --- a/port/ethernetif.c +++ b/port/ethernetif.c @@ -75,6 +75,10 @@ void ETH_IRQHandler(void) { g_isr_call_count++; uint8_t flags = ETH10M->EIR; + if (flags & RB_ETH_EIR_RXIF) { + printf("<<< RX Interrupt Fired. EIR=0x%02X >>>>>\n", flags); + } + // tx complete/error if (flags & (RB_ETH_EIR_TXIF | RB_ETH_EIR_TXERIF)) { // release DMA descriptor back to cpu @@ -113,8 +117,8 @@ static void low_level_init(struct netif* netif) { // interrupts ETH10M->EIE = 0; // clear - ETH10M->EIE = RB_ETH_EIE_INTIE | RB_ETH_EIE_RXIE | RB_ETH_EIE_LINKIE | - RB_ETH_EIE_TXIE | RB_ETH_EIE_TXERIE | RB_ETH_EIE_RXERIE; + ETH10M->EIE = RB_ETH_EIE_INTIE | RB_ETH_EIE_LINKIE | RB_ETH_EIE_TXIE | + RB_ETH_EIE_TXERIE | RB_ETH_EIE_RXERIE; ETH10M->EIE |= RB_ETH_EIE_R_EN50; // 50 ohm pull-up ETH10M->EIR = 0xFF; @@ -196,51 +200,52 @@ static err_t low_level_output(struct netif* netif, struct pbuf* p) { return ERR_OK; } -static struct pbuf* low_level_input(struct netif* netif) { +struct pbuf* low_level_input(struct netif* netif) { struct ethernetif* ethernetif = netif->state; struct pbuf *p = NULL, *q; u16_t len; + ETH_DMADESCTypeDef* dmarxdesc; + + if (ETH10M->EIR & RB_ETH_EIR_RXIF) { + dmarxdesc = ethernetif->DMARxDescToGet; - if ((ethernetif->DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == 0) { if (ETH10M->ESTAT & (RB_ETH_ESTAT_BUFER | RB_ETH_ESTAT_RXCRCER)) { - len = 0; // drop packet - // printf("RX ESTAT Error: 0x%02X\n", ETH10M->ESTAT); + len = 0; + printf("HW RX Error ESTAT: 0x%02X\n", (unsigned int)ETH10M->ESTAT); ETH10M->ESTAT |= (RB_ETH_ESTAT_BUFER | RB_ETH_ESTAT_RXCRCER); } else { len = ETH10M->ERXLN; - if (len > 4) { - len -= 4; - } else { - len = 0; - } } - // copy valid packet to pbuf if (len > 0) { p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL); if (p != NULL) { - uint8_t* rx_buffer = (uint8_t*)ethernetif->DMARxDescToGet->Buffer1Addr; + uint8_t* rx_buffer = (uint8_t*)dmarxdesc->Buffer1Addr; uint32_t bytes_copied = 0; for (q = p; q != NULL; q = q->next) { memcpy(q->payload, rx_buffer + bytes_copied, q->len); bytes_copied += q->len; } - MIB2_STATS_NETIF_ADD(netif, ifinoctets, p->tot_len); + printf( + "\n>>> Packet Received (len=%d, MAC len=%d). Copied to LwIP. " + "<<<\n\n", + len, ETH10M->ERXLN); + } else { + printf("pbuf_alloc failed. Dropping packet.\n"); } } - ethernetif->DMARxDescToGet->Status |= ETH_DMARxDesc_OWN; - + dmarxdesc->Status = ETH_DMARxDesc_OWN; ethernetif->DMARxDescToGet = - (ETH_DMADESCTypeDef*)ethernetif->DMARxDescToGet->Buffer2NextDescAddr; + (ETH_DMADESCTypeDef*)dmarxdesc->Buffer2NextDescAddr; - // tell hw where next free buffer is? ETH10M->ERXST = (uint32_t)ethernetif->DMARxDescToGet->Buffer1Addr; + ETH10M->EIR = RB_ETH_EIR_RXIF; - return p; + return p; // return pbuf to LwIP } - return NULL; // no packet + return NULL; // No packet was available. } void ethernetif_input(struct netif* netif) { @@ -290,6 +295,7 @@ err_t ethernetif_init(struct netif* netif) { } void ethernetif_link_poll(struct netif* netif) { + struct ethernetif* ethernetif = netif->state; static uint32_t last_poll_time = 0; uint32_t now = millis(); @@ -305,6 +311,7 @@ void ethernetif_link_poll(struct netif* netif) { if (!netif_is_link_up(netif)) { printf("Link is UP (10M-FD Mode)\n"); + ETH10M->ERXST = (uint32_t)ethernetif->DMARxDescToGet->Buffer1Addr; ETH10M->ECON1 |= RB_ETH_ECON1_RXEN; netif_set_link_up(netif); diff --git a/port/lwipopts.h b/port/lwipopts.h index 050987c..5551785 100644 --- a/port/lwipopts.h +++ b/port/lwipopts.h @@ -4,9 +4,11 @@ #define LWIP_DEBUG 1 #define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL -#define DHCP_DEBUG LWIP_DBG_ON -#define NETIF_DEBUG LWIP_DBG_ON -#define ETHARP_DEBUG LWIP_DBG_ON +#define UDP_DEBUG LWIP_DBG_ON +#define IP_DEBUG LWIP_DBG_ON +#define DHCP_DEBUG LWIP_DBG_ON +#define NETIF_DEBUG LWIP_DBG_ON +#define ETHARP_DEBUG LWIP_DBG_ON #define NO_SYS 1 @@ -40,7 +42,7 @@ // #define CHECKSUM_GEN_UDP 0 // #define CHECKSUM_GEN_TCP 0 // #define CHECKSUM_CHECK_IP 0 -// #define CHECKSUM_CHECK_UDP 0 +#define CHECKSUM_CHECK_UDP 0 // #define CHECKSUM_CHECK_TCP 0 // #define LWIP_CHECKSUM_ON_COPY 1 @@ -50,4 +52,6 @@ // Statistics #define LWIP_STATS 0 +#define LWIP_NETIF_LINK_CALLBACK 1 + #endif /* __LWIPOPTS_H__ */