Merge pull request #2762 from SummerGGift/phy_check

[stm32][driver] Fix the problems of PHY status examination mentioned in issue #2756
This commit is contained in:
Bernard Xiong 2019-06-12 06:27:46 +08:00 committed by GitHub
commit bcf77abad6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 39 additions and 22 deletions

View File

@ -7,6 +7,7 @@
* Date Author Notes
* 2018-11-19 SummerGift first version
* 2018-12-25 zylx fix some bugs
* 2019-06-10 SummerGift optimize PHY state detection process
*/
#include "board.h"
@ -382,7 +383,7 @@ void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth)
rt_err_t result;
result = eth_device_ready(&(stm32_eth_device.parent));
if (result != RT_EOK)
LOG_E("RX err = %d", result);
LOG_I("RxCpltCallback err = %d", result);
}
void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth)
@ -468,34 +469,50 @@ static void phy_monitor_thread_entry(void *parameter)
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;
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;
LOG_D("PHY BASIC STATUS REG:0x%04X", status);
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)
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 */
if (phy_speed_new != phy_speed)