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
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();
|
|
}
|