linux phy fixed-link

Fixed link支持

linux内核驱动已经对PHY有很好的支持,一般PHY驱动用于对外部PHY进行配置,获取外部网络的连接状态、速度、双工属性等,但对于一些通用的switch芯片,一般与MPU是MAC-MAC的连接方式,另外还有些FPGA的关联应用,也是MAC-MAC,这种情况下,我们希望连接状态、链接速度、双工属性等参数为固定,因此内核提供了fixed-link的机制,实际上linux是通过虚拟一个属性固定的PHY设备来实现。

1.fixed-link在设备树中的描述示例如下:

ethernet@1 { ...

fixed-link { speed = <1000>;

     full-duplex;

      link-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>; };

... };

其中“fixed-link”为固定的子节点,speed表示外部PHY的连接速度,如 1000,100,10;

full-duplex表示双工属性,如half duplex,full-duplex;

 link-gpios用来指定表示检测网络连接状态的GPIO,驱动会读取gpio的值来决定网络状态,

设备树中添加fixed-link节点示例:

如果有些平台不支持设备树,需要在mac驱动里面手动注册fixed-link的PHY,如下:

2.在内核中,首先需要使能FIXED-LINK的支持,meneconfig配置如下:

   -> Device Drivers                                            

      -> Network device support          

          -> PHY Device support and infrastructure

-*-   MDIO Bus/PHY emulation with fixed speed/link PHYs

3.MAC层驱动中对fixed-link的支持:

 

fixed-link 需要MAC层驱动的支持,否则即使在设备树中添加了fixed-link的节点也不一定能正常工作。

 

3.1 phy device注册:

fixed-link phy device注册使用of_phy_register_fixed_link接口,其phy-dev的bus被指定为fixed_mdio_bus类型的platform_fmb,该mdio bus为虚拟的bus。

 

3.2 匹配phy driver

前面of_phy_register_fixed_link已经注册phy-dev设备,后面需要调用of_phy_connect来匹配phy driver,如果没有指定phy driver,内核会加载通用驱动 "Generic PHY",需要注意,所有phy driver里面的mdio总线操作都是使用前面platform_fmb里面的方法,即都是虚拟的。

 

 

注:常规的phy device与phy driver匹配方式:通过mdio总线读取外部phy的id,与驱动中定义的id(如下)对比

 

 

 

下面是SAMA5  mac( 4.9 kernel  drivers\net\ethernet\cadence)层驱动使用fixed-link的示例:

 

if (of_phy_is_fixed_link(np)) {

err = of_phy_register_fixed_link(np);

if (!err)

bp->phy_node = of_node_get(np);

}

    if (bp->phy_node) {

        err = -ENXIO;

        dev->phydev = of_phy_connect(dev, bp->phy_node,

            &macb_handle_link_change, 0,

            bp->phy_interface);

        if (dev->phydev) {

            bp->link = 0;

            bp->speed = 0;

            bp->duplex = -1;

            err = 0;

           

            if (macb_is_gem(bp) && bp->caps & MACB_CAPS_GIGABIT_MODE_AVAILABLE)

                dev->phydev->supported &= PHY_GBIT_FEATURES;

            else

                dev->phydev->supported &= PHY_BASIC_FEATURES;

 

            if (bp->caps & MACB_CAPS_NO_GIGABIT_HALF)

                dev->phydev->supported &= ~SUPPORTED_1000baseT_Half;

 

            dev->phydev->advertising = dev->phydev->supported;               

        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值