1. Linux 系统网络协议层架构

  • 网络协议框架图:

网络子系统是 linux 操作系统里很重要的一部分。关于这部分有很多的参考资料。这里主要说明一下 phy
芯片在整个子系统里的位置。从这个结构里看到,PHY 驱动的功能处于链路层。

  • 以太网物理层与硬件连接
    从软件角度,对 phy 芯片的控制主要包括二部分:
    1) 与 MAC 设备的接口,即是 gmii 还是 rgmii。
    2) Phy 芯片的地址正确配置,可以通过 mdio/mdc 正确访问到 phy 芯片的寄存器。

2. 链路层与 Linux 网络设备管理

Linux 网络设备系统包括设备与驱动二大部分。网络设备驱动包括 MAC 层的驱动、MDIO 总结接口驱动
与 phy 驱动。结合 linux 系统设备树定义以及设备管理系统,构成 phy 驱动在开发过程中涉及到的所有
部分。示意如下图:
在 Linux 设备管理系统里,硬件设备对应于在/sys/devices 下有对应的节点。如 MAC 设备:

ls -l /sys/devices/platform/ | grep ethernet
drwxr-xr-x 5 root root 0 2011-01-01 13:00 ff290000.ethernet

同理,硬件的 mdio 总线和 phy 芯片也会对应有一个设备节点:


rk3288:/sys/devices/platform/ff290000.ethernet # ls -l | grep bus
lrwxrwxrwx 1 root root 0 2021-01-23 05:44 driver -> ../../../bus/platform/drivers/rk_gmac-dwmac
drwxr-xr-x 3 root root 0 2011-01-01 13:00 mdio_bus ;mdio 设备节点
lrwxrwxrwx 1 root root 0 2021-01-23 10:37 subsystem -> ../../../bus/platform
rk3288: /sys/devices/platform/ff290000.ethernet/mdio_bus/stmmac-0 # ls -l | grep stmm
drwxr-xr-x 3 root root 0 2011-01-01 13:00 stmmac-0:04 ;地址为 4 的 phy 设备节点

3. Linux 以太网 phy 驱动基本开发流程

根据上图 linux 模块之间的关系,总结 Phy 驱动的开发流程如下:

  1. 硬件设计。包括 PHY 芯片地址设定、与 MAC 接口模式(如 RGMII)、MAC 时钟的接入方式、PHY 芯
    片的复位管脚以及 PHY 芯片上电工作模式的设置。
  1. 根据硬件连接,修改 linux 系统的设备定义树.dts 文件。通常是修改 GMAC 的定义以及 MII 管脚复用
    定义。具体需要看 SOC 芯片开发平台的定义。
  2. 把 phy 驱动编译链接到到 Linux Kernel Image 里来。具体请参考文档《裕太驱动使用手册》。
  3. 开机运行,检查目标机系统里有没有网络设备,如 eht0。如果有则进行下一步网络功能与性能的测
    试。如果没有,请检查:
  • Phy 驱动有没被正确加载,参看文档《裕太驱动使用手册》。
  • MAC 驱动有没有正确运行,参看开发平台提供的 MAC 驱动,重点检查(1)在 DTS 里配置的
    compatible 字段与 MAC 驱动里的定义是否一致。(2)MAC 资源(io map)与 irq 是否加载正确。
  • MDIO 是否访问正确。在 mdio 扫描代码里增加打印看 phy 寄存器的读写是否正确。
  • Phy id 是否被正确识别。在 mdio 扫描代码里增加打印看读到的 phy id 与 phy 驱动的 phy id 是
    否一致。
  • 与硬件工程师确认 phy 芯片是否工作正常(上电时序、时钟,供电及复位等),正常的话 phy 应该可以 link up。
  1. 网络设备建议与正常 Link up 之后,就可以进行网络功能测试。主要是 ping 通。
    Ping 通是很关键的一步。Ping 通与以下配置有关:
  • 如果是 rgmii 接口,在设备树配置文件里的 tx_delay 和 rx_dealy 的配置很重要,参考后面关于
    rgmii delay line 的配置。
  • PHY 的状态(link up, speed, duplex)是否正确。这个需要在 phy state machine 里增加打印进行跟
    踪(通常在 phy.c 里)。
  • 通过统计计数(MAC 层,phy 层)来确认是哪个方向(tx 或者 rx)的问题。
  1. 网络性能测试。主要是 iperf 性能测试。测试在 1000m 和 100m 等各种情况下的网络性能。
  2. 到这里整个 phy 驱动的功能就算完成了

