uisrc 发表于 2019-11-6 21:18:08

lwip以太网芯片RTL8211FD如何自动适应速度的问题解决

替换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;
}

陈旭 发表于 2020-6-2 16:14:14

你这个在ma703fa底板上的8211fd上结果打印auto-negotiation error,寄存器地址也不对
例如
XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_CONTROL_REG_MAC, &control);
      control |= IEEE_RGMII_TXRX_CLOCK_DELAYED_MASK;
手册上没有看到哪里可以设置TXRX_CLOCK_DELAYED

狂奔的蜗牛 发表于 2020-9-14 17:15:08

这个不是Marvell芯片的自适应驱动嘛
页: [1]
查看完整版本: lwip以太网芯片RTL8211FD如何自动适应速度的问题解决