/* This file holds the code that checks for ETH link status This is part of the DHCP process */ #include "streamAtlona.h" #include "UserInterface.h" #include "SynchronizationTask.h" #include "lwip/netif.h" #include "phy_bsp.h" #include "stm32f7xx_eth_conf.h" #include "stm32f7xx_eth.h" #include "DHCP_Client.h" static xTaskHandle xLinkProcTaskHandle = NULL; static bool RemoteLink = FALSE; //******************************************************************************* // ETH Link task //******************************************************************************* void vETH_LinkTask( void *pvParameters ) { bool LinkStat = FALSE, SavedEthLinkStatus = FALSE; bool RemoteSavedEthLinkStatus = FALSE; struct netif *netif = (struct netif *)pvParameters; xLinkProcTaskHandle = xTaskGetCurrentTaskHandle(); while(1) { if(PHY_GetLinkStatus(PHY3_ADDRESS, &LinkStat) == TRUE) { if((SavedEthLinkStatus != LinkStat) || (RemoteSavedEthLinkStatus != RemoteLink)) { if(SavedEthLinkStatus != LinkStat) { // local ETH link status change streamPrint(DefaultInterface,FALSE, "TX ETH Link is: %s\r\n", (LinkStat == FALSE)? "OFF" : "ON"); } if(RemoteSavedEthLinkStatus != RemoteLink) { // remote ETH link status change streamPrint(DefaultInterface,FALSE, "RX ETH Link is: %s\r\n", (RemoteLink == FALSE)? "OFF" : "ON"); } // update the devices ETH data if((LinkStat == TRUE) || (RemoteLink == TRUE)) { // only if both sides were disconnected and one was connected if((SavedEthLinkStatus == FALSE) && (RemoteSavedEthLinkStatus == FALSE)) { netif_set_link_up(netif); #ifdef USE_DHCP SetDhcpState(eDHCP_Start); #endif SET_ETH_LINK_LED_ON(); } } else { netif_set_link_down(netif); #ifdef USE_DHCP SetDhcpState(eDHCP_LinkDown); #endif SET_ETH_LINK_LED_OFF(); } SavedEthLinkStatus = LinkStat; RemoteSavedEthLinkStatus = RemoteLink; } } vTaskDelay((100 / portTICK_RATE_MS)); } } //----------------------------------------------------------------------------- void SuspendLinkTask(void) { vTaskSuspend(xLinkProcTaskHandle); } //----------------------------------------------------------------------------- void ResumeLinkTask(void) { vTaskResume(xLinkProcTaskHandle); } //----------------------------------------------------------------------------- bool IsEthLinkUp(void) { bool RetVal = FALSE; bool LinkStat = FALSE; if(PHY_GetLinkStatus(PHY3_ADDRESS, &LinkStat) == TRUE) { RetVal = LinkStat; } return RetVal; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void SetRemoteLink(bool Link) { RemoteLink = Link; }