]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/portable/NetworkInterface/Zynq/x_emacpsif_physpeed.c
commit 9f316c246baafa15c542a5aea81a94f26e3d6507
[freertos] / FreeRTOS-Plus / Source / FreeRTOS-Plus-TCP / portable / NetworkInterface / Zynq / x_emacpsif_physpeed.c
index 12b8c60c8b9da9b4ccf0fe20cb0ef6fc31352b14..62228d065584ac10c0e4cfd11dfada72a91866a3 100644 (file)
 #include <stdio.h>\r
 #include <stdlib.h>\r
 \r
-#include "Zynq/x_emacpsif.h"\r
-//#include "lwipopts.h"\r
-#include "xparameters_ps.h"\r
-#include "xparameters.h"\r
-\r
 /* FreeRTOS includes. */\r
 #include "FreeRTOS.h"\r
 #include "task.h"\r
 #include "queue.h"\r
 #include "semphr.h"\r
 \r
-///* FreeRTOS+TCP includes. */\r
 /* FreeRTOS+TCP includes. */\r
 #include "FreeRTOS_IP.h"\r
 #include "FreeRTOS_Sockets.h"\r
 #include "FreeRTOS_IP_Private.h"\r
 #include "NetworkBufferManagement.h"\r
 \r
+#include "Zynq/x_emacpsif.h"\r
+#include "xparameters_ps.h"\r
+#include "xparameters.h"\r
+\r
+\r
 int phy_detected = 0;\r
 \r
 /*** IMPORTANT: Define PEEP in xemacpsif.h and sys_arch_raw.c\r
@@ -99,6 +98,8 @@ int phy_detected = 0;
 \r
 #define IEEE_CONTROL_REG_OFFSET                                0\r
 #define IEEE_STATUS_REG_OFFSET                         1\r
+#define IEEE_PHYSID1_OFFSET                                    2\r
+#define IEEE_PHYSID2_OFFSET                                    3\r
 #define IEEE_AUTONEGO_ADVERTISE_REG                    4\r
 #define IEEE_PARTNER_ABILITIES_1_REG_OFFSET    5\r
 #define IEEE_1000_ADVERTISE_REG_OFFSET         9\r
@@ -135,9 +136,6 @@ int phy_detected = 0;
 #define IEEE_PAUSE_MASK                                                0x0400\r
 #define IEEE_AUTONEG_ERROR_MASK                                0x8000\r
 \r
-#define PHY_DETECT_REG  1\r
-#define PHY_DETECT_MASK 0x1808\r
-\r
 #define XEMACPS_GMII2RGMII_SPEED1000_FD                0x140\r
 #define XEMACPS_GMII2RGMII_SPEED100_FD         0x2100\r
 #define XEMACPS_GMII2RGMII_SPEED10_FD          0x100\r
@@ -161,21 +159,24 @@ int phy_detected = 0;
 #define EMAC0_BASE_ADDRESS                             0xE000B000\r
 #define EMAC1_BASE_ADDRESS                             0xE000C000\r
 \r
+#define PHY_ADDRESS_COUNT                              32\r
+\r
+#define MINIMUM_SLEEP_TIME                             2\r
+\r
+\r
 static int detect_phy(XEmacPs *xemacpsp)\r
 {\r
-       u16 phy_reg;\r
-       u32 phy_addr;\r
-\r
-       for (phy_addr = 31; phy_addr > 0; phy_addr--) {\r
-               XEmacPs_PhyRead(xemacpsp, phy_addr, PHY_DETECT_REG,\r
-                                                       &phy_reg);\r
-\r
-               if ((phy_reg != 0xFFFF) &&\r
-                       ((phy_reg & PHY_DETECT_MASK) == PHY_DETECT_MASK)) {\r
-                       /* Found a valid PHY address */\r
-                       FreeRTOS_printf( ("XEmacPs detect_phy: PHY detected at address %d.\r\n",\r
-                                                                                                                                       phy_addr));\r
-                       FreeRTOS_printf( ("XEmacPs detect_phy: PHY detected.\n" ) );\r
+       u16 id_lower, id_upper;\r
+       u32 phy_addr, id;\r
+\r
+       for (phy_addr = 0; phy_addr < PHY_ADDRESS_COUNT; phy_addr++) {\r
+               XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_PHYSID1_OFFSET, &id_lower);\r
+\r
+               if ((id_lower != ( u16 )0xFFFFu) && (id_lower != ( u16 )0x0u)) {\r
+\r
+                       XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_PHYSID2_OFFSET, &id_upper);\r
+                       id = ( ( ( uint32_t ) id_upper ) << 16 ) | ( id_lower & 0xFFF0 );\r
+                       FreeRTOS_printf( ("XEmacPs detect_phy: %04lX at address %d.\n", id, phy_addr ) );\r
                        phy_detected = phy_addr;\r
                        return phy_addr;\r
                }\r
@@ -238,8 +239,8 @@ unsigned get_IEEE_phy_speed(XEmacPs *xemacpsp)
                if (partner_capabilities & IEEE_AN1_ABILITY_MASK_10MBPS)\r
                        return 10;\r
 \r
