// add by sty ********************************************** begin////**
Add support for KSZ9031
**/#defineMICREL_PHY_IDENTIFIER0x22#defineMICREL_PHY_KSZ9031_MODEL0x220#defineJLSEMI_IDENTIFIER0x937C#defineJLSEMI_PHY_SELECT_REG_OFFSET0x1F#defineJLSEMI_PHY_SPECIFIC_STATUS_REG_OFFSET0x1A#defineJLSEMI_PHY_SPECIFIC_PAGE0xA43#defineJLSEMI_PHY_LCR_PAGE0xD04#defineJLSEMI_PHY_LED_BLINK_PAGE0x1000#defineJLSEMI_PHY_LED_CONTROL_REG_OFFSET0x10#defineJLSEMI_PHY_LED_BLINK_REG_OFFSET0x14
添加如下函数
staticu32_tget_phy_speed_ksz9031(XEmacPs *xemacpsp,u32_t phy_addr){u16_t temp;u16_t control;u16_t status;u16_t status_speed;u32_t timeout_counter =0;u32_t temp_speed;u32_t phyregtemp;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;elsebreak;}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;}XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET,&status);}xil_printf("autonegotiation complete \r\n");XEmacPs_PhyRead(xemacpsp, phy_addr,0x1f,&status_speed);if((status_speed &0x40)==0x40)/* 1000Mbps */return1000;elseif((status_speed &0x20)==0x20)/* 100Mbps */return100;elseif((status_speed &0x10)==0x10)/* 10Mbps */return10;elsereturn0;return XST_SUCCESS;}