4. Linux 设备树里 MAC 定义

MAC 设备的硬件描述在不同的平台里有区别。大多数的系统平台都使用 linux 的.dts 文件。如rk3556的RGMII:

&gmac1 {phy-mode = "rgmii";clock_in_out = "input";snps,reset-gpio = <&gpio0 RK_PC2 GPIO_ACTIVE_LOW>;snps,reset-active-low;snps,reset-delays-us = <0 20000 100000>;assigned-clocks = <&cru SCLK_GMAC1_RX_TX>, <&cru SCLK_GMAC1>, <&cru CLK_MAC1_OUT>;assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>, <&gmac1_clkin>;assigned-clock-rates = <0>, <125000000>, <25000000>;pinctrl-names = "default";pinctrl-0 = <&gmac1m1_miim&gmac1m1_tx_bus2&gmac1m1_rx_bus2&gmac1m1_rgmii_clk&gmac1m1_rgmii_bus/*&eth1m1_pins*/&gmac1m1_clkinout>;tx_delay = <0x28>;rx_delay = <0x0>;phy-handle = <&rgmii_phy1>;status = "okay";
};&mdio1 {status = "okay";rgmii_phy1: phy@1 {   //phy的地址:001compatible = "ethernet-phy-ieee802.3-c22";reg = <0x1>; //phy的地址clocks = <&cru CLK_MAC1_OUT>;};
};

这其中phy的地址需要跟硬件确认,我之前调试的时候一直attch不到phy就是phy的地址没有弄正确

5.RGMII 接口 delay line 调整

对于 RGMII 接口,rx 和 tx delay line 调整的过程如下:

  1. 如果有参考的板子,可以按照参考值尝试。如果不行就按下面的步骤再进行。
  2. 在 DTS 里,把 tx_delay 和 rx_delay 都设置为 0。 3) 上电看能不能 ping 通。
  3. 如果不能 ping 通或者 ping 时断时续,就按下面的步骤,修改 PHY 本身的 delay 配置。通常 rx_delay不用调整。下面调整 tx_delay。Phy 寄存器读写方法参见下面的说明。
  • 设置 Ext. Reg 0xc.bit[7:4]为 0xf
  • 软件复位 phy(mii_reg_0.b15=1)
  • Link up 之后,看能不能 ping 通。
  • 如果不行,按二分法减少 delay 值,设置 Ext. Reg 0xc.bit[7:4],再从 b)步骤尝试,直到 ping 通。如果尝试了所有值都不通,再修改 DTS 里 tx_delay 为 0xf 再从步骤 3)开始尝试。
  1. 最后找到的值配置 dts 文件或者 Ext. Reg 0xc.bit[7:4](这里时修改phy的寄存器)。建议优先设置 dts 文件。

6。寄存器读写工具

6.1 PHY 寄存器读写

6.1.1 Linux MAC 设备 mdio 方法

通常 linux 系统的 mac 设备都有一个通用的方法对 phy 寄存器进行读写,不太好用,但不需要额外工作可以直接使用。方法是:

  1. 找到 phy 设备,如:
ls -l /sys/devices/platform/ | grep eth
drwxr-xr-x 5 root root 0 2011-01-01 13:00 ff290000.ethernet

上面例子里,找到 mac 设备 ff290000.ethernet,继续找到 phy 设备,如下:

ls -l /sys/devices/platform/ff290000.ethernet/mdio_bus/
total 0
drwxr-xr-x 5 root root 0 2011-01-01 13:00 stmmac-0
ls -l /sys/devices/platform/ff290000.ethernet/mdio_bus/stmmac-0/
total 0
lrwxrwxrwx 1 root root 0 2021-01-23 13:32 device -> ../../../ff290000.ethernet
drwxr-xr-x 2 root root 0 2011-01-01 13:00 power
drwxr-xr-x 3 root root 0 2011-01-01 13:00 stmmac-0:00
drwxr-xr-x 3 root root 0 2011-01-01 13:00 stmmac-0:04
lrwxrwxrwx 1 root root 0 2021-01-23 13:32 subsystem -> ../../../../../class/mdio_bus
-rw-r--r-- 1 root root 4096 2011-01-01 13:00 uevent

找到 phy 设备 stmmac-0:04:

