Ethernet Network Library

Dependencies:   NetworkingCoreLib

Dependents:   EthernetHTTPClientTest

Committer:
donatien
Date:
Fri May 25 08:58:41 2012 +0000
Revision:
3:89685182416b
Parent:
0:7b5b0d3a55d5
Core lib up

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:7b5b0d3a55d5 1 /* Ethernetnetwork.cpp */
donatien 0:7b5b0d3a55d5 2 /*
donatien 0:7b5b0d3a55d5 3 Copyright (C) 2012 ARM Limited.
donatien 0:7b5b0d3a55d5 4
donatien 0:7b5b0d3a55d5 5 Permission is hereby granted, free of charge, to any person obtaining a copy of
donatien 0:7b5b0d3a55d5 6 this software and associated documentation files (the "Software"), to deal in
donatien 0:7b5b0d3a55d5 7 the Software without restriction, including without limitation the rights to
donatien 0:7b5b0d3a55d5 8 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
donatien 0:7b5b0d3a55d5 9 of the Software, and to permit persons to whom the Software is furnished to do
donatien 0:7b5b0d3a55d5 10 so, subject to the following conditions:
donatien 0:7b5b0d3a55d5 11
donatien 0:7b5b0d3a55d5 12 The above copyright notice and this permission notice shall be included in all
donatien 0:7b5b0d3a55d5 13 copies or substantial portions of the Software.
donatien 0:7b5b0d3a55d5 14
donatien 0:7b5b0d3a55d5 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
donatien 0:7b5b0d3a55d5 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
donatien 0:7b5b0d3a55d5 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
donatien 0:7b5b0d3a55d5 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
donatien 0:7b5b0d3a55d5 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 0:7b5b0d3a55d5 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
donatien 0:7b5b0d3a55d5 21 SOFTWARE.
donatien 0:7b5b0d3a55d5 22 */
donatien 0:7b5b0d3a55d5 23
donatien 0:7b5b0d3a55d5 24 #define __DEBUG__ 4
donatien 0:7b5b0d3a55d5 25 #ifndef __MODULE__
donatien 0:7b5b0d3a55d5 26 #define __MODULE__ "EthernetNetwork.cpp"
donatien 0:7b5b0d3a55d5 27 #endif
donatien 0:7b5b0d3a55d5 28
donatien 0:7b5b0d3a55d5 29 #include "core/fwk.h"
donatien 0:7b5b0d3a55d5 30
donatien 0:7b5b0d3a55d5 31 #include "EthernetNetwork.h"
donatien 0:7b5b0d3a55d5 32
donatien 0:7b5b0d3a55d5 33 #include "lwip/inet.h"
donatien 0:7b5b0d3a55d5 34 #include "lwip/netif.h"
donatien 0:7b5b0d3a55d5 35 #include "netif/etharp.h"
donatien 0:7b5b0d3a55d5 36 #include "lwip/dhcp.h"
donatien 0:7b5b0d3a55d5 37 #include "lwip/arch/lpc17_emac.h"
donatien 0:7b5b0d3a55d5 38 #include "lpc_phy.h" /* For the PHY monitor support */
donatien 0:7b5b0d3a55d5 39 #include "lwip/tcpip.h"
donatien 0:7b5b0d3a55d5 40
donatien 0:7b5b0d3a55d5 41 #include "mbed.h"
donatien 0:7b5b0d3a55d5 42
donatien 0:7b5b0d3a55d5 43 #if NET_ETHERNET
donatien 0:7b5b0d3a55d5 44
donatien 0:7b5b0d3a55d5 45 EthernetNetwork::EthernetNetwork() : LwIPInterface(), m_supervisor(&EthernetNetwork::phySupervisorCb, osTimerPeriodic, this), m_lpcNetif(), m_useDHCP(false)
donatien 0:7b5b0d3a55d5 46 {
donatien 0:7b5b0d3a55d5 47
donatien 0:7b5b0d3a55d5 48 }
donatien 0:7b5b0d3a55d5 49
donatien 0:7b5b0d3a55d5 50 int EthernetNetwork::init() //With DHCP
donatien 0:7b5b0d3a55d5 51 {
donatien 0:7b5b0d3a55d5 52 ip_addr_t ip_n, mask_n, gateway_n;
donatien 0:7b5b0d3a55d5 53
donatien 0:7b5b0d3a55d5 54 m_useDHCP = true;
donatien 0:7b5b0d3a55d5 55
donatien 0:7b5b0d3a55d5 56 DBG("Initializing LwIP");
donatien 0:7b5b0d3a55d5 57 LwIPInterface::init(); //Init LwIP, NOT including PPP
donatien 0:7b5b0d3a55d5 58
donatien 0:7b5b0d3a55d5 59 DBG("DHCP IP assignment");
donatien 0:7b5b0d3a55d5 60
donatien 0:7b5b0d3a55d5 61 memset((void*)&m_lpcNetif, 0, sizeof(m_lpcNetif));
donatien 0:7b5b0d3a55d5 62 netif_add(&m_lpcNetif, NULL, NULL, NULL, NULL, lpc_enetif_init, ethernet_input/*tcpip_input???*/);
donatien 0:7b5b0d3a55d5 63 netif_set_default(&m_lpcNetif);
donatien 0:7b5b0d3a55d5 64
donatien 0:7b5b0d3a55d5 65 return OK;
donatien 0:7b5b0d3a55d5 66 }
donatien 0:7b5b0d3a55d5 67
donatien 0:7b5b0d3a55d5 68 int EthernetNetwork::init(const char* ip, const char* mask, const char* gateway,
donatien 0:7b5b0d3a55d5 69 const char* dns1, const char* dns2) //No DHCP
donatien 0:7b5b0d3a55d5 70 {
donatien 0:7b5b0d3a55d5 71 ip_addr_t ip_n, mask_n, gateway_n, dns1_n, dns2_n;
donatien 0:7b5b0d3a55d5 72
donatien 0:7b5b0d3a55d5 73 m_useDHCP = false;
donatien 0:7b5b0d3a55d5 74
donatien 0:7b5b0d3a55d5 75 DBG("Initializing LwIP");
donatien 0:7b5b0d3a55d5 76 LwIPInterface::init(); //Init LwIP, NOT including PPP
donatien 0:7b5b0d3a55d5 77
donatien 0:7b5b0d3a55d5 78 DBG("Static IP assignment");
donatien 0:7b5b0d3a55d5 79 inet_aton(ip, &ip_n);
donatien 0:7b5b0d3a55d5 80 inet_aton(mask, &mask_n);
donatien 0:7b5b0d3a55d5 81 inet_aton(gateway, &gateway_n);
donatien 0:7b5b0d3a55d5 82 inet_aton(dns1, &dns1_n);
donatien 0:7b5b0d3a55d5 83 inet_aton(dns2, &dns2_n);
donatien 0:7b5b0d3a55d5 84
donatien 0:7b5b0d3a55d5 85 memset((void*)&m_lpcNetif, 0, sizeof(m_lpcNetif));
donatien 0:7b5b0d3a55d5 86 netif_add(&m_lpcNetif, &ip_n, &mask_n, &gateway_n, NULL, lpc_enetif_init, ethernet_input/*tcpip_input???*/);
donatien 0:7b5b0d3a55d5 87 netif_set_default(&m_lpcNetif);
donatien 0:7b5b0d3a55d5 88
donatien 0:7b5b0d3a55d5 89 return OK;
donatien 0:7b5b0d3a55d5 90 }
donatien 0:7b5b0d3a55d5 91
donatien 0:7b5b0d3a55d5 92 /*virtual*/int EthernetNetwork::connect()
donatien 0:7b5b0d3a55d5 93 {
donatien 0:7b5b0d3a55d5 94 m_supervisor.start(250);
donatien 0:7b5b0d3a55d5 95 netif_set_up(&m_lpcNetif);
donatien 0:7b5b0d3a55d5 96
donatien 0:7b5b0d3a55d5 97 DBG("Enable MAC interrupts");
donatien 0:7b5b0d3a55d5 98 NVIC_SetPriority(ENET_IRQn, ((0x01 << 3) | 0x01));
donatien 0:7b5b0d3a55d5 99 NVIC_EnableIRQ(ENET_IRQn);
donatien 0:7b5b0d3a55d5 100
donatien 0:7b5b0d3a55d5 101 if(m_useDHCP)
donatien 0:7b5b0d3a55d5 102 {
donatien 0:7b5b0d3a55d5 103 dhcp_start(&m_lpcNetif);
donatien 0:7b5b0d3a55d5 104 }
donatien 0:7b5b0d3a55d5 105
donatien 0:7b5b0d3a55d5 106 return OK;
donatien 0:7b5b0d3a55d5 107 }
donatien 0:7b5b0d3a55d5 108
donatien 0:7b5b0d3a55d5 109 /*virtual*/int EthernetNetwork::disconnect()
donatien 0:7b5b0d3a55d5 110 {
donatien 0:7b5b0d3a55d5 111 if(m_useDHCP)
donatien 0:7b5b0d3a55d5 112 {
donatien 0:7b5b0d3a55d5 113 dhcp_stop(&m_lpcNetif);
donatien 0:7b5b0d3a55d5 114 }
donatien 0:7b5b0d3a55d5 115
donatien 0:7b5b0d3a55d5 116 netif_set_down(&m_lpcNetif);
donatien 0:7b5b0d3a55d5 117
donatien 0:7b5b0d3a55d5 118 DBG("Disable MAC interrupts");
donatien 0:7b5b0d3a55d5 119 NVIC_DisableIRQ(ENET_IRQn);
donatien 0:7b5b0d3a55d5 120
donatien 0:7b5b0d3a55d5 121 m_supervisor.stop();
donatien 0:7b5b0d3a55d5 122
donatien 0:7b5b0d3a55d5 123 return OK;
donatien 0:7b5b0d3a55d5 124 }
donatien 0:7b5b0d3a55d5 125
donatien 0:7b5b0d3a55d5 126 /*static*/ void EthernetNetwork::phySupervisorCb(void const* ctx)
donatien 0:7b5b0d3a55d5 127 {
donatien 0:7b5b0d3a55d5 128 EthernetNetwork* pIf = (EthernetNetwork*) ctx;
donatien 0:7b5b0d3a55d5 129 /* Call the PHY status update state machine once in a while
donatien 0:7b5b0d3a55d5 130 to keep the link status up-to-date */
donatien 0:7b5b0d3a55d5 131 if (lpc_phy_sts_sm(&pIf->m_lpcNetif) != 0)
donatien 0:7b5b0d3a55d5 132 {
donatien 0:7b5b0d3a55d5 133 /* Set the state of the LED to on if the ethernet link is
donatien 0:7b5b0d3a55d5 134 active or off is disconnected. */
donatien 0:7b5b0d3a55d5 135 if (pIf->m_lpcNetif.flags & NETIF_FLAG_LINK_UP)
donatien 0:7b5b0d3a55d5 136 {
donatien 0:7b5b0d3a55d5 137 pIf->m_linkUp = true;
donatien 0:7b5b0d3a55d5 138 }
donatien 0:7b5b0d3a55d5 139 else
donatien 0:7b5b0d3a55d5 140 {
donatien 0:7b5b0d3a55d5 141 pIf->m_linkUp = false;
donatien 0:7b5b0d3a55d5 142 }
donatien 0:7b5b0d3a55d5 143 }
donatien 0:7b5b0d3a55d5 144 }
donatien 0:7b5b0d3a55d5 145
donatien 0:7b5b0d3a55d5 146 #endif
donatien 0:7b5b0d3a55d5 147