Xilinx SDK经验分享四 网络连接

1、前言

本文依据个人试验及工作经验总理而成,分享出来供大家参考,如有错误或更好的方法望与大家一起探讨。

2、背景

作者学习Xilinx SDK的时候,发现该平台使用起来遇到各种各样的问题和bug,网上解决方法都是零零散散的或者根本找不到,有时候遇到问题就要卡上几天甚至更久,特别浪费时间。

所以在个人学习期间,就遇到的一些问题整理出来,不能说是很完整的教程,但是希望后来者少踩一些坑和少走一些弯路。

3、主要内容

Xilinx SDK网络连接不稳定,不能正常连接网络。

4、现象

  1. 没有接网线,启动系统后再插入网络,网络不通;
  2. 连接网线启动系统后,拨掉网线再连接网线,网络不通;、

5、问题起因

项目测试过程网卡不能正常使用。

6、问题分析

可能存在的问题如下:

  1. 硬件问题;
  2. 驱动不支持网卡型号;
  3. 参数配置错误;

 7、排除步骤

  1. 在开发板上测试,不连接网线待软件启动成功后接入网线,现象复现,排除硬件问题;
  2. 在板卡上测试,不连接网线待软件启动成功后接入网线,现象复现,排除硬件问题;
  3. 在开发板上和板卡上测试,连接网线后启动软件,网络连接测试正常,排除驱动不支持网卡的问题;
  4. 在开发板上和板卡上测试,中间拨掉网线后测试,问题复现;
  5. 调试发现不连接网线的情况下对网卡驱动进行初始化,发现驱动初始化失败,未找到硬件连接而退出后面的初始化;问题定位在驱动初始化上;
  6. 将驱动初始化时,如未检测到硬件网线连接,默认配置网卡速度后,测试正常;

程序代码如下:

static u32_t get_Marvell_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;

    u32_t temp_speed;



    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 Marvell PHY error \r\n");

            break;

    // 检测失败后不返回错误

            //return XST_FAILURE;

        }

        XEmacPs_PhyRead(xemacpsp, phy_addr, IEEE_STATUS_REG_OFFSET, &status);

    }

    xil_printf("autonegotiation complete \r\n");

// 根据合适的速率进行配置

    XEmacPs_PhyRead(xemacpsp, phy_addr,IEEE_SPECIFIC_STATUS_REG,

                   &status_speed);

    if (status_speed & 0x400) {

        temp_speed = status_speed & IEEE_SPEED_MASK;



        if (temp_speed == IEEE_SPEED_1000)

            return 1000;

        else if(temp_speed == IEEE_SPEED_100)

            return 100;

        else

            return 10;

    }



    return XST_SUCCESS;

}

8、故障产生原因

  1. 网卡初始化时,因未检测到网线连接网卡不能正常初始化,导致网络不能正常使用。

9、结论

  1. 网卡初始化时,如未检测到网线连接,根据网卡速率选择合适的速度后,继续完成硬件配置后问题解决;

10、源程序下载

源程序下载地址: https://download.csdn.net/download/controstr/89733917

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值