Versão atual 13-12-2013.

Dependencies:   EthernetInterface mbed-rtos mbed

Committer:
rebonatto
Date:
Fri Dec 13 11:45:06 2013 +0000
Revision:
1:238ac24e46dd
Parent:
0:65c41a68b49a
Atual 13-12-2013.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rebonatto 0:65c41a68b49a 1 #include "Rede/EthernetIf.h"
rebonatto 0:65c41a68b49a 2
rebonatto 0:65c41a68b49a 3 #include "lwip/inet.h"
rebonatto 0:65c41a68b49a 4 #include "lwip/netif.h"
rebonatto 0:65c41a68b49a 5 #include "netif/etharp.h"
rebonatto 0:65c41a68b49a 6 #include "lwip/dhcp.h"
rebonatto 0:65c41a68b49a 7 #include "arch/lpc17_emac.h"
rebonatto 0:65c41a68b49a 8 #include "lpc_phy.h"
rebonatto 0:65c41a68b49a 9 #include "lwip/tcpip.h"
rebonatto 0:65c41a68b49a 10
rebonatto 0:65c41a68b49a 11 #include "mbed.h"
rebonatto 0:65c41a68b49a 12
rebonatto 0:65c41a68b49a 13 struct netif EthernetIf::lpcNetif;
rebonatto 0:65c41a68b49a 14 bool EthernetIf::use_dhcp;
rebonatto 0:65c41a68b49a 15 ip_addr_t EthernetIf::ip_n;
rebonatto 0:65c41a68b49a 16 ip_addr_t EthernetIf::netmask_n;
rebonatto 0:65c41a68b49a 17 ip_addr_t EthernetIf::gw_n;
rebonatto 0:65c41a68b49a 18 Semaphore EthernetIf::tcpip_initialized(0);
rebonatto 0:65c41a68b49a 19 Semaphore EthernetIf::link_up(0);
rebonatto 0:65c41a68b49a 20 Semaphore EthernetIf::netif_up(0);
rebonatto 0:65c41a68b49a 21 bool EthernetIf::link_is_up(false);
rebonatto 0:65c41a68b49a 22
rebonatto 0:65c41a68b49a 23 uint32_t EthernetIf::os_timer_cb_led[5];
rebonatto 0:65c41a68b49a 24 osTimerDef_t EthernetIf::os_timer_def_led = { (led_refresh), (os_timer_cb_led) };
rebonatto 0:65c41a68b49a 25
rebonatto 0:65c41a68b49a 26 void EthernetIf::tcpip_init_done(void *arg)
rebonatto 0:65c41a68b49a 27 {
rebonatto 0:65c41a68b49a 28 //This function is called when the TCPIP stack finishes to initialize
rebonatto 0:65c41a68b49a 29 tcpip_initialized.release();
rebonatto 0:65c41a68b49a 30 }
rebonatto 0:65c41a68b49a 31
rebonatto 0:65c41a68b49a 32 void EthernetIf::link_status_callback(struct netif *netif)
rebonatto 0:65c41a68b49a 33 {
rebonatto 0:65c41a68b49a 34 //Called when the interface link goes up or down
rebonatto 0:65c41a68b49a 35 if(netif_is_link_up(netif))
rebonatto 0:65c41a68b49a 36 {
rebonatto 0:65c41a68b49a 37 printf("Link up!!!\n");
rebonatto 0:65c41a68b49a 38 if(!link_is_up)
rebonatto 0:65c41a68b49a 39 {
rebonatto 0:65c41a68b49a 40 if(use_dhcp)
rebonatto 0:65c41a68b49a 41 {
rebonatto 0:65c41a68b49a 42 dhcp_start(&lpcNetif);
rebonatto 0:65c41a68b49a 43 }
rebonatto 0:65c41a68b49a 44 else
rebonatto 0:65c41a68b49a 45 {
rebonatto 0:65c41a68b49a 46 netif_set_addr(&lpcNetif,&ip_n,&netmask_n,&gw_n);
rebonatto 0:65c41a68b49a 47 netif_set_up(&lpcNetif);
rebonatto 0:65c41a68b49a 48 }
rebonatto 0:65c41a68b49a 49 }
rebonatto 0:65c41a68b49a 50 link_up.release();
rebonatto 0:65c41a68b49a 51 link_is_up = true;
rebonatto 0:65c41a68b49a 52 }
rebonatto 0:65c41a68b49a 53 else
rebonatto 0:65c41a68b49a 54 {
rebonatto 0:65c41a68b49a 55 printf("Link down!!!\n");
rebonatto 0:65c41a68b49a 56 netif_set_down(&lpcNetif);
rebonatto 0:65c41a68b49a 57 link_is_up = false;
rebonatto 0:65c41a68b49a 58 }
rebonatto 0:65c41a68b49a 59 }
rebonatto 0:65c41a68b49a 60
rebonatto 0:65c41a68b49a 61 void EthernetIf::interface_status_callback(struct netif *netif)
rebonatto 0:65c41a68b49a 62 {
rebonatto 0:65c41a68b49a 63 //called when the status of the interface is up or down
rebonatto 0:65c41a68b49a 64 if(netif_is_up(netif))
rebonatto 0:65c41a68b49a 65 {
rebonatto 0:65c41a68b49a 66 netif_up.release();
rebonatto 0:65c41a68b49a 67 printf("Interface Ethernet is up\n");
rebonatto 0:65c41a68b49a 68 printf("IP Address: %s\n",get_IpAddress());
rebonatto 0:65c41a68b49a 69 printf("Netmask: %s\n",get_Netmask());
rebonatto 0:65c41a68b49a 70 printf("Gateway: %s\n\n",get_Gateway());
rebonatto 0:65c41a68b49a 71 }
rebonatto 0:65c41a68b49a 72 }
rebonatto 0:65c41a68b49a 73
rebonatto 0:65c41a68b49a 74 void EthernetIf::led_refresh(void const* arg)
rebonatto 0:65c41a68b49a 75 {
rebonatto 0:65c41a68b49a 76 if(LPC_GPIO1->FIOPIN & (1<<25))
rebonatto 0:65c41a68b49a 77 LPC_GPIO0->FIOSET |= (1<<4);
rebonatto 0:65c41a68b49a 78 else
rebonatto 0:65c41a68b49a 79 LPC_GPIO0->FIOCLR |= (1<<4);
rebonatto 0:65c41a68b49a 80
rebonatto 0:65c41a68b49a 81 if(LPC_GPIO1->FIOPIN & (1<<26))
rebonatto 0:65c41a68b49a 82 LPC_GPIO0->FIOSET |= (1<<5);
rebonatto 0:65c41a68b49a 83 else
rebonatto 0:65c41a68b49a 84 LPC_GPIO0->FIOCLR |= (1<<5);
rebonatto 0:65c41a68b49a 85 }
rebonatto 0:65c41a68b49a 86
rebonatto 0:65c41a68b49a 87 int EthernetIf::_init()
rebonatto 0:65c41a68b49a 88 {
rebonatto 0:65c41a68b49a 89
rebonatto 0:65c41a68b49a 90 LPC_PINCON->PINSEL3 &= ~(3<<18); //GPIO P1.25 - MBED LED LINK
rebonatto 0:65c41a68b49a 91 LPC_PINCON->PINSEL3 &= ~(3<<20); //GPIO P1.26 - MBED LED SPEED
rebonatto 0:65c41a68b49a 92 LPC_PINCON->PINSEL0 &= ~(3<<8); //GPIO P0.4 - ETHERNET GREEN LED
rebonatto 0:65c41a68b49a 93 LPC_PINCON->PINSEL0 &= ~(3<<10); //GPIO P0.5 - ETHERNET YELLOW LED
rebonatto 0:65c41a68b49a 94 LPC_GPIO1->FIODIR &= ~((1<<25)|(1<<26));
rebonatto 0:65c41a68b49a 95 LPC_GPIO0->FIODIR |= ((1<<4)|(1<<5));
rebonatto 0:65c41a68b49a 96
rebonatto 0:65c41a68b49a 97 tcpip_init(tcpip_init_done, NULL);
rebonatto 0:65c41a68b49a 98 tcpip_initialized.wait();
rebonatto 0:65c41a68b49a 99
rebonatto 0:65c41a68b49a 100 memset((void*) &lpcNetif, 0, sizeof(lpcNetif));
rebonatto 0:65c41a68b49a 101 netif_add(&lpcNetif, &ip_n, &netmask_n, &gw_n, NULL, lpc_enetif_init, tcpip_input);
rebonatto 0:65c41a68b49a 102 netif_set_default(&lpcNetif);
rebonatto 0:65c41a68b49a 103
rebonatto 0:65c41a68b49a 104 netif_set_link_callback (&lpcNetif, link_status_callback);
rebonatto 0:65c41a68b49a 105 netif_set_status_callback(&lpcNetif, interface_status_callback);
rebonatto 0:65c41a68b49a 106
rebonatto 0:65c41a68b49a 107 return 0;
rebonatto 0:65c41a68b49a 108 }
rebonatto 0:65c41a68b49a 109
rebonatto 0:65c41a68b49a 110 int EthernetIf::Initialize()
rebonatto 0:65c41a68b49a 111 {
rebonatto 0:65c41a68b49a 112 use_dhcp = true;
rebonatto 0:65c41a68b49a 113
rebonatto 0:65c41a68b49a 114 return _init();
rebonatto 0:65c41a68b49a 115 }
rebonatto 0:65c41a68b49a 116
rebonatto 0:65c41a68b49a 117 int EthernetIf::Initialize(char *ip,char *netmask,char *gw)
rebonatto 0:65c41a68b49a 118 {
rebonatto 0:65c41a68b49a 119 use_dhcp = false;
rebonatto 0:65c41a68b49a 120 inet_aton(ip,&ip_n);
rebonatto 0:65c41a68b49a 121 inet_aton(netmask,&netmask_n);
rebonatto 0:65c41a68b49a 122 inet_aton(gw,&gw_n);
rebonatto 0:65c41a68b49a 123
rebonatto 0:65c41a68b49a 124 return _init();
rebonatto 0:65c41a68b49a 125 }
rebonatto 0:65c41a68b49a 126
rebonatto 0:65c41a68b49a 127 int EthernetIf::Connect(unsigned int timeout /*= 1500*/)
rebonatto 0:65c41a68b49a 128 {
rebonatto 0:65c41a68b49a 129 NVIC_SetPriority(ENET_IRQn, ((0x01 << 3) | 0x01));
rebonatto 0:65c41a68b49a 130 NVIC_EnableIRQ(ENET_IRQn);
rebonatto 0:65c41a68b49a 131
rebonatto 0:65c41a68b49a 132 netif_set_link_up(&lpcNetif);
rebonatto 0:65c41a68b49a 133 int inited;
rebonatto 0:65c41a68b49a 134 inited = netif_up.wait(timeout);
rebonatto 0:65c41a68b49a 135
rebonatto 0:65c41a68b49a 136 osTimerId led_timer = osTimerCreate(osTimer(led), osTimerPeriodic, NULL);
rebonatto 0:65c41a68b49a 137 osTimerStart(led_timer, 100);
rebonatto 0:65c41a68b49a 138
rebonatto 0:65c41a68b49a 139 return (inited > 0) ? (0) : (-1);
rebonatto 0:65c41a68b49a 140 }
rebonatto 0:65c41a68b49a 141
rebonatto 0:65c41a68b49a 142 int EthernetIf::Disconnect()
rebonatto 0:65c41a68b49a 143 {
rebonatto 0:65c41a68b49a 144 if (use_dhcp)
rebonatto 0:65c41a68b49a 145 {
rebonatto 0:65c41a68b49a 146 dhcp_release(&lpcNetif);
rebonatto 0:65c41a68b49a 147 dhcp_stop(&lpcNetif);
rebonatto 0:65c41a68b49a 148 }
rebonatto 0:65c41a68b49a 149 else
rebonatto 0:65c41a68b49a 150 {
rebonatto 0:65c41a68b49a 151 netif_set_down(&lpcNetif);
rebonatto 0:65c41a68b49a 152 }
rebonatto 0:65c41a68b49a 153
rebonatto 0:65c41a68b49a 154 NVIC_DisableIRQ(ENET_IRQn);
rebonatto 0:65c41a68b49a 155
rebonatto 0:65c41a68b49a 156 return 0;
rebonatto 0:65c41a68b49a 157 }
rebonatto 0:65c41a68b49a 158
rebonatto 0:65c41a68b49a 159 bool EthernetIf::is_LinkUp()
rebonatto 0:65c41a68b49a 160 {
rebonatto 0:65c41a68b49a 161 if(netif_is_link_up(&lpcNetif))
rebonatto 0:65c41a68b49a 162 return true;
rebonatto 0:65c41a68b49a 163 else
rebonatto 0:65c41a68b49a 164 return false;
rebonatto 0:65c41a68b49a 165 }
rebonatto 0:65c41a68b49a 166
rebonatto 0:65c41a68b49a 167 bool EthernetIf::is_InterfaceUp()
rebonatto 0:65c41a68b49a 168 {
rebonatto 0:65c41a68b49a 169 if(netif_is_up(&lpcNetif))
rebonatto 0:65c41a68b49a 170 return true;
rebonatto 0:65c41a68b49a 171 else
rebonatto 0:65c41a68b49a 172 return false;
rebonatto 0:65c41a68b49a 173 }
rebonatto 0:65c41a68b49a 174
rebonatto 0:65c41a68b49a 175 char* EthernetIf::get_IpAddress()
rebonatto 0:65c41a68b49a 176 {
rebonatto 0:65c41a68b49a 177 return ipaddr_ntoa(&lpcNetif.ip_addr);
rebonatto 0:65c41a68b49a 178 }
rebonatto 0:65c41a68b49a 179
rebonatto 0:65c41a68b49a 180 char* EthernetIf::get_Netmask()
rebonatto 0:65c41a68b49a 181 {
rebonatto 0:65c41a68b49a 182 return ipaddr_ntoa(&lpcNetif.netmask);
rebonatto 0:65c41a68b49a 183 }
rebonatto 0:65c41a68b49a 184
rebonatto 0:65c41a68b49a 185 char* EthernetIf::get_Gateway()
rebonatto 0:65c41a68b49a 186 {
rebonatto 0:65c41a68b49a 187 return ipaddr_ntoa(&lpcNetif.gw);
rebonatto 0:65c41a68b49a 188 }