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.

228 lines
4.5 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"
/**
* Network support
**/
// PHY level
#include "nic.h"
#include "enc28j60.h"
// Net Stack
#include "net.h"
#include "netstack.h"
#include "arp.h"
#include "ip.h"
#include "icmp.h"
#define PrintIP(ip) netPrintIPAddr(ip); SPrintln(" ")
struct netEthAddr myEthAddress;
// prototypes
void netstackUDPIPProcess(unsigned int len, udpip_hdr* packet)
{
SPrint("-1");
u16 payloadlen=0;
SPrint("0");
u08* payloaddata=0;
SPrint("1");
u16 i;
SPrint("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("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("Rvd tcp Packet: len=");
Serial.println((unsigned int)len, DEC);
}
void processCommand(u16 len, u08* data)
{
SPrint("Rvd UDP : CMD=");
Serial.print(data[0], HEX);
SPrint(" 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("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;
*/
#if defined(ARP_DEBUG_PRINT)
case 'a' :
arpPrintTable();
break;
#endif
#if defined(NET_DEBUG) || defined(NIC_DEBUG)
case 'd':
nicRegDump();
break;
#endif
case 'i':
nicInit();
break;
/*
case 'p':
break;
*/
case 'n': // Netstack init
netstackInit(IPADDRESS, NETMASK, GATEWAY);
break;
case 'b': // reBoot
nicReboot();
break;
case 'v': // reVision
SPrint("RevID: ");
Serial.println((byte)(enc28j60Read(EREVID)), BIN);
break;
case 'c':
SPrintln("IP Configs");
SPrint("IP:");
PrintIP(ipGetConfig()->ip);
SPrint("Gateway:");
PrintIP(ipGetConfig()->gateway);
SPrint("Netmask:");
PrintIP(ipGetConfig()->netmask);
//SPrint("MAC:");
//netPrintEthAddr(netEthAddr);
break;
/*
case 'x':
char b[2048] = "a";
unsigned int i = 0;
Serial.println();
for (i = 1; 1; i++) {
SPrint("."); delay(250);
b[i] = 255;
}
break;
*/
case 'u':
SPrintln("Sending UDP packet");
strcpy(buffer[ETH_HEADER_LEN+IP_HEADER_LEN+UDP_HEADER_LEN], "hello");
SPrintln("Buffered string");
udpSend(IPDOT(192l,168l,0l,12l), CONTROL_PORT, 6, (uint8_t*)buffer[ETH_HEADER_LEN+IP_HEADER_LEN+UDP_HEADER_LEN]);
SPrintln("UDP Sent");
break;
case '?':
SPrintln("Usage:");
#ifdef NET_DEBUG
SPrintln("(a) Print ARP table");
#endif
SPrintln("(b) Reboot NIC");
SPrintln("(c) Print IP configuration");
#if defined(NET_DEBUG) || defined(NIC_DEBUG)
SPrintln("(d) Dump nic registers");
#endif
SPrintln("(i) Nic initialization");
SPrintln("(n) Netstack initialization");
//SPrintln("(p) Ping a remote machine");
SPrintln("(u) Send UDP packet");
SPrintln("(v) Display NIC revision");
SPrintln("(?) Print this help");
break;
case '\n':
default:
break;
}
delay(10);
// print new prompt
SPrint("cmd> ");
}
}
void setup(void)
{
pinMode(pinLED, OUTPUT);
digitalWrite(pinLED, HIGH);
Serial.begin(115200);
delay(100);
// init network stack
SPrintln("Initializing Network Stack!");
netstackInit(IPADDRESS, NETMASK, GATEWAY);
SPrint("Net Stack is up!");
SPrint("\r\ncmd> ");
}
void loop(void)
{
// service local stuff
serviceLocal();
netstackService();
}