Dependencies:   FatFileSystem mbed WeatherMeters SDFileSystem

Committer:
dcoban
Date:
Tue Apr 03 18:43:13 2012 +0000
Revision:
0:1a61c61d0845

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dcoban 0:1a61c61d0845 1
dcoban 0:1a61c61d0845 2 /*
dcoban 0:1a61c61d0845 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
dcoban 0:1a61c61d0845 4
dcoban 0:1a61c61d0845 5 Permission is hereby granted, free of charge, to any person obtaining a copy
dcoban 0:1a61c61d0845 6 of this software and associated documentation files (the "Software"), to deal
dcoban 0:1a61c61d0845 7 in the Software without restriction, including without limitation the rights
dcoban 0:1a61c61d0845 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
dcoban 0:1a61c61d0845 9 copies of the Software, and to permit persons to whom the Software is
dcoban 0:1a61c61d0845 10 furnished to do so, subject to the following conditions:
dcoban 0:1a61c61d0845 11
dcoban 0:1a61c61d0845 12 The above copyright notice and this permission notice shall be included in
dcoban 0:1a61c61d0845 13 all copies or substantial portions of the Software.
dcoban 0:1a61c61d0845 14
dcoban 0:1a61c61d0845 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
dcoban 0:1a61c61d0845 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
dcoban 0:1a61c61d0845 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
dcoban 0:1a61c61d0845 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
dcoban 0:1a61c61d0845 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
dcoban 0:1a61c61d0845 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
dcoban 0:1a61c61d0845 21 THE SOFTWARE.
dcoban 0:1a61c61d0845 22 */
dcoban 0:1a61c61d0845 23
dcoban 0:1a61c61d0845 24 #include "netCfg.h"
dcoban 0:1a61c61d0845 25 #if NET_ETH
dcoban 0:1a61c61d0845 26
dcoban 0:1a61c61d0845 27 #include "mbed.h"
dcoban 0:1a61c61d0845 28
dcoban 0:1a61c61d0845 29 Ethernet *pEth = NULL;
dcoban 0:1a61c61d0845 30 #ifdef __cplusplus
dcoban 0:1a61c61d0845 31 extern "C" {
dcoban 0:1a61c61d0845 32 #endif
dcoban 0:1a61c61d0845 33
dcoban 0:1a61c61d0845 34 #include "lwip/opt.h"
dcoban 0:1a61c61d0845 35
dcoban 0:1a61c61d0845 36 #include "lwip/def.h"
dcoban 0:1a61c61d0845 37 #include "lwip/pbuf.h"
dcoban 0:1a61c61d0845 38 #include "lwip/sys.h"
dcoban 0:1a61c61d0845 39 #include "lwip/stats.h"
dcoban 0:1a61c61d0845 40 #include "netif/etharp.h"
dcoban 0:1a61c61d0845 41 #include "string.h"
dcoban 0:1a61c61d0845 42
dcoban 0:1a61c61d0845 43 //#include "eth_drv.h"
dcoban 0:1a61c61d0845 44
dcoban 0:1a61c61d0845 45 #define IFNAME0 'E'
dcoban 0:1a61c61d0845 46 #define IFNAME1 'X'
dcoban 0:1a61c61d0845 47
dcoban 0:1a61c61d0845 48 #define min(x,y) (((x)<(y))?(x):(y))
dcoban 0:1a61c61d0845 49
dcoban 0:1a61c61d0845 50 struct netif* eth_netif;
dcoban 0:1a61c61d0845 51
dcoban 0:1a61c61d0845 52 static err_t eth_output(struct netif *netif, struct pbuf *p) {
dcoban 0:1a61c61d0845 53 #if ETH_PAD_SIZE
dcoban 0:1a61c61d0845 54 pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */
dcoban 0:1a61c61d0845 55 #endif
dcoban 0:1a61c61d0845 56
dcoban 0:1a61c61d0845 57 do {
dcoban 0:1a61c61d0845 58 pEth->write((const char *)p->payload, p->len);
dcoban 0:1a61c61d0845 59 } while((p = p->next)!=NULL);
dcoban 0:1a61c61d0845 60
dcoban 0:1a61c61d0845 61 pEth->send();
dcoban 0:1a61c61d0845 62
dcoban 0:1a61c61d0845 63 #if ETH_PAD_SIZE
dcoban 0:1a61c61d0845 64 pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */
dcoban 0:1a61c61d0845 65 #endif
dcoban 0:1a61c61d0845 66
dcoban 0:1a61c61d0845 67 LINK_STATS_INC(link.xmit);
dcoban 0:1a61c61d0845 68 return ERR_OK;
dcoban 0:1a61c61d0845 69 }
dcoban 0:1a61c61d0845 70
dcoban 0:1a61c61d0845 71 /*
dcoban 0:1a61c61d0845 72 void show(char *buf, int size) {
dcoban 0:1a61c61d0845 73 printf("Destination: %02hx:%02hx:%02hx:%02hx:%02hx:%02hx\n",
dcoban 0:1a61c61d0845 74 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
dcoban 0:1a61c61d0845 75 printf("Source: %02hx:%02hx:%02hx:%02hx:%02hx:%02hx\n",
dcoban 0:1a61c61d0845 76 buf[6], buf[7], buf[8], buf[9], buf[10], buf[11]);
dcoban 0:1a61c61d0845 77
dcoban 0:1a61c61d0845 78 printf("Type %hd\n", htons((short)buf[12]));
dcoban 0:1a61c61d0845 79
dcoban 0:1a61c61d0845 80 // hexview(buf, size);
dcoban 0:1a61c61d0845 81 }
dcoban 0:1a61c61d0845 82 */
dcoban 0:1a61c61d0845 83
dcoban 0:1a61c61d0845 84 int eth_poll() {
dcoban 0:1a61c61d0845 85 int PacketsReceived = 0;
dcoban 0:1a61c61d0845 86 struct eth_hdr *ethhdr;
dcoban 0:1a61c61d0845 87 struct pbuf *frame, *p;
dcoban 0:1a61c61d0845 88 int len, read;
dcoban 0:1a61c61d0845 89
dcoban 0:1a61c61d0845 90 while((len = pEth->receive()) != 0) {
dcoban 0:1a61c61d0845 91 PacketsReceived++;
dcoban 0:1a61c61d0845 92 frame = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
dcoban 0:1a61c61d0845 93 if(frame == NULL) {
dcoban 0:1a61c61d0845 94 return PacketsReceived;
dcoban 0:1a61c61d0845 95 }
dcoban 0:1a61c61d0845 96 p = frame;
dcoban 0:1a61c61d0845 97 /* no packet could be read, silently ignore this */
dcoban 0:1a61c61d0845 98 if (p == NULL) return PacketsReceived;
dcoban 0:1a61c61d0845 99 do {
dcoban 0:1a61c61d0845 100 read = pEth->read((char *)p->payload, p->len);
dcoban 0:1a61c61d0845 101 p = p->next;
dcoban 0:1a61c61d0845 102 } while(p != NULL && read != 0);
dcoban 0:1a61c61d0845 103
dcoban 0:1a61c61d0845 104 /* Ignore this packet if it is too small to contain a valid Ethernet header. */
dcoban 0:1a61c61d0845 105 if (len < (sizeof(struct eth_hdr) + ETH_PAD_SIZE))
dcoban 0:1a61c61d0845 106 {
dcoban 0:1a61c61d0845 107 pbuf_free(frame);
dcoban 0:1a61c61d0845 108 frame = NULL;
dcoban 0:1a61c61d0845 109 continue;
dcoban 0:1a61c61d0845 110 }
dcoban 0:1a61c61d0845 111
dcoban 0:1a61c61d0845 112 #if ETH_PAD_SIZE
dcoban 0:1a61c61d0845 113 pbuf_header(p, ETH_PAD_SIZE);
dcoban 0:1a61c61d0845 114 #endif
dcoban 0:1a61c61d0845 115
dcoban 0:1a61c61d0845 116 ethhdr = (struct eth_hdr *)(frame->payload);
dcoban 0:1a61c61d0845 117
dcoban 0:1a61c61d0845 118 switch (htons(ethhdr->type)) {
dcoban 0:1a61c61d0845 119 /* IP or ARP packet? */
dcoban 0:1a61c61d0845 120 case ETHTYPE_IP:
dcoban 0:1a61c61d0845 121 case ETHTYPE_ARP:
dcoban 0:1a61c61d0845 122 #if PPPOE_SUPPORT
dcoban 0:1a61c61d0845 123 /* PPPoE packet? */
dcoban 0:1a61c61d0845 124 case ETHTYPE_PPPOEDISC:
dcoban 0:1a61c61d0845 125 case ETHTYPE_PPPOE:
dcoban 0:1a61c61d0845 126 #endif /* PPPOE_SUPPORT */
dcoban 0:1a61c61d0845 127 /* full packet send to tcpip_thread to process */
dcoban 0:1a61c61d0845 128 //if (netif->input(p, gnetif)!=ERR_OK)
dcoban 0:1a61c61d0845 129 if (ethernet_input(frame, eth_netif)!=ERR_OK)
dcoban 0:1a61c61d0845 130 { LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
dcoban 0:1a61c61d0845 131 pbuf_free(frame);
dcoban 0:1a61c61d0845 132 frame = NULL;
dcoban 0:1a61c61d0845 133 }
dcoban 0:1a61c61d0845 134 break;
dcoban 0:1a61c61d0845 135
dcoban 0:1a61c61d0845 136 default:
dcoban 0:1a61c61d0845 137 pbuf_free(frame);
dcoban 0:1a61c61d0845 138 frame = NULL;
dcoban 0:1a61c61d0845 139 break;
dcoban 0:1a61c61d0845 140 }
dcoban 0:1a61c61d0845 141 }
dcoban 0:1a61c61d0845 142
dcoban 0:1a61c61d0845 143 return PacketsReceived;
dcoban 0:1a61c61d0845 144 }
dcoban 0:1a61c61d0845 145
dcoban 0:1a61c61d0845 146 err_t eth_init(struct netif *netif) {
dcoban 0:1a61c61d0845 147 LWIP_ASSERT("netif != NULL", (netif != NULL));
dcoban 0:1a61c61d0845 148
dcoban 0:1a61c61d0845 149 NETIF_INIT_SNMP(netif, snmp_ifType_ethernet_csmacd, 0x2EA);
dcoban 0:1a61c61d0845 150
dcoban 0:1a61c61d0845 151 /* maximum transfer unit */
dcoban 0:1a61c61d0845 152 netif->mtu = 0x2EA;
dcoban 0:1a61c61d0845 153
dcoban 0:1a61c61d0845 154 /* device capabilities */
dcoban 0:1a61c61d0845 155 /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */
dcoban 0:1a61c61d0845 156 netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP | NETIF_FLAG_IGMP;
dcoban 0:1a61c61d0845 157
dcoban 0:1a61c61d0845 158 netif->state = NULL;
dcoban 0:1a61c61d0845 159 eth_netif = netif;
dcoban 0:1a61c61d0845 160
dcoban 0:1a61c61d0845 161 netif->name[0] = IFNAME0;
dcoban 0:1a61c61d0845 162 netif->name[1] = IFNAME1;
dcoban 0:1a61c61d0845 163
dcoban 0:1a61c61d0845 164 /* We directly use etharp_output() here to save a function call.
dcoban 0:1a61c61d0845 165 * You can instead declare your own function an call etharp_output()
dcoban 0:1a61c61d0845 166 * from it if you have to do some checks before sending (e.g. if link
dcoban 0:1a61c61d0845 167 * is available...) */
dcoban 0:1a61c61d0845 168 netif->output = etharp_output;
dcoban 0:1a61c61d0845 169 netif->linkoutput = eth_output;
dcoban 0:1a61c61d0845 170
dcoban 0:1a61c61d0845 171 if (!pEth) pEth = new Ethernet(); // only create Ethernet object if required
dcoban 0:1a61c61d0845 172
dcoban 0:1a61c61d0845 173 // UNDONE: Remove. Just for debug
dcoban 0:1a61c61d0845 174 pEth->set_link(Ethernet::HalfDuplex100);
dcoban 0:1a61c61d0845 175
dcoban 0:1a61c61d0845 176 return ERR_OK;
dcoban 0:1a61c61d0845 177 }
dcoban 0:1a61c61d0845 178
dcoban 0:1a61c61d0845 179 void eth_free()
dcoban 0:1a61c61d0845 180 {
dcoban 0:1a61c61d0845 181 if(pEth)
dcoban 0:1a61c61d0845 182 delete pEth;
dcoban 0:1a61c61d0845 183 pEth = NULL;
dcoban 0:1a61c61d0845 184 }
dcoban 0:1a61c61d0845 185
dcoban 0:1a61c61d0845 186 void eth_address(char* mac) {
dcoban 0:1a61c61d0845 187 pEth->address(mac);
dcoban 0:1a61c61d0845 188 }
dcoban 0:1a61c61d0845 189
dcoban 0:1a61c61d0845 190 Ethernet* eth_interface() {
dcoban 0:1a61c61d0845 191 return pEth;
dcoban 0:1a61c61d0845 192 }
dcoban 0:1a61c61d0845 193
dcoban 0:1a61c61d0845 194 #ifdef __cplusplus
dcoban 0:1a61c61d0845 195 };
dcoban 0:1a61c61d0845 196 #endif
dcoban 0:1a61c61d0845 197
dcoban 0:1a61c61d0845 198 #endif