/** * @brief Clean up th ethernet services and free resources * @param None * @retval None */ static void ETHERNET_Cleanup(void) { EthernetSettings.DistantControlEnabled = 0; EthernetSettings.BackgroundEnabled = 0; EthernetSettings.InitDone = 0; ETH_Stop(); vTaskPrioritySet(Task_Handle, (configMAX_PRIORITIES - 1)); if(ETH_Task_Handle != NULL) { vTaskDelete(ETH_Task_Handle); ETH_Task_Handle = NULL; } vQueueDelete( Ethernet_xSemaphore ); Ethernet_xSemaphore = NULL; if(TCPIP_Task_Handle != NULL) { vTaskSuspend(TCPIP_Task_Handle); } if(HTTP_Task_Handle != NULL) { vTaskDelete(HTTP_Task_Handle); HTTP_Task_Handle = NULL; } if(DHCP_Task_Handle != NULL) { vTaskDelete(DHCP_Task_Handle); DHCP_Task_Handle = NULL; } netif_remove(&xnetif); }
/** * @brief Return the module main menu from Webserver page * @param None * @retval None */ static void return_from_webserver(void) { EthernetSettings.WebserverEnabled = 0; EthernetSettings.InitDone = 0; ETH_Stop(); vTaskPrioritySet(Task_Handle, (configMAX_PRIORITIES - 1)); if(ETH_Task_Handle != NULL) { vTaskDelete(ETH_Task_Handle); ETH_Task_Handle = NULL; } if (Ethernet_xSemaphore != NULL) { vQueueDelete( Ethernet_xSemaphore ); Ethernet_xSemaphore = NULL; } if(TCPIP_Task_Handle != NULL) { vTaskSuspend(TCPIP_Task_Handle); } if(HTTP_Task_Handle != NULL) { vTaskDelete(HTTP_Task_Handle); HTTP_Task_Handle = NULL; } if(DHCP_Task_Handle != NULL) { vTaskDelete(DHCP_Task_Handle); DHCP_Task_Handle = NULL; } DMA_Cmd(DMA2_Stream1, DISABLE); DCMI_Cmd(DISABLE); DCMI_CaptureCmd(DISABLE); netif_remove(&xnetif); ETHERNET_SwitchPage(EthernetWebServerPage, ETHERNET_MAIN_PAGE); EthernetWebServerPage = NULL; }
/** * @brief Link callback function, this function is called on change of link status. * @param The network interface * @retval None */ void ETH_link_callback(struct netif *netif) { __IO uint32_t timeout = 0; uint32_t tmpreg; uint16_t RegValue; struct ip_addr ipaddr; struct ip_addr netmask; struct ip_addr gw; #ifndef USE_DHCP uint8_t iptab[4] = {0}; uint8_t iptxt[20]; #endif /* USE_DHCP */ /* Clear LCD */ // LCD_ClearLine(Line4); // LCD_ClearLine(Line5); // LCD_ClearLine(Line6); // LCD_ClearLine(Line7); // LCD_ClearLine(Line8); // LCD_ClearLine(Line9); if(netif_is_link_up(netif)) { /* Restart the auto-negotiation */ if(ETH_InitStructure.ETH_AutoNegotiation != ETH_AutoNegotiation_Disable) { /* Reset Timeout counter */ timeout = 0; /* Enable auto-negotiation */ ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_BCR, PHY_AutoNegotiation); /* Wait until the auto-negotiation will be completed */ do { timeout++; } while (!(ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO)); /* Reset Timeout counter */ timeout = 0; /* Read the result of the auto-negotiation */ RegValue = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_SR); /* Configure the MAC with the Duplex Mode fixed by the auto-negotiation process */ if((RegValue & PHY_DUPLEX_STATUS) != (uint16_t)RESET) { /* Set Ethernet duplex mode to Full-duplex following the auto-negotiation */ ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex; } else { /* Set Ethernet duplex mode to Half-duplex following the auto-negotiation */ ETH_InitStructure.ETH_Mode = ETH_Mode_HalfDuplex; } /* Configure the MAC with the speed fixed by the auto-negotiation process */ if(RegValue & PHY_SPEED_STATUS) { /* Set Ethernet speed to 10M following the auto-negotiation */ ETH_InitStructure.ETH_Speed = ETH_Speed_10M; } else { /* Set Ethernet speed to 100M following the auto-negotiation */ ETH_InitStructure.ETH_Speed = ETH_Speed_100M; } /*------------------------ ETHERNET MACCR Re-Configuration --------------------*/ /* Get the ETHERNET MACCR value */ tmpreg = ETH->MACCR; /* Set the FES bit according to ETH_Speed value */ /* Set the DM bit according to ETH_Mode value */ tmpreg |= (uint32_t)(ETH_InitStructure.ETH_Speed | ETH_InitStructure.ETH_Mode); /* Write to ETHERNET MACCR */ ETH->MACCR = (uint32_t)tmpreg; _eth_delay_(ETH_REG_WRITE_DELAY); tmpreg = ETH->MACCR; ETH->MACCR = tmpreg; } /* Restart MAC interface */ ETH_Start(); #ifdef USE_DHCP ipaddr.addr = 0; netmask.addr = 0; gw.addr = 0; DHCP_state = DHCP_START; #else IP4_ADDR(&ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3); IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1 , NETMASK_ADDR2, NETMASK_ADDR3); IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3); #endif /* USE_DHCP */ netif_set_addr(&gnetif, &ipaddr , &netmask, &gw); /* When the netif is fully configured this function must be called.*/ netif_set_up(&gnetif); #ifdef USE_LCD /* Set the LCD Text Color */ LCD_SetTextColor(Green); /* Display message on the LCD */ LCD_DisplayStringLine(Line5, (uint8_t*)" Network Cable is "); LCD_DisplayStringLine(Line6, (uint8_t*)" now connected "); /* Set the LCD Text Color */ LCD_SetTextColor(White); #ifndef USE_DHCP /* Display static IP address */ iptab[0] = IP_ADDR3; iptab[1] = IP_ADDR2; iptab[2] = IP_ADDR1; iptab[3] = IP_ADDR0; sprintf((char*)iptxt, " %d.%d.%d.%d", iptab[3], iptab[2], iptab[1], iptab[0]); LCD_DisplayStringLine(Line8, (uint8_t*)" Static IP address "); LCD_DisplayStringLine(Line9, iptxt); /* Clear LCD */ LCD_ClearLine(Line5); LCD_ClearLine(Line6); #endif /* USE_DHCP */ #endif /* USE_LCD */ EthLinkStatus = 0; } else { ETH_Stop(); #ifdef USE_DHCP DHCP_state = DHCP_LINK_DOWN; dhcp_stop(netif); #endif /* USE_DHCP */ /* When the netif link is down this function must be called.*/ netif_set_down(&gnetif); #ifdef USE_LCD /* Set the LCD Text Color */ LCD_SetTextColor(Red); /* Display message on the LCD */ LCD_DisplayStringLine(Line5, (uint8_t*)" Network Cable is "); LCD_DisplayStringLine(Line6, (uint8_t*)" unplugged "); /* Set the LCD Text Color */ LCD_SetTextColor(White); #endif /* USE_LCD */ } }
/** * @brief Link callback function, this function is called on change of link status. * @param The network interface * @retval None */ void ETH_link_callback(struct netif *netif) { __IO uint32_t timeout = 0; uint32_t tmpreg,RegValue; struct ip_addr ipaddr; struct ip_addr netmask; struct ip_addr gw; #ifndef USE_DHCP uint8_t iptab[4] = {0}; uint8_t iptxt[20]; #endif /* USE_DHCP */ if(netif_is_link_up(netif)) { /* Restart the autonegotiation */ if(ETH_InitStructure.ETH_AutoNegotiation != ETH_AutoNegotiation_Disable) { /* Reset Timeout counter */ timeout = 0; /* Enable Auto-Negotiation */ ETH_WritePHYRegister(BOARD_PHY_ADDRESS, PHY_BCR, PHY_AutoNegotiation); /* Wait until the auto-negotiation will be completed */ do { timeout++; } while (!(ETH_ReadPHYRegister(BOARD_PHY_ADDRESS, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO)); /* Reset Timeout counter */ timeout = 0; /* Read the result of the auto-negotiation */ RegValue = ETH_ReadPHYRegister(BOARD_PHY_ADDRESS, PHY_SR); /* Configure the MAC with the Duplex Mode fixed by the auto-negotiation process */ if((RegValue & PHY_DUPLEX_STATUS) != (uint32_t)RESET) { /* Set Ethernet duplex mode to Full-duplex following the auto-negotiation */ ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex; } else { /* Set Ethernet duplex mode to Half-duplex following the auto-negotiation */ ETH_InitStructure.ETH_Mode = ETH_Mode_HalfDuplex; } /* Configure the MAC with the speed fixed by the auto-negotiation process */ if(RegValue & PHY_SPEED_STATUS) { /* Set Ethernet speed to 10M following the auto-negotiation */ ETH_InitStructure.ETH_Speed = ETH_Speed_10M; } else { /* Set Ethernet speed to 100M following the auto-negotiation */ ETH_InitStructure.ETH_Speed = ETH_Speed_100M; } /*------------------------ ETHERNET MACCR Re-Configuration --------------------*/ /* Get the ETHERNET MACCR value */ tmpreg = ETH->MACCR; /* Set the FES bit according to ETH_Speed value */ /* Set the DM bit according to ETH_Mode value */ tmpreg |= (uint32_t)(ETH_InitStructure.ETH_Speed | ETH_InitStructure.ETH_Mode); /* Write to ETHERNET MACCR */ ETH->MACCR = (uint32_t)tmpreg; _eth_delay_(ETH_REG_WRITE_DELAY); tmpreg = ETH->MACCR; ETH->MACCR = tmpreg; } /* Restart MAC interface */ ETH_Start(); #ifdef USE_DHCP ipaddr.addr = 0; netmask.addr = 0; gw.addr = 0; DHCP_state = DHCP_START; #else IP4_ADDR(&ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_lastOctet); IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1 , NETMASK_ADDR2, NETMASK_ADDR3); IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3); #endif /* USE_DHCP */ netif_set_addr(&gnetif, &ipaddr , &netmask, &gw); /* When the netif is fully configured this function must be called.*/ netif_set_up(&gnetif); } else { ETH_Stop(); #ifdef USE_DHCP DHCP_state = DHCP_LINK_DOWN; dhcp_stop(netif); #endif /* USE_DHCP */ /* When the netif link is down this function must be called.*/ netif_set_down(&gnetif); } }