Linux-MDIO总线的read/write

一、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设备的读写。

                

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中,`phy_read`函数是定义在`linux-4.9.225\include\linux\phy.h`文件中的。该函数用于从物理设备中读取寄存器的值。具体的定义如下: ```c static inline int phy_read(struct phy_device *phydev, u32 regnum) { return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, regnum); } ``` 在该函数中,调用了`mdiobus_read`函数来实际执行读取操作。`phydev`参数是一个指向`struct phy_device`结构体的指针,表示物理设备。`regnum`参数表示要读取的寄存器的编号。函数返回读取到的寄存器值。 另外,`phy_write`函数也是定义在同样的文件中,用于向物理设备中写入寄存器的值。具体的定义如下: ```c static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val) { return mdiobus_write(phydev->mdio.bus, phydev->mdio.addr, regnum, val); } ``` 该函数调用了`mdiobus_write`函数来实际执行写入操作。`phydev`参数和`regnum`参数的含义与`phy_read`函数相同,`val`参数表示要写入的寄存器值。 综上所述,`phy_read`和`phy_write`函数是用于在Linux中读取和写入物理设备寄存器的函数。 #### 引用[.reference_title] - *1* [PHY驱动调试之 --- PHY控制器驱动(二)](https://blog.csdn.net/enlaihe/article/details/125172195)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Linux Phy 驱动解析](https://blog.csdn.net/pwl999/article/details/128339747)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值