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
phy.cpp@56:35117a8b5c65, 2017-11-14 (annotated)
- Committer:
- andrewboyson
- Date:
- Tue Nov 14 17:43:08 2017 +0000
- Revision:
- 56:35117a8b5c65
- Parent:
- 52:fbc5a46b5e16
- Child:
- 57:e0fb648acf48
Corrected closing FIN requirement
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
andrewboyson | 37:793b39683406 | 1 | #include "mbed.h" |
andrewboyson | 37:793b39683406 | 2 | #include "io.h" |
andrewboyson | 37:793b39683406 | 3 | #include "log.h" |
andrewboyson | 37:793b39683406 | 4 | #include "eth.h" |
andrewboyson | 37:793b39683406 | 5 | #include "action.h" |
andrewboyson | 37:793b39683406 | 6 | #include "mac.h" |
andrewboyson | 37:793b39683406 | 7 | #include "net.h" |
andrewboyson | 37:793b39683406 | 8 | #include "phy.h" |
andrewboyson | 0:faa09bd4e6bf | 9 | |
andrewboyson | 0:faa09bd4e6bf | 10 | Ethernet eth; |
andrewboyson | 0:faa09bd4e6bf | 11 | |
andrewboyson | 2:849103b5a16d | 12 | DigitalIn phyLinkNeg (P1_25); |
andrewboyson | 2:849103b5a16d | 13 | DigitalIn phySpeedNeg(P1_26); |
andrewboyson | 0:faa09bd4e6bf | 14 | |
andrewboyson | 13:9cd54f7db57a | 15 | static char buf[1600]; |
andrewboyson | 0:faa09bd4e6bf | 16 | |
andrewboyson | 0:faa09bd4e6bf | 17 | static Timer blinkTimer; |
andrewboyson | 0:faa09bd4e6bf | 18 | |
andrewboyson | 37:793b39683406 | 19 | bool PhyTrace = false; |
andrewboyson | 37:793b39683406 | 20 | |
andrewboyson | 0:faa09bd4e6bf | 21 | static void blink() |
andrewboyson | 0:faa09bd4e6bf | 22 | { |
andrewboyson | 0:faa09bd4e6bf | 23 | blinkTimer.reset(); |
andrewboyson | 0:faa09bd4e6bf | 24 | blinkTimer.start(); |
andrewboyson | 0:faa09bd4e6bf | 25 | } |
andrewboyson | 0:faa09bd4e6bf | 26 | |
andrewboyson | 0:faa09bd4e6bf | 27 | static void updateLeds() |
andrewboyson | 0:faa09bd4e6bf | 28 | { |
andrewboyson | 0:faa09bd4e6bf | 29 | if (blinkTimer.read_ms() < 100) |
andrewboyson | 0:faa09bd4e6bf | 30 | { |
andrewboyson | 0:faa09bd4e6bf | 31 | IoEthLedGrL = 0; |
andrewboyson | 0:faa09bd4e6bf | 32 | IoEthLedYeR = 0; |
andrewboyson | 0:faa09bd4e6bf | 33 | } |
andrewboyson | 0:faa09bd4e6bf | 34 | else |
andrewboyson | 0:faa09bd4e6bf | 35 | { |
andrewboyson | 2:849103b5a16d | 36 | IoEthLedGrL = !phyLinkNeg ; |
andrewboyson | 2:849103b5a16d | 37 | IoEthLedYeR = !phySpeedNeg; |
andrewboyson | 0:faa09bd4e6bf | 38 | blinkTimer.stop(); |
andrewboyson | 0:faa09bd4e6bf | 39 | } |
andrewboyson | 0:faa09bd4e6bf | 40 | } |
andrewboyson | 0:faa09bd4e6bf | 41 | static int readPacket() |
andrewboyson | 0:faa09bd4e6bf | 42 | { |
andrewboyson | 0:faa09bd4e6bf | 43 | int sizeReceived = eth.receive(); |
andrewboyson | 2:849103b5a16d | 44 | if (sizeReceived) |
andrewboyson | 2:849103b5a16d | 45 | { |
andrewboyson | 2:849103b5a16d | 46 | eth.read(buf, sizeReceived); |
andrewboyson | 2:849103b5a16d | 47 | blink(); |
andrewboyson | 2:849103b5a16d | 48 | } |
andrewboyson | 0:faa09bd4e6bf | 49 | return sizeReceived; |
andrewboyson | 0:faa09bd4e6bf | 50 | } |
andrewboyson | 0:faa09bd4e6bf | 51 | |
andrewboyson | 0:faa09bd4e6bf | 52 | static void sendPacket(int sendLength) |
andrewboyson | 0:faa09bd4e6bf | 53 | { |
andrewboyson | 0:faa09bd4e6bf | 54 | eth.write(buf, sendLength); //Make a packet from the header (14 bytes) and the payload |
andrewboyson | 2:849103b5a16d | 55 | int sent = eth.send(); //Send the packet |
andrewboyson | 2:849103b5a16d | 56 | if (sent) blink(); |
andrewboyson | 4:31fa7d50722c | 57 | else LogTimeF("Packet of %d bytes not sent\r\n", sendLength); |
andrewboyson | 0:faa09bd4e6bf | 58 | } |
andrewboyson | 0:faa09bd4e6bf | 59 | |
andrewboyson | 2:849103b5a16d | 60 | static bool linkIsUp = false; |
andrewboyson | 2:849103b5a16d | 61 | static void checkLinkIsUp() |
andrewboyson | 2:849103b5a16d | 62 | { |
andrewboyson | 2:849103b5a16d | 63 | static Timer linkUpTimer; |
andrewboyson | 2:849103b5a16d | 64 | if (phyLinkNeg) //link is indicated as being down |
andrewboyson | 2:849103b5a16d | 65 | { |
andrewboyson | 2:849103b5a16d | 66 | linkIsUp = false; |
andrewboyson | 2:849103b5a16d | 67 | linkUpTimer.reset(); |
andrewboyson | 2:849103b5a16d | 68 | linkUpTimer.start(); |
andrewboyson | 2:849103b5a16d | 69 | } |
andrewboyson | 2:849103b5a16d | 70 | else //link is indicated as being up |
andrewboyson | 2:849103b5a16d | 71 | { |
andrewboyson | 2:849103b5a16d | 72 | if (linkUpTimer.read_ms() > 100) |
andrewboyson | 2:849103b5a16d | 73 | { |
andrewboyson | 2:849103b5a16d | 74 | linkIsUp = true; |
andrewboyson | 2:849103b5a16d | 75 | linkUpTimer.stop(); |
andrewboyson | 2:849103b5a16d | 76 | } |
andrewboyson | 2:849103b5a16d | 77 | else |
andrewboyson | 2:849103b5a16d | 78 | { |
andrewboyson | 2:849103b5a16d | 79 | linkUpTimer.start(); |
andrewboyson | 2:849103b5a16d | 80 | } |
andrewboyson | 2:849103b5a16d | 81 | } |
andrewboyson | 2:849103b5a16d | 82 | } |
andrewboyson | 37:793b39683406 | 83 | static void logHeader() |
andrewboyson | 37:793b39683406 | 84 | { |
andrewboyson | 37:793b39683406 | 85 | } |
andrewboyson | 2:849103b5a16d | 86 | void PhyMain() |
andrewboyson | 0:faa09bd4e6bf | 87 | { |
andrewboyson | 0:faa09bd4e6bf | 88 | updateLeds(); |
andrewboyson | 0:faa09bd4e6bf | 89 | |
andrewboyson | 2:849103b5a16d | 90 | checkLinkIsUp(); |
andrewboyson | 2:849103b5a16d | 91 | |
andrewboyson | 7:b794780e33b4 | 92 | int size = readPacket(); |
andrewboyson | 13:9cd54f7db57a | 93 | |
andrewboyson | 9:91dae5300a4d | 94 | int action = DO_NOTHING; |
andrewboyson | 0:faa09bd4e6bf | 95 | |
andrewboyson | 0:faa09bd4e6bf | 96 | //If a packet has been received then handle it |
andrewboyson | 37:793b39683406 | 97 | if (size) action = EthHandlePacket(logHeader, &buf, &size); |
andrewboyson | 0:faa09bd4e6bf | 98 | |
andrewboyson | 0:faa09bd4e6bf | 99 | //If there is no packet to handle then see if there is a packet waiting to be sent |
andrewboyson | 9:91dae5300a4d | 100 | if (action == DO_NOTHING && linkIsUp) |
andrewboyson | 2:849103b5a16d | 101 | { |
andrewboyson | 10:f0854784e960 | 102 | action = EthPollForPacketToSend(&buf, &size); |
andrewboyson | 2:849103b5a16d | 103 | } |
andrewboyson | 0:faa09bd4e6bf | 104 | |
andrewboyson | 0:faa09bd4e6bf | 105 | //If there is a packet to send then send it |
andrewboyson | 13:9cd54f7db57a | 106 | if (action != DO_NOTHING) |
andrewboyson | 13:9cd54f7db57a | 107 | { |
andrewboyson | 13:9cd54f7db57a | 108 | sendPacket(size); |
andrewboyson | 13:9cd54f7db57a | 109 | } |
andrewboyson | 0:faa09bd4e6bf | 110 | } |
andrewboyson | 0:faa09bd4e6bf | 111 | |
andrewboyson | 2:849103b5a16d | 112 | void PhyInit() |
andrewboyson | 0:faa09bd4e6bf | 113 | { |
andrewboyson | 2:849103b5a16d | 114 | phyLinkNeg.mode(PullUp); |
andrewboyson | 2:849103b5a16d | 115 | phySpeedNeg.mode(PullUp); |
andrewboyson | 0:faa09bd4e6bf | 116 | blink(); |
andrewboyson | 13:9cd54f7db57a | 117 | eth.address(MacLocal); |
andrewboyson | 37:793b39683406 | 118 | if (PhyTrace) |
andrewboyson | 37:793b39683406 | 119 | { |
andrewboyson | 47:73af5c0b0dc2 | 120 | Log("\r\n"); |
andrewboyson | 47:73af5c0b0dc2 | 121 | LogTime("MAC: "); |
andrewboyson | 47:73af5c0b0dc2 | 122 | MacLog(MacLocal); |
andrewboyson | 47:73af5c0b0dc2 | 123 | Log("\r\n"); |
andrewboyson | 37:793b39683406 | 124 | } |
andrewboyson | 0:faa09bd4e6bf | 125 | } |