| 替换lwip库中xemacpsif_physpeed.c代码中 u32_t get_Realtek_phy_speed 函数即可 
 static u32_t get_Realtek_phy_speed(XEmacPs *xemacpsp, u32_t phy_addr)
 {
 u16_t temp;
 u16_t control;
 u16_t status;
 u16_t status_speed;
 u32_t timeout_counter = 0;
 
 xil_printf("Start PHY autonegotiation \r\n");
 XEmacPs_PhyWrite(xemacpsp,phy_addr, IEEE_PAGE_ADDRESS_REGISTER, 2);
 XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_MAC, &control);
 control |= IEEE_RGMII_TXRX_CLOCK_DELAYED_MASK;
 XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_MAC, control);
 
 XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_PAGE_ADDRESS_REGISTER, 0);
 XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG, &control);
 control |= IEEE_ASYMMETRIC_PAUSE_MASK;
 control |= IEEE_PAUSE_MASK;
 control |= ADVERTISE_100;
 control |= ADVERTISE_10;
 XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_AUTONEGO_ADVERTISE_REG, control);
 XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_1000_ADVERTISE_REG_OFFSET,
 &control);
 control |= ADVERTISE_1000;
 XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_1000_ADVERTISE_REG_OFFSET,
 control);
 XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_PAGE_ADDRESS_REGISTER, 0);
 XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_COPPER_SPECIFIC_CONTROL_REG,
 &control);
 control |= (7 << 12); /* max number of gigabit attempts */
 control |= (1 << 11); /* enable downshift */
 XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_COPPER_SPECIFIC_CONTROL_REG,
 control);
 XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
 control |= IEEE_CTRL_AUTONEGOTIATE_ENABLE;
 control |= IEEE_STAT_AUTONEGOTIATE_RESTART;
 XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, control);
 XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
 control |= IEEE_CTRL_RESET_MASK;
 XEmacPs_PhyWrite(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, control);
 while (1) {
 XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
 if (control & IEEE_CTRL_RESET_MASK)
 continue;
 else
 break;
 }
 XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);
 xil_printf("Waiting for PHY to complete autonegotiation.\r\n");
 while ( !(status & IEEE_STAT_AUTONEGOTIATE_COMPLETE) ) {
 sleep(1);
 XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_COPPER_SPECIFIC_STATUS_REG_2, &temp);
 timeout_counter++;
 if (timeout_counter == 30)
 {
 xil_printf("Auto negotiation error \r\n");
 return 0;
 }
 XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);
 }
 xil_printf("autonegotiation complete \r\n");
 XEmacPs_PhyRead(xemacpsp, phy_addr,0x1A, &status_speed);
 if ( (status_speed & 0x30) == 0x20)/* 1000Mbps */
 return 1000;
 else if ( (status_speed & 0x30) == 0x10)/* 100Mbps */
 return 100;
 else if ( (status_speed & 0x30) == 0x00)/* 10Mbps */
 return 10;
 
 return XST_FAILURE;
 }
 |