cd /sys/devices/platform/ff290000.ethernet/mdio_bus/stmmac-0/stmmac-0:04
ls -l
total 0
lrwxrwxrwx 1 root root 0 2021-01-23 05:23 driver -> ../../../../../../bus/mdio_bus/drivers/YT8511 Gigabit Ethernet
-r--r--r-- 1 root root 4096 2021-01-23 05:23 phy_has_fixups
-r--r--r-- 1 root root 4096 2021-01-23 05:23 phy_id
-r--r--r-- 1 root root 4096 2021-01-23 05:23 phy_interface
-rw-r--r-- 1 root root 4096 2021-01-23 05:23 phy_registers
drwxr-xr-x 2 root root 0 2011-01-01 13:00 power
lrwxrwxrwx 1 root root 0 2021-01-23 05:23 subsystem -> ../../../../../../bus/mdio_bus
-rw-r--r-- 1 root root 4096 2011-01-01 13:00 uevent

对 phy 寄存器的读写就是操作文件 phy_registers。
2) 读寄存器
cat phy_registers
3) 写 mii 寄存器
例:写 mii reg 0 为 0x9000:
echo 0x0 0x9000> phy_registers
4) 读 ext 寄存器
例:读 ext reg 0xc:
echo 0x1e 0xc> phy_registers && cat phy_registers
30: 0xc
31: 0x8052
返回值在 mii reg 0x1f(31d)里,例中为 0x8052。
5) 写 ext 寄存器
例:写 ext reg 0xc 值为 0x80f6:
echo 0x1e 0xc> phy_registers && echo 0x1f 0x80f6> phy_registers

6.2 GMAC 寄存器读写

这个依赖于不同的平台。以下以瑞芯微 rk3399 开发平台为例。

6.2.1 内存读写工具: io

注意 GMAC 的基地址是 0xff730000。GMAC 基地址可以在 DTS 文件中查到。

  1. 读 GMAC 寄存器(32 位寄存器,从偏移为 0 开始的 4 个寄存器)
    [root@cqrk3399:/]# io -4 -l 16 0xff730000 ;显示当前 gpio1 的 in/out,及值配置
    ff730000: 00000018 01024018 00000000 00000000 ;gpio1 a[1]=input, val=0
  2. 写 GMAC 寄存器(32 位寄存器,偏移地址为 4)
    [root@cqrk3399:/]# io -4 -w 0xff730004 0x0102401a; GPIO DDR 寄存器,gpio1 a[1]=output
  3. 写 GMAC 寄存器(32 位寄存器,偏移地址为 0)
    [root@cqrk3399:/]# io -4 -w 0xff730000 0x1a ; GPIO DR 寄存器,gpio1 a[1]=output 1

7. 收发包统计计数查看

在定位 phy 收发包问题时,重要的一步是分清是发送问题还是接收问题。所以查看收发包的计数可以帮
忙定位问题。

7.1 MAC 层收发包计数

7.1.1 ifconfig
ifconfig eth0
eth0 Link encap:Ethernet HWaddr 5e:8a:8a:5b:9f:74 Driver rk_gmac-dwmacinet addr:192.168.1.202 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::d6ea:73da:63fa:8827/64 Scope: LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:1993 errors:0 dropped:0 overruns:0 frame:0 TX packets:1046 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:142969 TX bytes:128206 Interrupt:41

这里的 RX/TX packets 表示 MAC 成功接收和发出的包数。通过多次读取并对比可以确定哪个方向有问题。

7.1.2 /proc/net/dev

Linux proc 文件系统也提供了网络设备 MAC 层的包统计信息:

cat /proc/net/dev
Inter-|   Receive                                                |  Transmitface |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
ip6tnl0:        0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
ip6_vti0:      0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0can0:          0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0eth0:          0       0    0    0    0     0          0         0     4644       0    0    0    0     0       0          0
dummy0:   0       0    0    0    0     0          0         0      560       8    0    0    0     0       0          0
ip_vti0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0lo:             0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0sit0:           0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0

