Xilinx的lwip库不支持国产以太网芯片YT8511问题解决

前言:

相比FPGA开发来说,使用软核可以做一些FPGA实现比较困难的事情,比如lwip以太网传输。lwip的一些协议和主要功能就不在这里过多赘述,网上可以自行搜索,这里主要记录一下调试过程遇到的一些问题。

由于XILINX官方默认的lwip bsp驱动暂时不支持YT8511网口芯片,在使用该网口的时候需要自己手动修改库文件以支持该芯片,不同版本工具之间的修改方式大同小异,这边仅以Vitis 2021.1为例。


开发板FPGA型号:Xilinx–>Artix7–>xc7a100tfgg676-2;

开发环境:Vitis 2021.1;

PHY型号:裕太微YT8511;

一、新增lwip库,添加YT8511底层驱动

        1-1:找到vitis ide安装目录下的LWIP库的路径,将其拷贝一份放到工程目录下:

这里我复制了一份lwip211_v1_5文件夹,将其名字改为lwip211_v2_2。

        1-2:修改lwip211_v2_2\data\lwip211.mld文件,将其中的版本编号

OPTION VERSION =1.5;

修改为

OPTION VERSION = 2.2;

        1-3:打开lwip211_v2_2\src\contrib\ports\xilinx\netif\xaxiemacif_physpeed.c,进行如下修改

                1-3-1:新增定义YT8511芯片ID

根据YT8511芯片手册定义的ID:0x0000

                1-3-2:在原有的detect_phy函数中增加PHY8511识别条件

                1-3-3:在原有的get_IEEE_phy_speed函数中新增速率获取条件

                1-3-4:添加get_YT8511_phy_speed函数。

static u32_t get_YT8511_phy_speed(XAxiEthernet *xaxiemacp, u32_t phy_addr)
{
	u16_t control;
	u16_t status;
	u16_t status_speed;
	u32_t timeout_counter = 0;
	u32_t temp_speed;

	xil_printf("Start YT8511 PHY configuration,Please Waiting...\r\n");

	XAxiEthernet_PhyRead(xaxiemacp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);
	control = IEEE_CONTROL_REG_OFFSET_PAR;   //0xa100---100M   0x9140---auto
	xil_printf("BASIC CONTROL REGISTER PAR(Addr=0X00) is %x \r\n",control);
	XAxiEthernet_PhyWrite(xaxiemacp, phy_addr, IEEE_CONTROL_REG_OFFSET, control);  //对PHY-8511进行配置 自协商模式
	//Bit[15]       :软件复位,     1:PHY 复位 0:正常模式;
	//Bit[14]       :内部环回模式   1:内部环回模式 0:正常模式;
	//Bit[6] Bit[13]:选择网速带宽,只有在自动协商使能不开启的情况下有效  10:1000Mb/s 01:100Mb/s 00:10Mb/s;
	//Bit[12]       :自动协商使能   1:自动协商使能 0:自动协商不使能;
	//Bit[9]        :重启自协商     1:重新开始自协商 0:自协商重启完成。

	xil_printf("PHY-YT8511 Register Parameter Setting Complete \r\n");

	XAxiEthernet_PhyWrite(xaxiemacp, phy_addr, 0x1e, 0x000c);  
	XAxiEthernet_PhyWrite(xaxiemacp, phy_addr, 0x1f, 0x0052); 

	// XAxiEthernet_PhyWrite(xaxiemacp, phy_addr, 0x1e, 0x000d);  
	// XAxiEthernet_PhyWrite(xaxiemacp, phy_addr, 0x1f, 0x0f30);  

	XAxiEthernet_PhyRead(xaxiemacp, phy_addr, IEEE_CONTROL_REG_OFFSET, &control);  //读取0x00地址的控制寄存器,验证是否配置成功
	xil_printf("BASIC CONTROL REGISTER PAR(Addr=0X00) is %x \r\n",control);

	if (control){
		xil_printf("PHY-YT8511 Register Setting Success \r\n");
	}
	else { 
		xil_printf("PHY-YT8511 Register Setting Fail\r\n");
	}

	XAxiEthernet_PhyRead(xaxiemacp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);  //读取0x01地址的控制寄存器
	xil_printf("BASIC STATUS REGISTER_PAR(Addr=0X01) is %x \r\n",status);  
	//对我们用位的说明如下:
    //Bit[5]:自协商完成 1:自协商完成 0:正在进行自协商;
    //Bit[2]:连接状态, 1:连接成功 0:连接失败。

	//这里只对连接状态进行验证
	while ( !(status & 0x0004) ) {  
		XAxiEthernet_PhyRead(xaxiemacp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);
	}

	XAxiEthernet_PhyRead(xaxiemacp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);
	xil_printf("BASIC STATUS REGISTER_PAR(Addr=0X01) is %x \r\n",status);
	xil_printf("PHY-YT8511 Link_Status is up \r\n");

	XAxiEthernet_PhyRead(xaxiemacp, phy_addr,0X11,&status_speed);  //读取0x11地址的PHY特定状态寄存器
	xil_printf("PHY SPECIFIC STATUS REGISTER(Addr=0X11) is %x \r\n", status_speed);
	//Bit[15:14]:连接速度
	//11:保留
	//10:1000Mbps 
	//01:100Mbps
	//00:10Mbps
	status_speed = status_speed>>8;

	if (status_speed & 0x04) {  //校对Link status real-time状态
		temp_speed = status_speed & 0xc0;

		if (temp_speed == 0x80)
			return 1000;
		else if(temp_speed == 0x40)
			return 100;
		else
			return 10;

	}
	return XST_SUCCESS;
}

        1-4:打开lwip211_v2_2\src\contrib\ports\xilinx\netif\xemac_ieee_reg.c,进行如下修改

将左边代码复制到右边,对原有代码进行替换

        1-5:在Vitis软件中导入新增的lwip211_v2_2库路径

        1-6: 重启Vitis软件

        1-7:勾选lwip库文件,选择刚才新增的lwip211_2.2版本

        1-8:重新编译硬件平台以及代码工程后烧写

至此lwip bsp驱动支持YT8511网口芯片,对lwip库的添加完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值