-               xil_printf("%s: unknown PHY link speed, setting TEMAC speed to be 10 Mbps\r\n",\r
-                               __FUNCTION__);\r
+               FreeRTOS_printf( ( "%s: unknown PHY link speed, setting TEMAC speed to be 10 Mbps\n",\r
+                               __FUNCTION__ ) );\r
                return 10;\r
 \r
        } else {\r
@@ -257,8 +258,8 @@ unsigned get_IEEE_phy_speed(XEmacPs *xemacpsp)
                                case (IEEE_CTRL_LINKSPEED_10M):\r
                                        return 10;\r
                                default:\r
-                                       xil_printf("%s: unknown PHY link speed (%d), setting TEMAC speed to be 10 Mbps\r\n",\r
-                                                       __FUNCTION__, phylinkspeed);\r
+                                       FreeRTOS_printf( ( "%s: unknown PHY link speed (%d), setting TEMAC speed to be 10 Mbps\n",\r
+                                                       __FUNCTION__, phylinkspeed ) );\r
                                        return 10;\r
                        }\r
 \r
@@ -282,7 +283,7 @@ unsigned get_IEEE_phy_speed(XEmacPs *xemacpsp)
 #else\r
        u32 phy_addr = detect_phy(xemacpsp);\r
 #endif\r
-       xil_printf("Start PHY autonegotiation \r\n");\r
+       FreeRTOS_printf( ( "Start PHY autonegotiation \n" ) );\r
 \r
 #if XPAR_GIGE_PCS_PMA_CORE_PRESENT == 1\r
 #else\r
@@ -338,24 +339,24 @@ unsigned get_IEEE_phy_speed(XEmacPs *xemacpsp)
                        break;\r
        }\r
 #endif\r
-       xil_printf("Waiting for PHY to complete autonegotiation.\r\n");\r
+       FreeRTOS_printf( ( "Waiting for PHY to complete autonegotiation.\n" ) );\r
 \r
        XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);\r
        while ( !(status & IEEE_STAT_AUTONEGOTIATE_COMPLETE) ) {\r
-               sleep(1);\r
+               vTaskDelay( MINIMUM_SLEEP_TIME );\r
 #if XPAR_GIGE_PCS_PMA_CORE_PRESENT == 1\r
 #else\r
                XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_COPPER_SPECIFIC_STATUS_REG_2,\r
                                                                                                                                        &temp);\r
                if (temp & IEEE_AUTONEG_ERROR_MASK) {\r
-                       xil_printf("Auto negotiation error \r\n");\r
+                       FreeRTOS_printf( ( "Auto negotiation error \n" ) );\r
                }\r
 #endif\r
                XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET,\r
                                                                                                                                &status);\r
                }\r
 \r
-       xil_printf("autonegotiation complete \r\n");\r
+       FreeRTOS_printf( ( "autonegotiation complete \n" ) );\r
 \r
 #if XPAR_GIGE_PCS_PMA_CORE_PRESENT == 1\r
 #else\r
@@ -363,7 +364,7 @@ unsigned get_IEEE_phy_speed(XEmacPs *xemacpsp)
 #endif\r
 \r
 #if XPAR_GIGE_PCS_PMA_CORE_PRESENT == 1\r
-       xil_printf("Waiting for Link to be up; Polling for SGMII core Reg \r\n");\r
+       FreeRTOS_printf( ( "Waiting for Link to be up; Polling for SGMII core Reg \n" ) );\r
        XEmacPs_PhyRead(xemacpsp, phy_addr, 5, &temp);\r
        while(!(temp & 0x8000)) {\r
                XEmacPs_PhyRead(xemacpsp, phy_addr, 5, &temp);\r
@@ -380,7 +381,7 @@ unsigned get_IEEE_phy_speed(XEmacPs *xemacpsp)
                XEmacPs_PhyRead(xemacpsp, phy_addr, 0, &temp);\r
                return 10;\r
        } else {\r
-               xil_printf("get_IEEE_phy_speed(): Invalid speed bit value, Deafulting to Speed = 10 Mbps\r\n");\r
+               FreeRTOS_printf( ( "get_IEEE_phy_speed(): Invalid speed bit value, Deafulting to Speed = 10 Mbps\n" ) );\r
                XEmacPs_PhyRead(xemacpsp, phy_addr, 0, &temp);\r
                XEmacPs_PhyWrite(xemacpsp, phy_addr, 0, 0x0100);\r
                return 10;\r
@@ -560,26 +561,26 @@ unsigned Phy_Setup (XEmacPs *xemacpsp)
        link_speed = 1000;\r
        configure_IEEE_phy_speed(xemacpsp, link_speed);\r
        convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED1000_FD;\r
-       sleep(1);\r
+       vTaskDelay( MINIMUM_SLEEP_TIME );\r
 #elif  defined(ipconfigNIC_LINKSPEED100)\r
        SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,100);\r
        link_speed = 100;\r
        configure_IEEE_phy_speed(xemacpsp, link_speed);\r
        convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED100_FD;\r
-       sleep(1);\r
+       vTaskDelay( MINIMUM_SLEEP_TIME );\r
 #elif  defined(ipconfigNIC_LINKSPEED10)\r
        SetUpSLCRDivisors(xemacpsp->Config.BaseAddress,10);\r
        link_speed = 10;\r
        configure_IEEE_phy_speed(xemacpsp, link_speed);\r
        convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED10_FD;\r
-       sleep(1);\r
+       vTaskDelay( MINIMUM_SLEEP_TIME );\r
 #endif\r
        if (conv_present) {\r
                XEmacPs_PhyWrite(xemacpsp, convphyaddr,\r
                XEMACPS_GMII2RGMII_REG_NUM, convspeeddupsetting);\r
        }\r
 \r
-       xil_printf("link speed: %d\r\n", link_speed);\r
+       FreeRTOS_printf( ( "link speed: %d\n", link_speed ) );\r
        return link_speed;\r
 }\r
 \r