/** * 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; iudp.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(); }