|
31 | 31 | #define ETH_RXBUFNB 4 |
32 | 32 | #define ETH_TXBUFNB 2 |
33 | 33 |
|
| 34 | +#define LINK_THREAD_STACK_SIZE 256 |
| 35 | +#define LINK_THREAD_PREORITY 21 |
| 36 | + |
34 | 37 | extern ETH_DMADESCTypeDef *DMATxDescToSet; |
35 | 38 | extern ETH_DMADESCTypeDef *DMARxDescToGet; |
36 | 39 | extern ETH_DMADESCTypeDef *DMAPTPTxDescToSet; |
37 | 40 | extern ETH_DMADESCTypeDef *DMAPTPRxDescToGet; |
38 | 41 |
|
39 | 42 | static ETH_DMADESCTypeDef DMARxDscrTab[ETH_RXBUFNB], DMATxDscrTab[ETH_TXBUFNB]; |
40 | 43 | static rt_uint8_t Rx_Buff[ETH_RXBUFNB][ETH_MAX_PACKET_SIZE], Tx_Buff[ETH_TXBUFNB][ETH_MAX_PACKET_SIZE]; |
| 44 | +static struct rt_thread eth_link_thread; |
| 45 | +static rt_uint8_t eth_link_stack[LINK_THREAD_STACK_SIZE]; |
41 | 46 |
|
42 | 47 | #define MAX_ADDR_LEN 6 |
43 | 48 | /* Gloable variables ---------------------------------------------------------*/ |
@@ -634,6 +639,37 @@ struct pbuf *rt_at32_eth_rx(rt_device_t dev) |
634 | 639 | return p; |
635 | 640 | } |
636 | 641 |
|
| 642 | +static void eth_link_thread_entry(void *paramter) |
| 643 | +{ |
| 644 | + uint8_t linked_down = 1; |
| 645 | + |
| 646 | + struct netif *pnetif = at32_eth_device.parent.netif; |
| 647 | + |
| 648 | + while(1){ |
| 649 | + if((ETH_ReadPHYRegister(PHY_ADDRESS, PHY_BSR) & PHY_Linked_Status) && (linked_down == 1)) |
| 650 | + { |
| 651 | + /* link up */ |
| 652 | + linked_down = 0; |
| 653 | +#ifndef RT_LWIP_DHCP |
| 654 | + pnetif->ip_addr = inet_addr(RT_LWIP_IPADDR); |
| 655 | + pnetif->gw = inet_addr(RT_LWIP_GWADDR); |
| 656 | + pnetif->netmask = inet_addr(RT_LWIP_MSKADDR); |
| 657 | +#else |
| 658 | + IP4_ADDR(&(pnetif->ip_addr), 0, 0, 0, 0); |
| 659 | + IP4_ADDR(&(pnetif->netmask), 0, 0, 0, 0); |
| 660 | + IP4_ADDR(&(pnetif->gw), 0, 0, 0, 0); |
| 661 | +#endif |
| 662 | + eth_device_linkchange(&(at32_eth_device.parent), RT_TRUE); |
| 663 | + }else if(!(ETH_ReadPHYRegister(PHY_ADDRESS, PHY_BSR) & PHY_Linked_Status) && (linked_down == 0)) |
| 664 | + { |
| 665 | + /* link down */ |
| 666 | + linked_down = 1; |
| 667 | + eth_device_linkchange(&(at32_eth_device.parent), RT_FALSE); |
| 668 | + } |
| 669 | + rt_thread_mdelay(500); |
| 670 | + } |
| 671 | +} |
| 672 | + |
637 | 673 | /* interrupt service routine */ |
638 | 674 | void ETH_IRQHandler(void) |
639 | 675 | { |
@@ -707,9 +743,17 @@ static int rt_hw_at32_eth_init(void) |
707 | 743 |
|
708 | 744 | /* register eth device */ |
709 | 745 | state = eth_device_init(&(at32_eth_device.parent), "e0"); |
| 746 | + |
710 | 747 | if (RT_EOK == state) |
711 | 748 | { |
712 | 749 | LOG_D("emac device init success"); |
| 750 | + |
| 751 | + state = rt_thread_init(ð_link_thread, "eth_link_detect", eth_link_thread_entry, RT_NULL, |
| 752 | + ð_link_stack[0], LINK_THREAD_STACK_SIZE, LINK_THREAD_PREORITY, 20); |
| 753 | + if (state == RT_EOK) |
| 754 | + { |
| 755 | + rt_thread_startup(ð_link_thread); |
| 756 | + } |
713 | 757 | } |
714 | 758 | else |
715 | 759 | { |
|
0 commit comments