网络驱动->PHY驱动调试相关推荐

  1. phy 驱动与 switch 驱动

    phy 驱动与 switch 驱动 phy 驱动 phy 与 cpu 的硬件连接 一般为 MAC-PHY 模式: ----------- | CPU | RGMII/| ------| MII --- ...

  2. 展锐UDX710:LAN7800 PHY驱动调试

    展锐UDX710:LAN7800 PHY驱动调试 1. 前期准备 1.1 调试环境 1.2 预置条件 1.3 硬件连接 2. 驱动适配 2.1 开启内核驱动支持 2.2 驱动加载验证 2.3 配置网络 ...

  3. PHY驱动调试之 --- PHY控制器驱动(二)

    1. 前言 内核版本:linux 4.9.225,以freescale为例. 2. 概述 PHY芯片为OSI的最底层-物理层(Physical Layer),通过MII/GMII/RMII/SGMII ...

  4. 网口调试基础之一网口phy驱动

    本节主要梳理linux网口驱动流程. 设备间的逻辑关联图及抽象 如下图为cpu与mac.phy之间的逻辑关联图,针对mac与phy之间的连接,包括两部分: 通过mii/rgmii/sgmii/-与ph ...

  5. 高通SDX55平台:R8168 PHY驱动适配

    高通SDX55平台 R8168 PHY驱动适配 1. SDX55 CPE应用场景 高通5G平台SDX55支持5G独立组网(SA)和非独立组网(NSA)两种网络架构,同时兼容LTE和WCDMA制式,拥有 ...

  6. Mstar Mac Phy 驱动学习

    MII.h 和 MII.c 这是MII协议.里面有MII协议的PHY寄存器地址,及MII通信接口库 Linux的mdio主要是为了管理PHY芯片寄存器的,跟踪代码发现,它会进行创建PHY设备及一些初始 ...

  7. Linux phy驱动开发总结

    文章目录 基础 须知 数据结构 数据结构UML类图 MAC驱动 初始化简述 驱动实现 关于MAC连接PHY PHY驱动 动态注册 静态注册 通用PHY 参考模板 IP18xx驱动调试 须知: 问题 方 ...

  8. linux PHY驱动

    本文参考3.17版本的内核,结合TI的cpsw驱动(但去掉cpsw大部分代码,保留phy相关的),追踪一下通用PHY驱动.文中使用函数及主要功能语句的形式给出调用过程. MDIO驱动 Linux的md ...

  9. Linux系统网卡驱动phy工作原理解析

    Linux网卡驱动架构 MAC控制器驱动是芯片厂商集成在SDK中 比如三星控制器.ATMEL控制器,这部分驱动厂商已经写好了, linux下自带通用phy驱动phy_device.c(phy层协议是通 ...

最新文章

  1. 关于silverlight5 打印功能收集
  2. 直立车各环的调试_平衡小车调试指南(直立环 速度环)
  3. vba怎么安装_VBA还要学吗?怎么入门Excel VBA?
  4. 高精度乘法 c语言,很大的数相乘怎么办?
  5. 电脑常见故障排除_中央空调常见故障解析
  6. 前端学习(2319):angular2概述
  7. JQuery如何与数据库交互
  8. 开工大吉:Oracle 18c已经发布及新特性介绍
  9. office2010出现“此错误通常是由宏安全性设置造成的”的解决办法
  10. 递归算法的总结与应用
  11. 在html中base的作用,html中base标签的作用是什么
  12. java考试知识点整理
  13. 使用FusionChartsFree整合项目
  14. 三字代码html,【涨知识】原来三字代码是这样来的!四字代码是什么?
  15. 小游戏---java版2048(2048 go go go)
  16. 可以额外获得大量福卡的绝招
  17. 计算机上图片打不开,电脑上打不开jpg格式的图片是怎么回事?
  18. 正则表达式里“-“中划线的使用注意
  19. 计算机制图符号制作,基本流程图的制作-通过在线制图工具绘制
  20. 关于做一个有价值的人的思考(1,财富扮演什么角色)

热门文章

  1. html中如何写新闻题目,DIV CSS布局 短栏目与新闻标题列表布局模块代码
  2. OceanBase数据库obclient rpm包安装依赖libobclient问题
  3. JQuery自动轮播效果,带字幕说明,带底部滚动圈圈,兼容IE7以上所有主流浏览器。(魔兽背景哟亲)
  4. 哈工大操作系统实验总结
  5. java的开源框架,Java开源框架
  6. windows安装信息服务器不可用,如何解决win10系统iis服务器应用程序不可用问题
  7. 慈风阁预测属鼠的人2017年运程
  8. 遥志虚拟盘服务器ip地址是不是全部填写127.0.0.1,CCBoot帮助文档.doc
  9. PS编辑按钮图片(修改或添加文字等)
  10. PPT插入FLV视频文件的简单方法(转)