提交 4eb2d7ee 编写于 作者: X xiaofan 提交者: Tan Xiaofan

STM32 Ethernet: Using Timer Instead of Poll Thread

Signed-off-by: Nxiaofan <xfan1024@live.com>
上级 2a9e7c0e
...@@ -35,6 +35,9 @@ struct rt_stm32_eth ...@@ -35,6 +35,9 @@ struct rt_stm32_eth
{ {
/* inherit from ethernet device */ /* inherit from ethernet device */
struct eth_device parent; struct eth_device parent;
#ifndef PHY_USING_INTERRUPT_MODE
rt_timer_t poll_link_timer;
#endif
/* interface address info, hw address */ /* interface address info, hw address */
rt_uint8_t dev_addr[MAX_ADDR_LEN]; rt_uint8_t dev_addr[MAX_ADDR_LEN];
...@@ -515,35 +518,26 @@ static void phy_monitor_thread_entry(void *parameter) ...@@ -515,35 +518,26 @@ static void phy_monitor_thread_entry(void *parameter)
rt_thread_mdelay(2000); rt_thread_mdelay(2000);
HAL_ETH_WritePHYRegister(&EthHandle, PHY_BASIC_CONTROL_REG, PHY_AUTO_NEGOTIATION_MASK); HAL_ETH_WritePHYRegister(&EthHandle, PHY_BASIC_CONTROL_REG, PHY_AUTO_NEGOTIATION_MASK);
while (1) phy_linkchange();
{
phy_linkchange();
if (stm32_eth_device.parent.netif->flags & NETIF_FLAG_LINK_UP)
{
#ifdef PHY_USING_INTERRUPT_MODE #ifdef PHY_USING_INTERRUPT_MODE
/* configuration intterrupt pin */ /* configuration intterrupt pin */
rt_pin_mode(PHY_INT_PIN, PIN_MODE_INPUT_PULLUP); rt_pin_mode(PHY_INT_PIN, PIN_MODE_INPUT_PULLUP);
rt_pin_attach_irq(PHY_INT_PIN, PIN_IRQ_MODE_FALLING, eth_phy_isr, (void *)"callbackargs"); rt_pin_attach_irq(PHY_INT_PIN, PIN_IRQ_MODE_FALLING, eth_phy_isr, (void *)"callbackargs");
rt_pin_irq_enable(PHY_INT_PIN, PIN_IRQ_ENABLE); rt_pin_irq_enable(PHY_INT_PIN, PIN_IRQ_ENABLE);
/* enable phy interrupt */ /* enable phy interrupt */
HAL_ETH_WritePHYRegister(&EthHandle, PHY_INTERRUPT_MASK_REG, PHY_INT_MASK); HAL_ETH_WritePHYRegister(&EthHandle, PHY_INTERRUPT_MASK_REG, PHY_INT_MASK);
#if defined(PHY_INTERRUPT_CTRL_REG) #if defined(PHY_INTERRUPT_CTRL_REG)
HAL_ETH_WritePHYRegister(&EthHandle, PHY_INTERRUPT_CTRL_REG, PHY_INTERRUPT_EN); HAL_ETH_WritePHYRegister(&EthHandle, PHY_INTERRUPT_CTRL_REG, PHY_INTERRUPT_EN);
#endif
break;
#endif #endif
} /* link up. */ #else /* PHY_USING_INTERRUPT_MODE */
else stm32_eth_device.poll_link_timer = rt_timer_create("phylnk", (void (*)(void*))phy_linkchange,
{ NULL, RT_TICK_PER_SECOND, RT_TIMER_FLAG_PERIODIC);
LOG_I("link down"); if (!stm32_eth_device.poll_link_timer || rt_timer_start(stm32_eth_device.poll_link_timer) != RT_EOK)
/* send link down. */ {
eth_device_linkchange(&stm32_eth_device.parent, RT_FALSE); LOG_E("Start link change detection timer failed");
}
rt_thread_delay(RT_TICK_PER_SECOND);
} }
#endif /* PHY_USING_INTERRUPT_MODE */
} }
/* Register the EMAC device */ /* Register the EMAC device */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册