一、MDIO总线作用:

       MDIO总线用来管理phy/switch等外置芯片,实现芯片寄存器的读写等操作,只要是挂在mdio总线上的芯片,都可以通过mdio的方式来访问;

 作用:

        1、配置phy的工作模式(自协商、百兆/千兆、交叉自适应等);

        2、获取phy的工作状态(link状态等);

        3、配置switch的相关寄存器(mode、vlan、流控等);

        4、获取switch的port的数量统计,丢包统计等;

 一般作用于以下几种情形:

        1、phy直接通过mac-to-mac连接到cpu的mac资源上:

        2、phy接到switch的mac上:

        3、switch直接通过back-to-back接到cpu的mac资源上:

        4、switch没有连接到cpu的mac资源上:

         

二、Linux系统对mdio总线的支持:

        Linux系统对于mdio总线的驱动,是用mii总线来实现的,mii总线提供了soc的bus->read/bus->write的方法;对于直接连接到mac资源的phy设备,mac网卡初始化的时候都会通过查询dts或者遍历phy地址来将该phy设备注册到该mii总线上,通ethtool工具来查看或者配置phy基本工作模式。

        

三、访问mdio总线上的设备:

        一般linux下访问mdio总线下的设备,可以通过如下几种方式来实现:

        1、linux应用程序通过ioctl来访问:

              前提条件是该phy直接挂载在mac上,注册phy的时候注册到mii总线上。

               ioctl(sockfd, SIOCGMIIPHY, &ifr);

        2、linux应用程序中通过mmap方式映射mdio寄存器区域,直接读写该寄存器来实现mdio的访问;

        3、直接通过mii总线的read/write接口来访问:

                 1)、自己写一个驱动程序,驱动中注册phy设备到mii总线,并提供operations的方法:

                 2)、自己写一个驱动程序,通过

                        drv = driver_find(name, &platfom_bus_type)

                        dev = driver_find_device(drv);

                        pdev = to_platform_device(dev);

                        ndev = platform_get_drvdata(pdev);

                        pridate = netdev_priv(ndev);

                        mii_buss = pridate->mii_bus;

                        我们就找到了mii_buss总线,及mdio总线,通过mii_buss->read/mii_buss->write来实现对mdio设备的读写。

                

Logo

更多推荐