Browse Source

Merge pull request #2762 from SummerGGift/phy_check

[stm32][driver] Fix the problems of PHY status examination mentioned in issue #2756
Bernard Xiong 6 years ago
parent
commit
bcf77abad6
1 changed files with 39 additions and 22 deletions
  1. 39 22
      bsp/stm32/libraries/HAL_Drivers/drv_eth.c

+ 39 - 22
bsp/stm32/libraries/HAL_Drivers/drv_eth.c

@@ -7,6 +7,7 @@
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-11-19     SummerGift   first version
  * 2018-11-19     SummerGift   first version
  * 2018-12-25     zylx         fix some bugs
  * 2018-12-25     zylx         fix some bugs
+ * 2019-06-10     SummerGift   optimize PHY state detection process 
  */
  */
 
 
 #include "board.h"
 #include "board.h"
@@ -382,7 +383,7 @@ void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth)
     rt_err_t result;
     rt_err_t result;
     result = eth_device_ready(&(stm32_eth_device.parent));
     result = eth_device_ready(&(stm32_eth_device.parent));
     if (result != RT_EOK)
     if (result != RT_EOK)
-        LOG_E("RX err = %d", result);
+        LOG_I("RxCpltCallback err = %d", result);
 }
 }
 
 
 void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth)
 void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth)
@@ -468,34 +469,50 @@ static void phy_monitor_thread_entry(void *parameter)
 
 
     while (1)
     while (1)
     {
     {
-        HAL_ETH_ReadPHYRegister(&EthHandle, PHY_BASIC_STATUS_REG, (uint32_t *)&status);
-        LOG_D("PHY BASIC STATUS REG:0x%04X", status);
-
         phy_speed_new = 0;
         phy_speed_new = 0;
 
 
-        if (status & (PHY_AUTONEGO_COMPLETE_MASK | PHY_LINKED_STATUS_MASK))
+        if(HAL_ETH_ReadPHYRegister(&EthHandle, PHY_BASIC_STATUS_REG, (uint32_t *)&status) == HAL_OK)
         {
         {
-            rt_uint32_t SR;
-
-            phy_speed_new = PHY_LINK_MASK;
-
-            SR = HAL_ETH_ReadPHYRegister(&EthHandle, PHY_Status_REG, (uint32_t *)&SR);
-            LOG_D("PHY Control/Status REG:0x%04X ", SR);
-
-            if (SR & PHY_100M_MASK)
+            LOG_D("PHY BASIC STATUS REG:0x%04X", status);
+            
+            if (status & (PHY_AUTONEGO_COMPLETE_MASK | PHY_LINKED_STATUS_MASK))
             {
             {
-                phy_speed_new |= PHY_100M_MASK;
-            }
-            else if (SR & PHY_10M_MASK)
-            {
-                phy_speed_new |= PHY_10M_MASK;
-            }
+                rt_uint32_t SR;
 
 
-            if (SR & PHY_FULL_DUPLEX_MASK)
-            {
-                phy_speed_new |= PHY_FULL_DUPLEX_MASK;
+                phy_speed_new = PHY_LINK_MASK;
+
+                if(HAL_ETH_ReadPHYRegister(&EthHandle, PHY_Status_REG, (uint32_t *)&SR) == HAL_OK)
+                {
+                    LOG_D("PHY Control/Status REG:0x%04X ", SR); 
+
+                    if (SR & PHY_100M_MASK)
+                    {
+                        phy_speed_new |= PHY_100M_MASK;
+                    }
+                    else if (SR & PHY_10M_MASK)
+                    {
+                        phy_speed_new |= PHY_10M_MASK;
+                    }
+
+                    if (SR & PHY_FULL_DUPLEX_MASK)
+                    {
+                        phy_speed_new |= PHY_FULL_DUPLEX_MASK;
+                    }
+                }
+                else
+                {
+                    LOG_D("PHY PHY_Status_REG read error."); 
+                    rt_thread_mdelay(100);
+                    continue;
+                }
             }
             }
         }
         }
+        else
+        {
+            LOG_D("PHY_BASIC_STATUS_REG read error."); 
+            rt_thread_mdelay(100);
+            continue;
+        }
 
 
         /* linkchange */
         /* linkchange */
         if (phy_speed_new != phy_speed)
         if (phy_speed_new != phy_speed)