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