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