STM32 Ethernet: Using Timer Instead of Poll Thread
Signed-off-by: xiaofan <xfan1024@live.com>
This commit is contained in:
parent
2a9e7c0eea
commit
4eb2d7eed0
@ -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)
|
|||||||
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
|
#endif
|
||||||
break;
|
#else /* PHY_USING_INTERRUPT_MODE */
|
||||||
#endif
|
stm32_eth_device.poll_link_timer = rt_timer_create("phylnk", (void (*)(void*))phy_linkchange,
|
||||||
} /* link up. */
|
NULL, RT_TICK_PER_SECOND, RT_TIMER_FLAG_PERIODIC);
|
||||||
else
|
if (!stm32_eth_device.poll_link_timer || rt_timer_start(stm32_eth_device.poll_link_timer) != RT_EOK)
|
||||||
{
|
{
|
||||||
LOG_I("link down");
|
LOG_E("Start link change detection timer failed");
|
||||||
/* send link down. */
|
|
||||||
eth_device_linkchange(&stm32_eth_device.parent, RT_FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
rt_thread_delay(RT_TICK_PER_SECOND);
|
|
||||||
}
|
}
|
||||||
|
#endif /* PHY_USING_INTERRUPT_MODE */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register the EMAC device */
|
/* Register the EMAC device */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user