Browse Source

[bsp] update eth driver: fix phy init never timeout bug

tanek liang 7 years ago
parent
commit
5fd89e4461
2 changed files with 94 additions and 79 deletions
  1. 87 76
      bsp/imxrt1052-evk/drivers/drv_eth.c
  2. 7 3
      bsp/imxrt1052-evk/drivers/fsl_phy.c

+ 87 - 76
bsp/imxrt1052-evk/drivers/drv_eth.c

@@ -28,7 +28,7 @@
 
 
 #include <netif/ethernetif.h>
 #include <netif/ethernetif.h>
 #include "lwipopts.h"
 #include "lwipopts.h"
-     
+
 #define ENET_RXBD_NUM (4)
 #define ENET_RXBD_NUM (4)
 #define ENET_TXBD_NUM (4)
 #define ENET_TXBD_NUM (4)
 #define ENET_RXBUFF_SIZE (ENET_FRAME_MAX_FRAMELEN)
 #define ENET_RXBUFF_SIZE (ENET_FRAME_MAX_FRAMELEN)
@@ -36,16 +36,17 @@
 
 
 #define PHY_ADDRESS     0x02u
 #define PHY_ADDRESS     0x02u
 
 
+
+
 /* debug option */
 /* debug option */
-//#define DEBUG
 //#define ETH_RX_DUMP
 //#define ETH_RX_DUMP
 //#define ETH_TX_DUMP
 //#define ETH_TX_DUMP
 
 
-#ifdef DEBUG
-#define ETH_PRINTF          rt_kprintf
-#else
-#define ETH_PRINTF(...)
-#endif
+#define DBG_ENABLE
+#define DBG_SECTION_NAME    "[ETH]"
+#define DBG_COLOR
+#define DBG_LEVEL           DBG_INFO
+#include <rtdbg.h>
 
 
 #define MAX_ADDR_LEN 6
 #define MAX_ADDR_LEN 6
 
 
@@ -54,12 +55,12 @@ struct rt_imxrt_eth
 {
 {
 	/* inherit from ethernet device */
 	/* inherit from ethernet device */
 	struct eth_device parent;
 	struct eth_device parent;
-    
+
     enet_handle_t enet_handle;
     enet_handle_t enet_handle;
     ENET_Type *enet_base;
     ENET_Type *enet_base;
     enet_data_error_stats_t error_statistic;
     enet_data_error_stats_t error_statistic;
 	rt_uint8_t  dev_addr[MAX_ADDR_LEN];			/* hw address	*/
 	rt_uint8_t  dev_addr[MAX_ADDR_LEN];			/* hw address	*/
-    
+
     rt_bool_t tx_is_waiting;
     rt_bool_t tx_is_waiting;
     struct rt_semaphore tx_wait;
     struct rt_semaphore tx_wait;
 };
 };
