1
0
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

234 lines
4.9 KiB

/**
* Arduino adaptation of AVRLib's netstack test and ENC28J60 driver.
* Cleft under a CC BY-SA-NC 2.5 (Matthieu Lalonde)
* Go to creativecommons.org for the full license.
**/
#include "main.h"
struct netEthAddr myEthAddress;
// prototypes
void netstackUDPIPProcess(unsigned int len, udpip_hdr* packet)
{
SPrint_P(PSTR("-1"));
u16 payloadlen=0;
SPrint_P(PSTR("0"));
u08* payloaddata=0;
SPrint_P(PSTR("1"));
u16 i;
SPrint_P(PSTR("2"));
// get UDP payload length
payloadlen = htons(packet->udp.udplen);
payloadlen -= 8; // subtract header
// get UDP payload data
payloaddata = &((unsigned char*)packet)[IP_HEADER_LEN+UDP_HEADER_LEN];
SPrint_P(PSTR("UDP packet, len: "));
Serial.println((unsigned int)len, DEC);
// debugPrintHexTable(len, (unsigned char*)packet);
if(packet->udp.destport == HTONS(CONTROL_PORT))
{
// command packet
processCommand(payloadlen, payloaddata);
}
else if(packet->udp.destport == HTONS(SERIAL_PORT))
{
// serial output
for(i=0; i<payloadlen; i++)
Serial.print(payloaddata[i]);
}
else if(packet->udp.destport == HTONS(LOOPBACK_PORT))
{
// loopback - return packet to sender
udpSend(htonl(packet->ip.srcipaddr), LOOPBACK_PORT, payloadlen, payloaddata);
}
}
void netstackTCPIPProcess(unsigned int len, tcpip_hdr* packet)
{
SPrint_P(PSTR("Rvd tcp Packet: len="));
Serial.println((unsigned int)len, DEC);
}
void processCommand(u16 len, u08* data)
{
SPrint_P(PSTR("Rvd UDP : CMD="));
Serial.print(data[0], HEX);
SPrint_P(PSTR(" ARG0="));
Serial.println(data[1], HEX);
// do something based on command
switch(data[0])
{
case 'C': // set PORTC
PORTC = data[1];
break; // set DDRC
case 'c':
PORTC = data[1];
break;
default:
SPrintln_P(PSTR("Unkown UDP command"));
break;
}
}
void serviceLocal(void)
{
byte c;
char* buffer[100];
if(Serial.available())
{
c = Serial.read();
Serial.println(c);
// process command
switch(c)
{
/*
case 'a': // Assert CS
{
cbi(ENC28J60_CONTROL_PORT, ENC28J60_CONTROL_CS);
} break;
case 's': // reSet CS
{
sbi(ENC28J60_CONTROL_PORT, ENC28J60_CONTROL_CS);
} break;
*/
case 'a' :
{
arpPrintTable();
} break;
case 'd':
{
nicRegDump();
} break;
case 'i':
{
nicInit();
} break;
case 'n': // Netstack init
{
nicSoftReset();
netstackInit(IPADDRESS, NETMASK, GATEWAY);
} break;
case 'b': // reBoot
{
nicReboot();
} break;
case 'v': // reVision
{
SPrint_P(PSTR("RevID: "));
Serial.println((byte)(enc28j60Read(EREVID)), BIN);
} break;
case 'p':
{
SPrintln_P(PSTR("IP Configs"));
SPrint_P(PSTR("IP:"));
Serial.println(ipGetConfig()->ip);
SPrint_P(PSTR("Gateway:"));
Serial.println(ipGetConfig()->gateway);
SPrint_P(PSTR("Netmask:"));
Serial.println(ipGetConfig()->netmask);
} break;
/*
case 'x':
{
char b[2048] = "a";
unsigned int i = 0;
Serial.println();
for (i = 1; 1; i++) {
SPrint_P(PSTR(".")); delay(250);
b[i] = 255;
}
}
break;
*/
case '1':
enc28j60PhyWrite(PHLCON, 0x3992); // Off/On
break;
case '2':
enc28j60PhyWrite(PHLCON, 0x3882); // On/On
break;
case '3':
// A: Display link status and transmit/receive activity B: Display link status and receive activity
enc28j60PhyWrite(PHLCON, 0x3DC2);
break;
case '4':
enc28j60PhyWrite(PHLCON, 0x3DE2); // Default(?)
break;
case 'l': // read LED
SPrint_P(PSTR("PHLCON: 00"));
Serial.println((long int)(enc28j60PhyRead(PHLCON)), BIN);
break;
case 'u':
{
SPrintln_P(PSTR("Sending UDP packet"));
strcpy(buffer[ETH_HEADER_LEN+IP_HEADER_LEN+UDP_HEADER_LEN], "hello");
SPrintln_P(PSTR("Buffered string"));
udpSend(IPDOT(192l,168l,0l,12l), CONTROL_PORT, 6, (uint8_t*)buffer[ETH_HEADER_LEN+IP_HEADER_LEN+UDP_HEADER_LEN]);
SPrintln_P(PSTR("UDP Sent"));
} break;
case '?':
{
SPrintln_P(PSTR("Usage:"));
SPrintln_P(PSTR("(a) Print ARP table"));
SPrintln_P(PSTR("(d) Dump nic registers"));
SPrintln_P(PSTR("(i) Nic initialization"));
SPrintln_P(PSTR("(n) Netstack initialization"));
SPrintln_P(PSTR("(b) Reboot NIC"));
SPrintln_P(PSTR("(v) Display NIC revision"));
SPrintln_P(PSTR("(p) Print IP configuration"));
SPrintln_P(PSTR("(l) Display lamps register"));
SPrintln_P(PSTR("(1-4) Set lamps register"));
SPrintln_P(PSTR("(u) Send UDP packet"));
SPrintln_P(PSTR("(?) Print this help"));
} break;
case '\n':
default:
break;
}
delay(10);
// print new prompt
SPrint_P(PSTR("cmd> "));
}
}
void setup(void)
{
pinMode(pinLED, OUTPUT);
digitalWrite(pinLED, HIGH);
Serial.begin(115200);
delay(100);
// init network stack
SPrintln_P(PSTR("Initializing Network Stack!"));
netstackInit(IPADDRESS, NETMASK, GATEWAY);
SPrint_P(PSTR("Net Stack is up!"));
SPrint_P(PSTR("\r\ncmd> "));
}
void loop(void)
{
// service local stuff
serviceLocal();
netstackService();
}