Example #1
0
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);

}
Example #2
0
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(&eth_netif);
					dhcp_start(&eth_netif);
				}
				else // link is down or was for a period
				{
					myprintf("LINK DOWN\r\n");
					dhcp_stop(&eth_netif);
					netif_set_down(&eth_netif);
				}
			}
			myprintf("phir: 0x%04x\r\n", phir);
		}
		enc28j60_if_input(&eth_netif);
	}
}
Example #3
0
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(&eth_netif);
					dhcp_start(&eth_netif);
				}
				else // link is down or was for a period
				{
					myprintf("LINK DOWN\r\n");
					dhcp_stop(&eth_netif);
					netif_set_down(&eth_netif);
				}
			}
			myprintf("phir: 0x%04x\r\n", phir);
		}
		enc28j60_if_input(&eth_netif);
	}
}