A stack which works with or without an Mbed os library. Provides IPv4 or IPv6 with a full 1500 byte buffer.

Dependents:   oldheating gps motorhome heating

Revision:
61:aad055f1b0d1
Parent:
59:e0e556c8bd46
Child:
63:9d67a5eaa93c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/link/link.c	Thu Jan 11 17:38:21 2018 +0000
@@ -0,0 +1,91 @@
+#include <stdbool.h>
+
+#include "peripherals.h"
+#include    "log.h"
+#include    "eth.h"
+#include "action.h"
+#include    "mac.h"
+#include    "net.h"
+#include   "link.h"
+#include    "nic.h"
+
+#define  phyLinkNeg_MASK 1UL << 25 //P1.25 input
+#define phySpeedNeg_MASK 1UL << 26 //P1.26 input
+#define   ethLedGrL_MASK 1UL << 31 //P1.31 ==> p20 output
+#define   ethLedYeR_MASK 1UL << 30 //P1.30 ==> p19 output
+
+
+bool LinkTrace = false;
+
+static int count = 0;
+static void lights()
+{
+    if (count)
+    {
+        LPC_GPIO1->FIOCLR = ethLedGrL_MASK;
+        LPC_GPIO1->FIOCLR = ethLedYeR_MASK;
+        count--;
+    }
+    else
+    {
+        if (LPC_GPIO1->FIOPIN &  phyLinkNeg_MASK) LPC_GPIO1->FIOCLR = ethLedGrL_MASK;
+        else                                      LPC_GPIO1->FIOSET = ethLedGrL_MASK;
+        if (LPC_GPIO1->FIOPIN & phySpeedNeg_MASK) LPC_GPIO1->FIOCLR = ethLedYeR_MASK;
+        else                                      LPC_GPIO1->FIOSET = ethLedYeR_MASK;
+    }
+}
+static void lightsBlink()
+{
+    count = 500; //==50ms at 100ns per scan
+}
+void LinkMain()
+{
+    //Flash lights
+    lights();
+    
+    if (!NicLinkIsUp()) return;
+    
+    //Handle packets
+    int sizeRx;
+    int sizeTx;
+    char* pRx = NicGetReceivedPacketOrNull(&sizeRx);
+    char* pTx = NicGetTransmitPacketOrNull(&sizeTx);
+    
+    int action = DO_NOTHING;
+    
+    NetTraceHostResetMatched();
+    
+    if (pRx)
+    {
+        lightsBlink();
+        
+        if (pTx) action = EthHandlePacket(pRx, sizeRx, pTx, &sizeTx);
+    
+        NicReleaseReceivedPacket();
+    }
+    if (pTx)
+    {
+        if (!action) action = EthPollForPacketToSend(pTx, &sizeTx);
+    
+        if ( action)
+        {
+            lightsBlink();
+            NicSendTransmitPacket(sizeTx);
+        }
+    }
+}
+
+void LinkInit()
+{
+    LPC_GPIO1->FIODIR |= ethLedGrL_MASK; //Set the direction to 1 == output
+    LPC_GPIO1->FIODIR |= ethLedYeR_MASK; //Set the direction to 1 == output
+    NicInit();
+    NicLinkAddress(MacLocal);
+    if (LinkTrace)
+    {
+        Log("\r\n");
+        LogTime("MAC: ");
+        MacLog(MacLocal);
+        Log("\r\n");
+    }
+}
\ No newline at end of file