![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Versão atual 13-12-2013.
Dependencies: EthernetInterface mbed-rtos mbed
Rede/EthernetIf.cpp@0:65c41a68b49a, 2013-12-13 (annotated)
- Committer:
- rebonatto
- Date:
- Fri Dec 13 11:42:59 2013 +0000
- Revision:
- 0:65c41a68b49a
Versao atual 13-12-2013.
Who changed what in which revision?
User | Revision | Line number | New 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 | } |