Linux以太网模块
一、以太网的组成
1、MII总线,(SGMII、RGMII):SOC与MAC之间(MII/RGMII/SGMII 本质都是 MAC ↔ PHY 的数据总线接口,区别主要是速率和引脚数量。)
2、(SMI)MDIO总线:(复杂以太网PHY芯片寄存器的配置)MAC 控制 PHY 寄存器 的管理总线,不用于传输以太网数据。用于“告诉 PHY 怎么工作”。
数据在RK3568上如何传输:SOC<--->MAC控制器<--->PHY芯片<--->水晶头(网线接口)
一、RGMII接口分类
通信接口汇总
MAC与PHY的通信:MII, RGMII, SGMII
MII:它是 IEEE-802.3 定义的以太网标准接口, MII 接口用于以太网 MAC 连接 PHY 芯片。16根信号线,还需要两根MDIO和MDC两根线,由于信号线太多,目前已经很少了。
RMII:RMII 接口只需要 7 根数据线。
GMII:GMII(Gigabit Media Independant Interface),千兆 MII 接口。传输可达1000Mbps,可以兼容MII规定的10/100Mbps。符合 IEEE 以太网标准,定义见 IEEE 802.3-2000。信号线
RGMII:精简版 GMII 接口,14根信号线(不包含MDIO两根信号线),为了保持 1000Mbps 的传输速率不变, RGMII 接口在时钟的上升沿和下降沿都采样数据,在参考时钟的上升沿发送 GMII 接口中的TXD[3:0]/RXD[3:0],在参考时钟的下降沿发送 GMII 接口中的 TXD[7:4]/RXD[7:4]。 RGMII 同时也兼容 100Mbps 和10Mbps 两种速率,此时参考时钟速率分别为 25MHz 和 2.5MHz。
MDIO:MDIO 全称是 Management Data Input/Output,直译过来就是管理数据输入输出接口,是一个简单的两线串行接口,一根 MDIO 数据线,一根 MDC 时钟线。
RGMII(GMAC)负责控制器和PHY芯片的沟通,MDIO 是总线协议,类似I2C控制总线。
二、MDIO C22与C45接口
MDIO责任:把PHY初始化对应的状态。
MDIO接口数据帧分为两种:
一种是Clause22: 百兆千兆以太网,Clause 22是最早的MDIO子协议,也被称为MDC/MDIO。使用两根信号线:MDC(管理数据时钟)和 MDIO(管理数据输入/输出)。
一种是Clause45:千兆以上的以太网,使用四根信号线:MDC、MDIO以及MDIO数据和时钟的扩展,是IEEE 802.3an标准中引入的新协议。车载以太网使用C45。
如果需要将phy固定为百兆,不希望自适应,这时候需要通过MDIO接口直接初始化PHY来固定,就修改下面这个寄存器。
四、MDIO驱动子系统
类似i2c总线驱动模型一样,MDIO也是一个总线驱动,抽象成mdio_bus。如下图所示。
驱动中PHY ID的获取drivers/net/phy/phy_device.c
struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45)
{struct phy_c45_device_ids c45_ids;u32 phy_id = 0;int r;c45_ids.devices_in_package = 0;c45_ids.mmds_present = 0;memset(c45_ids.device_ids, 0xff, sizeof(c45_ids.device_ids));if (is_c45) {r = get_phy_c45_ids(bus, addr, &c45_ids);} else {r = get_phy_c22_id(bus, addr, &phy_id);}if (r)return ERR_PTR(r);//扫到PHY以后才会调用到这里return phy_device_create(bus, addr, phy_id, is_c45, &c45_ids);
}
EXPORT_SYMBOL(get_phy_device);
PHY ID 查看 /sys/bus/mdio_bus/devices
phy_id的定义位置 kernel/driver/net/phy/realtek.c
五、ethtool调试工具
ethtool
是一个用于 Linux 系统中网络接口配置和诊断的命令行工具。它允许你查询和设置网络接口的各种参数,如
网卡的速度 :要求主机 与 下位机 对速度必须一致
双工模式:要求主机 与 下位机 必须一致
MAC 地址
链接状态:要求主机 与 下位机 物理网线的链接状态
ethtool
常用于调试和优化网络连接,尤其是在需要手动配置网络适配器时。
5.1 ETHTOOL查看信息--- 读
ethtool ethx 査看eth0网卡的基本设置,内容包括网卡速率、网卡的工作模式等,ethtool -ieth0 查看eth0网卡的驱动信息,内容包括驱动的型号、驱动的版本等
ethtool -d ethx 查询ethx网囗注册性信息
ethtool -S ethx 查询ethx网囗收发包统计 (注意S是大写)
ethtool -h //显示ethtool的命令帮助(help)
5.2 设置 ---写
该命令只是临时设置,如果网卡重启就失效了。要进行速率配置,自协商需要关了。
ethtool -s eth0 speed [10|100|1000] // 设置网卡的速率,单位是:Mb/s
ethtool -s eth0 duplex [half|ful] //设置网卡的工作模式,可设置为半双工或全双工
ethtool-s eth0 autoneg [on|off] // 设置网卡是否自动协商,自动协商的内容主要包括工作模式、网卡速率以及流控等参数
六、PHY的调试经验总结
6.1、ethtool工具
查看网卡工作状态:ethtool eth0
查看网卡统计数据:ethtool -S eth0
打开自协商:ethtool -s eth0 autoneg on
关闭自协商:ethtool -s eth0 autoneg off speed 100
重协商观察内核log:ethtool -r eth0
6.2、ifconfig
ifconfig 查看网卡状态和统计数据:ifconfig
开关网卡观察内核log:ifconfig eth0 up/down
多次执行ifconfig观察指定网卡的统计数据变化:ifconfig eth0多次
6.3、tcpdump (wireshark) 抓包
从模组往外ping一个同网段的地址
tcpdump -i eth0 -w xxx.pcap
pc上抓wireshark log
对比两边的抓包,观察arp和icmp能够看出时tx不通还是rx不通
6.4、arp
检查局域网内能够通信的设备若arp -n返回为空,一般能够说明链路层不通:arp -n
6.5、软中断的观察
/proc# cat softirqs
6.6、CPU使用率观察
top
mpstat
速率达不到理论值,最大的可能,板卡CPC主频受限