@@ -75,9 +76,9 @@ static struct rt_imxrt_eth imxrt_eth_device;
 void _enet_rx_callback(struct rt_imxrt_eth * eth)
 void _enet_rx_callback(struct rt_imxrt_eth * eth)
 {
 {
     rt_err_t result;
     rt_err_t result;
-    
+
     ENET_DisableInterrupts(eth->enet_base, kENET_RxFrameInterrupt);
     ENET_DisableInterrupts(eth->enet_base, kENET_RxFrameInterrupt);
-    
+
     result = eth_device_ready(&(eth->parent));
     result = eth_device_ready(&(eth->parent));
     if( result != RT_EOK )
     if( result != RT_EOK )
         rt_kprintf("RX err =%d\n", result );
         rt_kprintf("RX err =%d\n", result );
@@ -97,30 +98,30 @@ void _enet_callback(ENET_Type *base, enet_handle_t *handle, enet_event_t event,
     switch(event)
     switch(event)
     {
     {
     case kENET_RxEvent:
     case kENET_RxEvent:
-        
+
         _enet_rx_callback((struct rt_imxrt_eth *)userData);
         _enet_rx_callback((struct rt_imxrt_eth *)userData);
         break;
         break;
-        
+
     case kENET_TxEvent:
     case kENET_TxEvent:
         _enet_tx_callback((struct rt_imxrt_eth *)userData);
         _enet_tx_callback((struct rt_imxrt_eth *)userData);
         break;
         break;
-        
+
     case kENET_ErrEvent:
     case kENET_ErrEvent:
         //rt_kprintf("kENET_ErrEvent\n");
         //rt_kprintf("kENET_ErrEvent\n");
         break;
         break;
-        
+
     case kENET_WakeUpEvent:
     case kENET_WakeUpEvent:
         //rt_kprintf("kENET_WakeUpEvent\n");
         //rt_kprintf("kENET_WakeUpEvent\n");
         break;
         break;
-        
+
     case kENET_TimeStampEvent:
     case kENET_TimeStampEvent:
         //rt_kprintf("kENET_TimeStampEvent\n");
         //rt_kprintf("kENET_TimeStampEvent\n");
         break;
         break;
-        
+
     case kENET_TimeStampAvailEvent:
     case kENET_TimeStampAvailEvent:
         //rt_kprintf("kENET_TimeStampAvailEvent \n");
         //rt_kprintf("kENET_TimeStampAvailEvent \n");
         break;
         break;
-        
+
     default:
     default:
         //rt_kprintf("unknow error\n");
         //rt_kprintf("unknow error\n");
         break;
         break;
@@ -314,21 +315,21 @@ static void _enet_io_init(void)
                                                  Pull Up / Down Config. Field: 100K Ohm Pull Up
                                                  Pull Up / Down Config. Field: 100K Ohm Pull Up
                                                  Hyst. Enable Field: Hysteresis Disabled */
                                                  Hyst. Enable Field: Hysteresis Disabled */
 
 
-  
+
 }
 }
 
 
 static void _enet_clk_init(void)
 static void _enet_clk_init(void)
 {
 {
     const clock_enet_pll_config_t config = {true, false, false, 1, 1};
     const clock_enet_pll_config_t config = {true, false, false, 1, 1};
     CLOCK_InitEnetPll(&config);
     CLOCK_InitEnetPll(&config);
-    
+
     IOMUXC_EnableMode(IOMUXC_GPR, kIOMUXC_GPR_ENET1TxClkOutputDir, true);
     IOMUXC_EnableMode(IOMUXC_GPR, kIOMUXC_GPR_ENET1TxClkOutputDir, true);
 }
 }
 
 
 static void _delay(void)
 static void _delay(void)
 {
 {
     volatile int i = 1000000;
     volatile int i = 1000000;
-    
+
     while (i--)
     while (i--)
         i = i;
         i = i;
 }
 }
@@ -336,7 +337,7 @@ static void _delay(void)
 static void _enet_phy_reset_by_gpio(void)
 static void _enet_phy_reset_by_gpio(void)
 {
 {
     gpio_pin_config_t gpio_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
     gpio_pin_config_t gpio_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
-    
+
     GPIO_PinInit(GPIO1, 9, &gpio_config);
     GPIO_PinInit(GPIO1, 9, &gpio_config);
     GPIO_PinInit(GPIO1, 10, &gpio_config);
     GPIO_PinInit(GPIO1, 10, &gpio_config);
     /* pull up the ENET_INT before RESET. */
     /* pull up the ENET_INT before RESET. */
@@ -354,7 +355,7 @@ static void _enet_config(void)
     phy_speed_t speed;
     phy_speed_t speed;
     phy_duplex_t duplex;
     phy_duplex_t duplex;
     bool link = false;
     bool link = false;
-    
+
     /* prepare the buffer configuration. */
     /* prepare the buffer configuration. */
     enet_buffer_config_t buffConfig = {
     enet_buffer_config_t buffConfig = {
         ENET_RXBD_NUM,
         ENET_RXBD_NUM,
@@ -366,7 +367,7 @@ static void _enet_config(void)
         &g_rxDataBuff[0][0],
         &g_rxDataBuff[0][0],
         &g_txDataBuff[0][0],
         &g_txDataBuff[0][0],
     };
     };
-    
+
     /* Get default configuration. */
     /* Get default configuration. */
     /*
     /*
      * config.miiMode = kENET_RmiiMode;
      * config.miiMode = kENET_RmiiMode;
@@ -377,26 +378,36 @@ static void _enet_config(void)
     ENET_GetDefaultConfig(&config);
     ENET_GetDefaultConfig(&config);
     config.interrupt = kENET_TxFrameInterrupt | kENET_RxFrameInterrupt;
     config.interrupt = kENET_TxFrameInterrupt | kENET_RxFrameInterrupt;
     //config.interrupt = 0xFFFFFFFF;
     //config.interrupt = 0xFFFFFFFF;
-    
+
     /* Set SMI to get PHY link status. */
     /* Set SMI to get PHY link status. */
     sysClock = CLOCK_GetFreq(kCLOCK_AhbClk);
     sysClock = CLOCK_GetFreq(kCLOCK_AhbClk);
+
     status = PHY_Init(imxrt_eth_device.enet_base, PHY_ADDRESS, sysClock);
     status = PHY_Init(imxrt_eth_device.enet_base, PHY_ADDRESS, sysClock);
-    while (status != kStatus_Success)
+
+    if (status == kStatus_Success)
     {
     {
-        ETH_PRINTF("\r\nPHY Auto-negotiation failed. Please check the cable connection and link partner setting.\r\n");
-        status = PHY_Init(imxrt_eth_device.enet_base, PHY_ADDRESS, sysClock);
+        PHY_GetLinkStatus(imxrt_eth_device.enet_base, PHY_ADDRESS, &link);
+        if (link)
+        {
+            /* Get the actual PHY link speed. */
+            PHY_GetLinkSpeedDuplex(imxrt_eth_device.enet_base, PHY_ADDRESS, &speed, &duplex);
+            /* Change the MII speed and duplex for actual link status. */
+            config.miiSpeed = (enet_mii_speed_t)speed;
+            config.miiDuplex = (enet_mii_duplex_t)duplex;
+        }
+
+        dbg_log(DBG_LOG, "PHY Auto-negotiation success.\n");
+        eth_device_linkchange(&imxrt_eth_device.parent, RT_TRUE);
     }
     }
-    
-    PHY_GetLinkStatus(imxrt_eth_device.enet_base, PHY_ADDRESS, &link);
-    if (link)
+    else
     {
     {
-        /* Get the actual PHY link speed. */
-        PHY_GetLinkSpeedDuplex(imxrt_eth_device.enet_base, PHY_ADDRESS, &speed, &duplex);
-        /* Change the MII speed and duplex for actual link status. */
-        config.miiSpeed = (enet_mii_speed_t)speed;
-        config.miiDuplex = (enet_mii_duplex_t)duplex;
-    } 
-    
+        config.miiSpeed = kENET_MiiSpeed10M;
+        config.miiDuplex = kENET_MiiHalfDuplex;
+
+        dbg_log(DBG_WARNING, "PHY Auto-negotiation failed. Please check the cable connection and link partner setting.\n");
+        eth_device_linkchange(&imxrt_eth_device.parent, RT_FALSE);
+    }
+
     ENET_Init(imxrt_eth_device.enet_base, &imxrt_eth_device.enet_handle, &config, &buffConfig, &imxrt_eth_device.dev_addr[0], sysClock);
     ENET_Init(imxrt_eth_device.enet_base, &imxrt_eth_device.enet_handle, &config, &buffConfig, &imxrt_eth_device.dev_addr[0], sysClock);
     ENET_SetCallback(&imxrt_eth_device.enet_handle, _enet_callback, &imxrt_eth_device);
     ENET_SetCallback(&imxrt_eth_device.enet_handle, _enet_callback, &imxrt_eth_device);
     ENET_ActiveRead(imxrt_eth_device.enet_base);
     ENET_ActiveRead(imxrt_eth_device.enet_base);
@@ -408,7 +419,7 @@ static rt_err_t rt_imxrt_eth_init(rt_device_t dev)
     _enet_io_init();
     _enet_io_init();
     _enet_clk_init();
     _enet_clk_init();
     _enet_phy_reset_by_gpio();
     _enet_phy_reset_by_gpio();
-    
+
     _enet_config();
     _enet_config();
 
 
     return RT_EOK;
     return RT_EOK;
@@ -416,33 +427,33 @@ static rt_err_t rt_imxrt_eth_init(rt_device_t dev)
 
 
 static rt_err_t rt_imxrt_eth_open(rt_device_t dev, rt_uint16_t oflag)
 static rt_err_t rt_imxrt_eth_open(rt_device_t dev, rt_uint16_t oflag)
 {
 {
-    ETH_PRINTF("rt_imxrt_eth_open...\n");
+    dbg_log(DBG_LOG, "rt_imxrt_eth_open...\n");
 	return RT_EOK;
 	return RT_EOK;
 }
 }
 
 
 static rt_err_t rt_imxrt_eth_close(rt_device_t dev)
 static rt_err_t rt_imxrt_eth_close(rt_device_t dev)
 {
 {
-    ETH_PRINTF("rt_imxrt_eth_close...\n");
+    dbg_log(DBG_LOG, "rt_imxrt_eth_close...\n");
 	return RT_EOK;
 	return RT_EOK;
 }
 }
 
 
 static rt_size_t rt_imxrt_eth_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
 static rt_size_t rt_imxrt_eth_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
 {
 {
-    ETH_PRINTF("rt_imxrt_eth_read...\n");
+    dbg_log(DBG_LOG, "rt_imxrt_eth_read...\n");
 	rt_set_errno(-RT_ENOSYS);
 	rt_set_errno(-RT_ENOSYS);
 	return 0;
 	return 0;
 }
 }
 
 
 static rt_size_t rt_imxrt_eth_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
 static rt_size_t rt_imxrt_eth_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
 {
 {
-    ETH_PRINTF("rt_imxrt_eth_write...\n");
+    dbg_log(DBG_LOG, "rt_imxrt_eth_write...\n");
 	rt_set_errno(-RT_ENOSYS);
 	rt_set_errno(-RT_ENOSYS);
 	return 0;
 	return 0;
 }
 }
 
 
 static rt_err_t rt_imxrt_eth_control(rt_device_t dev, int cmd, void *args)
 static rt_err_t rt_imxrt_eth_control(rt_device_t dev, int cmd, void *args)
 {
 {
-    ETH_PRINTF("rt_imxrt_eth_control...\n");
+    dbg_log(DBG_LOG, "rt_imxrt_eth_control...\n");
 	switch(cmd)
 	switch(cmd)
 	{
 	{
 	case NIOCTL_GADDR:
 	case NIOCTL_GADDR:
@@ -468,7 +479,7 @@ rt_err_t rt_imxrt_eth_tx( rt_device_t dev, struct pbuf* p)
 	RT_ASSERT(p != NULL);
 	RT_ASSERT(p != NULL);
     RT_ASSERT(enet_handle != RT_NULL);
     RT_ASSERT(enet_handle != RT_NULL);
 
 
-	ETH_PRINTF("rt_imxrt_eth_tx: %d\n", p->len);
+	dbg_log(DBG_LOG, "rt_imxrt_eth_tx: %d\n", p->len);
 
 
 #ifdef ETH_TX_DUMP
 #ifdef ETH_TX_DUMP
 	{
 	{
@@ -477,11 +488,11 @@ rt_err_t rt_imxrt_eth_tx( rt_device_t dev, struct pbuf* p)
 		buf = (uint8_t *)p->payload;
 		buf = (uint8_t *)p->payload;
 		for (i = 0; i < p->len; i++)
 		for (i = 0; i < p->len; i++)
 		{
 		{
-			ETH_PRINTF("%02X ", buf[i]);
+			dbg_log(DBG_LOG, "%02X ", buf[i]);
 			if (i % 16 == 15)
 			if (i % 16 == 15)
-				ETH_PRINTF("\n");
+				dbg_log(DBG_LOG, "\n");
 		}
 		}
-		ETH_PRINTF("\n");
+		dbg_log(DBG_LOG, "\n");
 	}
 	}
 #endif
 #endif
 
 
@@ -504,12 +515,12 @@ struct pbuf *rt_imxrt_eth_rx(rt_device_t dev)
 {
 {
  	uint32_t length = 0;
  	uint32_t length = 0;
 	status_t status;
 	status_t status;
-    
+
 	struct pbuf* p = RT_NULL;
 	struct pbuf* p = RT_NULL;
 	enet_handle_t * enet_handle = &imxrt_eth_device.enet_handle;
 	enet_handle_t * enet_handle = &imxrt_eth_device.enet_handle;
     ENET_Type *enet_base = imxrt_eth_device.enet_base;
     ENET_Type *enet_base = imxrt_eth_device.enet_base;
     enet_data_error_stats_t *error_statistic = &imxrt_eth_device.error_statistic;
     enet_data_error_stats_t *error_statistic = &imxrt_eth_device.error_statistic;
-    
+
 	/* Get the Frame size */
 	/* Get the Frame size */
 	status = ENET_GetRxFrameSize(enet_handle, &length);
 	status = ENET_GetRxFrameSize(enet_handle, &length);
 
 
@@ -518,7 +529,7 @@ struct pbuf *rt_imxrt_eth_rx(rt_device_t dev)
 	{
 	{
 		/* Received valid frame. Deliver the rx buffer with the size equal to length. */
 		/* Received valid frame. Deliver the rx buffer with the size equal to length. */
 		p = pbuf_alloc(PBUF_RAW, length, PBUF_POOL);
 		p = pbuf_alloc(PBUF_RAW, length, PBUF_POOL);
-        
+
         if (p != NULL)
         if (p != NULL)
         {
         {
             status = ENET_ReadFrame(enet_base, enet_handle, p->payload, length);
             status = ENET_ReadFrame(enet_base, enet_handle, p->payload, length);
@@ -532,28 +543,28 @@ struct pbuf *rt_imxrt_eth_rx(rt_device_t dev)
                 buf = (uint8_t *)p->payload;
                 buf = (uint8_t *)p->payload;
                 for (i = 0; i < p->len; i++)
                 for (i = 0; i < p->len; i++)
                 {
                 {
-                    ETH_PRINTF("%02X ", buf[i]);
+                    dbg_log(DBG_LOG, "%02X ", buf[i]);
                     if (i % 16 == 15)
                     if (i % 16 == 15)
-                        ETH_PRINTF("\n");
+                        dbg_log(DBG_LOG, "\n");
                 }
                 }
-                ETH_PRINTF("\n");
+                dbg_log(DBG_LOG, "\n");
     #endif
     #endif
                 return p;
                 return p;
             }
             }
             else
             else
             {
             {
-                ETH_PRINTF(" A frame read failed\n");
+                dbg_log(DBG_LOG, " A frame read failed\n");
                 pbuf_free(p);
                 pbuf_free(p);
             }
             }
         }
         }
         else
         else
         {
         {
-            ETH_PRINTF(" pbuf_alloc faild\n");
+            dbg_log(DBG_LOG, " pbuf_alloc faild\n");
         }
         }
 	}
 	}
 	else if (status == kStatus_ENET_RxFrameError)
 	else if (status == kStatus_ENET_RxFrameError)
 	{
 	{
-		ETH_PRINTF("ENET_GetRxFrameSize: kStatus_ENET_RxFrameError\n");
+		dbg_log(DBG_WARNING, "ENET_GetRxFrameSize: kStatus_ENET_RxFrameError\n");
 		/* Update the received buffer when error happened. */
 		/* Update the received buffer when error happened. */
 		/* Get the error information of the received g_frame. */
 		/* Get the error information of the received g_frame. */
 		ENET_GetRxErrBeforeReadFrame(enet_handle, error_statistic);
 		ENET_GetRxErrBeforeReadFrame(enet_handle, error_statistic);
@@ -577,7 +588,7 @@ static int rt_hw_imxrt_eth_init(void)
     imxrt_eth_device.dev_addr[3] = 0x12;
     imxrt_eth_device.dev_addr[3] = 0x12;
     imxrt_eth_device.dev_addr[4] = 0x34;
     imxrt_eth_device.dev_addr[4] = 0x34;
     imxrt_eth_device.dev_addr[5] = 0x56;
     imxrt_eth_device.dev_addr[5] = 0x56;
-    
+
     imxrt_eth_device.enet_base = ENET;
     imxrt_eth_device.enet_base = ENET;
 
 
     imxrt_eth_device.parent.parent.init       = rt_imxrt_eth_init;
     imxrt_eth_device.parent.parent.init       = rt_imxrt_eth_init;
@@ -591,20 +602,20 @@ static int rt_hw_imxrt_eth_init(void)
     imxrt_eth_device.parent.eth_rx     = rt_imxrt_eth_rx;
     imxrt_eth_device.parent.eth_rx     = rt_imxrt_eth_rx;
     imxrt_eth_device.parent.eth_tx     = rt_imxrt_eth_tx;
     imxrt_eth_device.parent.eth_tx     = rt_imxrt_eth_tx;
 
 
-    ETH_PRINTF("sem init: tx_wait\r\n");
+    dbg_log(DBG_LOG, "sem init: tx_wait\r\n");
     /* init tx semaphore */
     /* init tx semaphore */
     rt_sem_init(&imxrt_eth_device.tx_wait, "tx_wait", 0, RT_IPC_FLAG_FIFO);
     rt_sem_init(&imxrt_eth_device.tx_wait, "tx_wait", 0, RT_IPC_FLAG_FIFO);
 
 
     /* register eth device */
     /* register eth device */
-    ETH_PRINTF("eth_device_init start\r\n");
+    dbg_log(DBG_LOG, "eth_device_init start\r\n");
     state = eth_device_init(&(imxrt_eth_device.parent), "e0");
     state = eth_device_init(&(imxrt_eth_device.parent), "e0");
     if (RT_EOK == state)
     if (RT_EOK == state)
     {
     {
-        ETH_PRINTF("eth_device_init success\r\n");
+        dbg_log(DBG_LOG, "eth_device_init success\r\n");
     }
     }
     else
     else
     {
     {
-        ETH_PRINTF("eth_device_init faild: %d\r\n", state);
+        dbg_log(DBG_LOG, "eth_device_init faild: %d\r\n", state);
     }
     }
     return state;
     return state;
 }
 }
@@ -618,7 +629,7 @@ void phy_read(uint32_t phyReg)
 {
 {
     uint32_t data;
     uint32_t data;
     status_t status;
     status_t status;
-        
+
     status = PHY_Read(imxrt_eth_device.enet_base, PHY_ADDRESS, phyReg, &data);
     status = PHY_Read(imxrt_eth_device.enet_base, PHY_ADDRESS, phyReg, &data);
     if (kStatus_Success == status)
     if (kStatus_Success == status)
     {
     {
@@ -633,7 +644,7 @@ void phy_read(uint32_t phyReg)
 void phy_write(uint32_t phyReg, uint32_t data)
 void phy_write(uint32_t phyReg, uint32_t data)
 {
 {
     status_t status;
     status_t status;
-        
+
     status = PHY_Write(imxrt_eth_device.enet_base, PHY_ADDRESS, phyReg, data);
     status = PHY_Write(imxrt_eth_device.enet_base, PHY_ADDRESS, phyReg, data);
     if (kStatus_Success == status)
     if (kStatus_Success == status)
     {
     {
@@ -649,7 +660,7 @@ void phy_dump(void)
 {
 {
     uint32_t data;
     uint32_t data;
     status_t status;
     status_t status;
-    
+
     int i;
     int i;
     for (i = 0; i < 32; i++)
     for (i = 0; i < 32; i++)
     {
     {
@@ -659,7 +670,7 @@ void phy_dump(void)
             rt_kprintf("phy_dump: %02X --> faild", i);
             rt_kprintf("phy_dump: %02X --> faild", i);
             break;
             break;
         }
         }
-        
+
         if (i % 8 == 7)
         if (i % 8 == 7)
         {
         {
             rt_kprintf("%02X --> %08X ", i, data);
             rt_kprintf("%02X --> %08X ", i, data);
@@ -668,17 +679,17 @@ void phy_dump(void)
         {
         {
             rt_kprintf("%02X --> %08X\n", i, data);
             rt_kprintf("%02X --> %08X\n", i, data);
         }
         }
-        
+
     }
     }
 }
 }
 
 
 void enet_reg_dump(void)
 void enet_reg_dump(void)
 {
 {
     ENET_Type *enet_base = imxrt_eth_device.enet_base;
     ENET_Type *enet_base = imxrt_eth_device.enet_base;
-    
+
 #define DUMP_REG(__REG)  \
 #define DUMP_REG(__REG)  \
     rt_kprintf("%s(%08X): %08X\n", #__REG, (uint32_t)&enet_base->__REG, enet_base->__REG)
     rt_kprintf("%s(%08X): %08X\n", #__REG, (uint32_t)&enet_base->__REG, enet_base->__REG)
-        
+
 	DUMP_REG(EIR);
 	DUMP_REG(EIR);
 	DUMP_REG(EIMR);
 	DUMP_REG(EIMR);
 	DUMP_REG(RDAR);
 	DUMP_REG(RDAR);
@@ -785,16 +796,16 @@ void enet_nvic_tog(void)
 void enet_rx_stat(void)
 void enet_rx_stat(void)
 {
 {
     enet_data_error_stats_t *error_statistic = &imxrt_eth_device.error_statistic;
     enet_data_error_stats_t *error_statistic = &imxrt_eth_device.error_statistic;
-    
+
 #define DUMP_STAT(__VAR)  \
 #define DUMP_STAT(__VAR)  \
     rt_kprintf("%-25s: %08X\n", #__VAR, error_statistic->__VAR);
     rt_kprintf("%-25s: %08X\n", #__VAR, error_statistic->__VAR);
-    
+
     DUMP_STAT(statsRxLenGreaterErr);
     DUMP_STAT(statsRxLenGreaterErr);
     DUMP_STAT(statsRxAlignErr);
     DUMP_STAT(statsRxAlignErr);
     DUMP_STAT(statsRxFcsErr);
     DUMP_STAT(statsRxFcsErr);
     DUMP_STAT(statsRxOverRunErr);
     DUMP_STAT(statsRxOverRunErr);
     DUMP_STAT(statsRxTruncateErr);
     DUMP_STAT(statsRxTruncateErr);
-    
+
 #ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE
 #ifdef ENET_ENHANCEDBUFFERDESCRIPTOR_MODE
     DUMP_STAT(statsRxProtocolChecksumErr);
     DUMP_STAT(statsRxProtocolChecksumErr);
     DUMP_STAT(statsRxIpHeadChecksumErr);
     DUMP_STAT(statsRxIpHeadChecksumErr);
@@ -808,8 +819,8 @@ void enet_rx_stat(void)
     DUMP_STAT(statsTxExcessCollisionErr);
     DUMP_STAT(statsTxExcessCollisionErr);
     DUMP_STAT(statsTxUnderFlowErr);
     DUMP_STAT(statsTxUnderFlowErr);
     DUMP_STAT(statsTxTsErr);
     DUMP_STAT(statsTxTsErr);
-#endif  
-    
+#endif
+
 }
 }
 
 
 void enet_buf_info(void)
 void enet_buf_info(void)
@@ -818,7 +829,7 @@ void enet_buf_info(void)
     int i = 0;
     int i = 0;
     for (i = 0; i < ENET_RXBD_NUM; i++)
     for (i = 0; i < ENET_RXBD_NUM; i++)
     {
     {
-        rt_kprintf("%d: length: %-8d, control: %04X, buffer:%p\n", 
+        rt_kprintf("%d: length: %-8d, control: %04X, buffer:%p\n",
                     i,
                     i,
                     g_rxBuffDescrip[i].length,
                     g_rxBuffDescrip[i].length,
                     g_rxBuffDescrip[i].control,
                     g_rxBuffDescrip[i].control,
@@ -827,7 +838,7 @@ void enet_buf_info(void)
 
 
     for (i = 0; i < ENET_TXBD_NUM; i++)
     for (i = 0; i < ENET_TXBD_NUM; i++)
     {
     {
-        rt_kprintf("%d: length: %-8d, control: %04X, buffer:%p\n", 
+        rt_kprintf("%d: length: %-8d, control: %04X, buffer:%p\n",
                     i,
                     i,
                     g_txBuffDescrip[i].length,
                     g_txBuffDescrip[i].length,
                     g_txBuffDescrip[i].control,
                     g_txBuffDescrip[i].control,

+ 7 - 3
bsp/imxrt1052-evk/drivers/fsl_phy.c

@@ -29,12 +29,13 @@
  */
  */
 
 
 #include "fsl_phy.h"
 #include "fsl_phy.h"
+#include <rtthread.h>
 /*******************************************************************************
 /*******************************************************************************
  * Definitions
  * Definitions
  ******************************************************************************/
  ******************************************************************************/
 
 
 /*! @brief Defines the timeout macro. */
 /*! @brief Defines the timeout macro. */
-#define PHY_TIMEOUT_COUNT 0x3FFFFFFU
+#define PHY_TIMEOUT_COUNT 0xFFFFU
 
 
 /*******************************************************************************
 /*******************************************************************************
  * Prototypes
  * Prototypes
@@ -83,14 +84,14 @@ status_t PHY_Init(ENET_Type *base, uint32_t phyAddr, uint32_t srcClock_Hz)
         PHY_Read(base, phyAddr, PHY_ID1_REG, &idReg);
         PHY_Read(base, phyAddr, PHY_ID1_REG, &idReg);
         counter --;       
         counter --;       
     }
     }
-
+    
     if (!counter)
     if (!counter)
     {
     {
         return kStatus_Fail;
         return kStatus_Fail;
     }
     }
 
 
     /* Reset PHY. */
     /* Reset PHY. */
-    counter = PHY_TIMEOUT_COUNT;
+    counter = 6;
     result = PHY_Write(base, phyAddr, PHY_BASICCONTROL_REG, PHY_BCTL_RESET_MASK);
     result = PHY_Write(base, phyAddr, PHY_BASICCONTROL_REG, PHY_BCTL_RESET_MASK);
     if (result == kStatus_Success)
     if (result == kStatus_Success)
     {
     {
@@ -136,6 +137,9 @@ status_t PHY_Init(ENET_Type *base, uint32_t phyAddr, uint32_t srcClock_Hz)
                             break;
                             break;
                         }
                         }
                     }
                     }
+                    
+                    rt_kprintf("[PHY] wait autonegotiation complete...\n");
+                    rt_thread_delay(RT_TICK_PER_SECOND);
 
 
                     if (!counter)
                     if (!counter)
                     {
                     {