linux驱动源码分析(xilinx的千兆网口)

1.涉及的文件:
macb_main.c   phy_device.c dp83867.c

phy_device.c 在内核启动就会运行该驱动,它是匹配PHY和配置phy的重要接口。


2.驱动之间的关系

macb_mii_probe ——> phy_connect_direct  ---》 phy_attach_direct

phy_init -----》 phy_driver_register


2.1 初始化phy
phy_init_hw ---》 phydev->drv->config_init(phydev)


2.2 把phy的设备和驱动关联起来
                                                                    mdio_bus_match
                                                                                 |
get_phy_device --》phy_device_create——》  phy_bus_match --》  phydrv->match_phy_device


2.3phy状态机的关系
phy_device.c                                 phy.c
      |                                                 |
*phy_device_create ———》 phy_state_machine

 

2.4设置自协商相关代码(phy_start_aneg(phydev))
phy_ethtool_sset
phy_ethtool_ksettings_set
phy_mii_ioctl

 phy.c                                                                                             phy_device.c 
    |                                                                                                    |
phy_state_machine  --->  phy_start_aneg_priv ---> err = phydev->drv->config_aneg(phydev); --> genphy_config_aneg  -->  genphy_setup_forced --->设置PHY固定速率

2.5 自协商完成是通过中断通知
phy.c                                              phy_device.c

|                                                                |
phy_start_aneg_priv  --》 phy_aneg_done  --》 genphy_aneg_done

 

2.6 phy_device.c创建phy设备

struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id,
                     bool is_c45,
                     struct phy_c45_device_ids *c45_ids)
{
    struct phy_device *dev;
    struct mdio_device *mdiodev;

    /* We allocate the device, and initialize the default values */
    dev = kzalloc(sizeof(*dev), GFP_KERNEL);
    if (!dev)
        return ERR_PTR(-ENOMEM);

    mdiodev = &dev->mdio;
    mdiodev->dev.release = phy_device_release;
    mdiodev->dev.parent = &bus->dev;
    mdiodev->dev.bus = &mdio_bus_type;
    mdiodev->bus = bus;
    mdiodev->pm_ops = MDIO_BUS_PHY_PM_OPS;
    mdiodev->bus_match = phy_bus_match;
    mdiodev->addr = addr;
    mdiodev->flags = MDIO_DEVICE_FLAG_PHY;
    mdiodev->device_free = phy_mdio_device_free;
    mdiodev->device_remove = phy_mdio_device_remove;

    dev->speed = 0;
    dev->duplex = -1;
    dev->pause = 0;
    dev->asym_pause = 0;
    dev->link = 1;
    dev->interface = PHY_INTERFACE_MODE_GMII;

    dev->autoneg = AUTONEG_ENABLE;

    dev->is_c45 = is_c45;
   
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Zynq千兆网口实验是一种基于Zynq系列处理器的网络通信实验。Zynq是Xilinx公司推出的一款集成了ARM处理器和可编程逻辑资源的可扩展处理器平台。 在进行Zynq千兆网口实验之前,首先需要准备一块Zynq开发板和软件开发工具。然后,我们可以通过Vivado软件进行Zynq处理器的设计和配置。 在这个实验中,我们将主要关注如何使用Zynq的千兆网口实现网络通信。我们可以利用Zynq的可编程逻辑资源和处理器来实现网络协议栈的功能。Zynq处理器可以通过软件实现网络协议的处理,例如使用TCP/IP协议栈来进行网络通信。 首先,我们需要配置Zynq的千兆网口,包括设置IP地址和子网掩码等网络参数。然后,我们可以使用Zynq的网口来进行数据的发送和接收。可以通过编写相应的驱动程序来控制和操作网口的发送和接收功能。 接下来,我们可以编写应用程序来使用Zynq的千兆网口进行网络通信。我们可以利用Zynq的处理器来实现网络应用,例如网络服务器或客户端。我们可以使用Zynq的网口接收来自其他设备的数据,并对数据进行处理和响应。 在Zynq千兆网口实验中,我们可以通过观察网络数据包的传输和接收情况来验证实验效果。我们可以使用网络调试工具来监控网络数据的传输和接收,并分析数据包的内容。 总之,Zynq千兆网口实验是一种基于Zynq处理器的网络通信实验,通过配置Zynq的千兆网口和开发相关的软件程序,可以实现数据的发送和接收,并验证网络通信的功能和效果。这个实验可以帮助我们更深入地了解Zynq处理器的应用领域和网络通信的原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值