Linux-MDIO总线的read/write
linux mdio mii
一、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设备的读写。
更多推荐
所有评论(0)