void eth_initRegisters() { uint8_t b; uint16_t bb; do { b = enc28j60ReadControl(ESTAT); } while(b & ~ESTAT_CLKRDY); b = enc28j60ReadControl(EREVID); myprintf("revid: 0x%02x\r\n", b); b = 0; // disable CLKOUT enc28j60WriteControlCheck(ECOCON, b); ethNextPacketPtr = RXStart; enc28j60WriteControlWordCheck(ERXSTL, RXStart); enc28j60WriteControlWordCheck(ERXRDPTL, RXStart); enc28j60WriteControlWordCheck(ERXNDL, RXEnd); enc28j60WriteControlWordCheck(ETXSTL, TXStart); /*PrintRegister16("rx st ptr", ERXSTL); PrintRegister16("rx end ptr", ERXNDL); PrintRegister16("rx rd ptr", ERXRDPTL); PrintRegister16("rx wr ptr", ERXWRPTL);*/ // b = enc28j60ReadControl(MACON2); // b &= ~MACON2_MARST; // enc28j60WriteControl(MACON2, b); b = 0; b |= ERXFCON_UCEN | ERXFCON_CRCEN | ERXFCON_BCEN; enc28j60WriteControlCheck(ERXFCON, b); b = enc28j60ReadControl(MACON2); b &= ~MACON2_MARST; enc28j60WriteControlCheck(MACON2, b); b = 0; b |= MACON3_PACDFG0; b |= MACON3_TXCRCEN; b |= MACON3_FRMLNEN; enc28j60WriteControlCheck(MACON3, b); enc28j60WriteControlWordCheck(MAMXFLL, MaxFrameLenRX); enc28j60WriteControlCheck(MABBIPG, 0x12); enc28j60WriteControlCheck(MAIPGL, 0x12); enc28j60WriteControlCheck(MAIPGH, 0x0c); enc28j60WriteControlCheck(MAADR0, _HW_ADDR[5]); enc28j60WriteControlCheck(MAADR1, _HW_ADDR[4]); enc28j60WriteControlCheck(MAADR2, _HW_ADDR[3]); enc28j60WriteControlCheck(MAADR3, _HW_ADDR[2]); enc28j60WriteControlCheck(MAADR4, _HW_ADDR[1]); enc28j60WriteControlCheck(MAADR5, _HW_ADDR[0]); bb = 0; enc28j60WritePhyWordCheck(PHCON1, bb); bb = 0; bb |= PHCON2_HDLDIS; enc28j60WritePhyWordCheck(PHCON2, bb); // LINKIF bb = 0; bb |= PHIE_PGEIE; bb |= PHIE_PLNKIE; enc28j60WritePhyWordCheck(PHIE, bb); bb = enc28j60ReadPhyWord(PHLCON); bb &= ~(PHLCON_LBCFG3 | PHLCON_LBCFG2 | PHLCON_LBCFG1 |PHLCON_LBCFG0); bb |= PHLCON_LBCFG2 | PHLCON_LBCFG1 |PHLCON_LBCFG0; myprintf("%x\r\n", bb); enc28j60WritePhyWordCheck(PHLCON, bb); // Enable Half Duplex enc28j60SetFullDuplex(0); b = enc28j60ReadControl(EFLOCON); myprintf("duplex: %d\r\n", !!(b & 0x04)); // Enable interrupts enc28j60SetBits(EIE, EIE_INTIE | EIE_PKTIE | EIE_LINKIE); b = 0; b |= MACON1_MARXEN; enc28j60WriteControlCheck(MACON1, b); enc28j60SetBits(ECON1, ECON1_RXEN); }
void ethProcess() { static uint32_t lastCheck = 0; if (ticks - lastCheck >= 1000) { lastCheck = ticks; TByteBuffer b; if (ethPrepareBuffer(&b, 2)) { uint16_t type = 0x0000; BYTEBUFFER_APPEND(&b, type); ethSendPacket(&b); ethFreeBuffer(&b); } if (dodump) enc28j60Dump(); } static uint32_t lastARPTime = 0; if (ticks - lastARPTime >= ARP_TMR_INTERVAL) { lastARPTime = ticks; etharp_tmr(); } static uint32_t lastDHCPTime1 = 0; if (ticks - lastDHCPTime1 >= DHCP_COARSE_TIMER_MSECS) { lastDHCPTime1 = ticks; dhcp_coarse_tmr(); } static uint32_t lastDHCPTime2 = 0; if (ticks - lastDHCPTime2 >= DHCP_FINE_TIMER_MSECS) { lastDHCPTime2 = ticks; dhcp_fine_tmr(); } if (IO_IS_LOW(INT_ETH)) { uint8_t eir = enc28j60ReadControl(EIR); myprintf("eir 0x%02x\r\n", eir); if (eir & EIR_LINKIF) { uint16_t phir = enc28j60ReadPhyWord(PHIR); if (phir & PHIR_PLNKIF) { uint16_t stat = enc28j60ReadPhyWord(PHSTAT2); if (stat & PHSTAT2_LSTAT) // link is up { myprintf("LINK UP\r\n"); netif_set_up(ð_netif); dhcp_start(ð_netif); } else // link is down or was for a period { myprintf("LINK DOWN\r\n"); dhcp_stop(ð_netif); netif_set_down(ð_netif); } } myprintf("phir: 0x%04x\r\n", phir); } enc28j60_if_input(ð_netif); } }
void ethProcess() { static uint32_t lastCheck = 0; if (ticks - lastCheck >= 1000) { lastCheck = ticks; // TProvHeader header; // provPrepareHeader(&header); // header.type = PROVIDER_TYPE_CONTROL; // header.cmd = 0; // provSendPacket(&header, sizeof(header)); if (dodump) enc28j60Dump(); } static uint32_t lastARPTime = 0; if (ticks - lastARPTime >= ARP_TMR_INTERVAL) { lastARPTime = ticks; etharp_tmr(); } static uint32_t lastDHCPTime1 = 0; if (ticks - lastDHCPTime1 >= DHCP_COARSE_TIMER_MSECS) { lastDHCPTime1 = ticks; dhcp_coarse_tmr(); } static uint32_t lastDHCPTime2 = 0; if (ticks - lastDHCPTime2 >= DHCP_FINE_TIMER_MSECS) { lastDHCPTime2 = ticks; dhcp_fine_tmr(); } if (IO_IS_LOW(INT_ETH)) { uint8_t eir = enc28j60ReadControl(EIR); myprintf("eir 0x%02x\r\n", eir); if (eir & EIR_LINKIF) { uint16_t phir = enc28j60ReadPhyWord(PHIR); if (phir & PHIR_PLNKIF) { uint16_t stat = enc28j60ReadPhyWord(PHSTAT2); if (stat & PHSTAT2_LSTAT) // link is up { myprintf("LINK UP\r\n"); netif_set_up(ð_netif); dhcp_start(ð_netif); } else // link is down or was for a period { myprintf("LINK DOWN\r\n"); dhcp_stop(ð_netif); netif_set_down(ð_netif); } } myprintf("phir: 0x%04x\r\n", phir); } enc28j60_if_input(ð_netif); } }