#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
\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
#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
\r
static int detect_phy(XEmacPs *xemacpsp)\r
{\r
- u16 id_lower, id_upper;\r
- u32 phy_addr, id;\r
-\r
- for (phy_addr = 0; phy_addr < 32; 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
+ 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
phy_detected = phy_addr;\r
return phy_addr;\r
}\r
if (partner_capabilities & IEEE_AN1_ABILITY_MASK_10MBPS)\r
return 10;\r
\r
- FreeRTOS_printf( ( "%s: unknown PHY link speed, setting TEMAC speed to be 10 Mbps\n",\r
- __FUNCTION__ ) );\r
+ xil_printf("%s: unknown PHY link speed, setting TEMAC speed to be 10 Mbps\r\n",\r
+ __FUNCTION__);\r
return 10;\r
\r
} else {\r
case (IEEE_CTRL_LINKSPEED_10M):\r
return 10;\r
default:\r
- FreeRTOS_printf( ( "%s: unknown PHY link speed (%d), setting TEMAC speed to be 10 Mbps\n",\r
- __FUNCTION__, phylinkspeed ) );\r
+ xil_printf("%s: unknown PHY link speed (%d), setting TEMAC speed to be 10 Mbps\r\n",\r
+ __FUNCTION__, phylinkspeed);\r
return 10;\r
}\r
\r
#else\r
u32 phy_addr = detect_phy(xemacpsp);\r
#endif\r
- FreeRTOS_printf( ( "Start PHY autonegotiation \n" ) );\r
+ xil_printf("Start PHY autonegotiation \r\n");\r
\r
#if XPAR_GIGE_PCS_PMA_CORE_PRESENT == 1\r
#else\r
break;\r
}\r
#endif\r
- FreeRTOS_printf( ( "Waiting for PHY to complete autonegotiation.\n" ) );\r
+ xil_printf("Waiting for PHY to complete autonegotiation.\r\n");\r
\r
XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);\r
while ( !(status & IEEE_STAT_AUTONEGOTIATE_COMPLETE) ) {\r
- vTaskDelay(1);\r
+ sleep(1);\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
- FreeRTOS_printf( ( "Auto negotiation error \n" ) );\r
+ xil_printf("Auto negotiation error \r\n");\r
}\r
#endif\r
XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET,\r
&status);\r
}\r
\r
- FreeRTOS_printf( ( "autonegotiation complete \n" ) );\r
+ xil_printf("autonegotiation complete \r\n");\r
\r
#if XPAR_GIGE_PCS_PMA_CORE_PRESENT == 1\r
#else\r
#endif\r
\r
#if XPAR_GIGE_PCS_PMA_CORE_PRESENT == 1\r
- FreeRTOS_printf( ( "Waiting for Link to be up; Polling for SGMII core Reg \n" ) );\r
+ xil_printf("Waiting for Link to be up; Polling for SGMII core Reg \r\n");\r
XEmacPs_PhyRead(xemacpsp, phy_addr, 5, &temp);\r
while(!(temp & 0x8000)) {\r
XEmacPs_PhyRead(xemacpsp, phy_addr, 5, &temp);\r
XEmacPs_PhyRead(xemacpsp, phy_addr, 0, &temp);\r
return 10;\r
} else {\r
- FreeRTOS_printf( ( "get_IEEE_phy_speed(): Invalid speed bit value, Deafulting to Speed = 10 Mbps\n" ) );\r
+ xil_printf("get_IEEE_phy_speed(): Invalid speed bit value, Deafulting to Speed = 10 Mbps\r\n");\r
XEmacPs_PhyRead(xemacpsp, phy_addr, 0, &temp);\r
XEmacPs_PhyWrite(xemacpsp, phy_addr, 0, 0x0100);\r
return 10;\r
link_speed = 1000;\r
configure_IEEE_phy_speed(xemacpsp, link_speed);\r
convspeeddupsetting = XEMACPS_GMII2RGMII_SPEED1000_FD;\r
- vTaskDelay(1);\r
+ sleep(1);\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
- vTaskDelay(1);\r
+ sleep(1);\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
- vTaskDelay(1);\r
+ sleep(1);\r
#endif\r
if (conv_present) {\r
XEmacPs_PhyWrite(xemacpsp, convphyaddr,\r
XEMACPS_GMII2RGMII_REG_NUM, convspeeddupsetting);\r
}\r
\r
- FreeRTOS_printf( ( "link speed: %d\n", link_speed ) );\r
+ xil_printf("link speed: %d\r\n", link_speed);\r
return link_speed;\r
}\r
\r