Versão atual 13-12-2013.
Dependencies: EthernetInterface mbed-rtos mbed
Rede/EthernetIf.cpp
- Committer:
- rebonatto
- Date:
- 2013-12-13
- Revision:
- 1:238ac24e46dd
- Parent:
- 0:65c41a68b49a
File content as of revision 1:238ac24e46dd:
#include "Rede/EthernetIf.h" #include "lwip/inet.h" #include "lwip/netif.h" #include "netif/etharp.h" #include "lwip/dhcp.h" #include "arch/lpc17_emac.h" #include "lpc_phy.h" #include "lwip/tcpip.h" #include "mbed.h" struct netif EthernetIf::lpcNetif; bool EthernetIf::use_dhcp; ip_addr_t EthernetIf::ip_n; ip_addr_t EthernetIf::netmask_n; ip_addr_t EthernetIf::gw_n; Semaphore EthernetIf::tcpip_initialized(0); Semaphore EthernetIf::link_up(0); Semaphore EthernetIf::netif_up(0); bool EthernetIf::link_is_up(false); uint32_t EthernetIf::os_timer_cb_led[5]; osTimerDef_t EthernetIf::os_timer_def_led = { (led_refresh), (os_timer_cb_led) }; void EthernetIf::tcpip_init_done(void *arg) { //This function is called when the TCPIP stack finishes to initialize tcpip_initialized.release(); } void EthernetIf::link_status_callback(struct netif *netif) { //Called when the interface link goes up or down if(netif_is_link_up(netif)) { printf("Link up!!!\n"); if(!link_is_up) { if(use_dhcp) { dhcp_start(&lpcNetif); } else { netif_set_addr(&lpcNetif,&ip_n,&netmask_n,&gw_n); netif_set_up(&lpcNetif); } } link_up.release(); link_is_up = true; } else { printf("Link down!!!\n"); netif_set_down(&lpcNetif); link_is_up = false; } } void EthernetIf::interface_status_callback(struct netif *netif) { //called when the status of the interface is up or down if(netif_is_up(netif)) { netif_up.release(); printf("Interface Ethernet is up\n"); printf("IP Address: %s\n",get_IpAddress()); printf("Netmask: %s\n",get_Netmask()); printf("Gateway: %s\n\n",get_Gateway()); } } void EthernetIf::led_refresh(void const* arg) { if(LPC_GPIO1->FIOPIN & (1<<25)) LPC_GPIO0->FIOSET |= (1<<4); else LPC_GPIO0->FIOCLR |= (1<<4); if(LPC_GPIO1->FIOPIN & (1<<26)) LPC_GPIO0->FIOSET |= (1<<5); else LPC_GPIO0->FIOCLR |= (1<<5); } int EthernetIf::_init() { LPC_PINCON->PINSEL3 &= ~(3<<18); //GPIO P1.25 - MBED LED LINK LPC_PINCON->PINSEL3 &= ~(3<<20); //GPIO P1.26 - MBED LED SPEED LPC_PINCON->PINSEL0 &= ~(3<<8); //GPIO P0.4 - ETHERNET GREEN LED LPC_PINCON->PINSEL0 &= ~(3<<10); //GPIO P0.5 - ETHERNET YELLOW LED LPC_GPIO1->FIODIR &= ~((1<<25)|(1<<26)); LPC_GPIO0->FIODIR |= ((1<<4)|(1<<5)); tcpip_init(tcpip_init_done, NULL); tcpip_initialized.wait(); memset((void*) &lpcNetif, 0, sizeof(lpcNetif)); netif_add(&lpcNetif, &ip_n, &netmask_n, &gw_n, NULL, lpc_enetif_init, tcpip_input); netif_set_default(&lpcNetif); netif_set_link_callback (&lpcNetif, link_status_callback); netif_set_status_callback(&lpcNetif, interface_status_callback); return 0; } int EthernetIf::Initialize() { use_dhcp = true; return _init(); } int EthernetIf::Initialize(char *ip,char *netmask,char *gw) { use_dhcp = false; inet_aton(ip,&ip_n); inet_aton(netmask,&netmask_n); inet_aton(gw,&gw_n); return _init(); } int EthernetIf::Connect(unsigned int timeout /*= 1500*/) { NVIC_SetPriority(ENET_IRQn, ((0x01 << 3) | 0x01)); NVIC_EnableIRQ(ENET_IRQn); netif_set_link_up(&lpcNetif); int inited; inited = netif_up.wait(timeout); osTimerId led_timer = osTimerCreate(osTimer(led), osTimerPeriodic, NULL); osTimerStart(led_timer, 100); return (inited > 0) ? (0) : (-1); } int EthernetIf::Disconnect() { if (use_dhcp) { dhcp_release(&lpcNetif); dhcp_stop(&lpcNetif); } else { netif_set_down(&lpcNetif); } NVIC_DisableIRQ(ENET_IRQn); return 0; } bool EthernetIf::is_LinkUp() { if(netif_is_link_up(&lpcNetif)) return true; else return false; } bool EthernetIf::is_InterfaceUp() { if(netif_is_up(&lpcNetif)) return true; else return false; } char* EthernetIf::get_IpAddress() { return ipaddr_ntoa(&lpcNetif.ip_addr); } char* EthernetIf::get_Netmask() { return ipaddr_ntoa(&lpcNetif.netmask); } char* EthernetIf::get_Gateway() { return ipaddr_ntoa(&lpcNetif.gw); }