PHY 驱动的功能处于链路层:
我们重点关注以下两点:
(1)与 MAC 设备的接口,即是 gmii 还是 rgmii。
(2) Phy 芯片的地址正确配置,可以通过 mdio/mdc 正确访问到 phy 芯片的寄存器。
????????Linux 网络设备系统包括设备与驱动二大部分。网络设备驱动包括 MAC 层的驱动、MDIO 总结接口驱动 与 phy 驱动。
????????包括 PHY 芯片地址设定、与 MAC 接口模式(如 RGMII)、MAC 时钟的接入方式、PHY 芯 片的复位管脚以及 PHY 芯片上电工作模式的设置。这一般是硬件工程师的工作,驱动工程师只要根据硬件原理图配置软件即可。
通常是修改 GMAC 的定义以及 MII 管脚复用定义。具体需要看 SOC 芯片开发平台的定义。
解压驱动,解压后按照 Linux 的目录结构展开。用户需要将文件按相应的目录 copy 到目标板 Linux 系统开发环境
?将.c文件和头文件copy到各自的目录
motorcomm.c?? --->??longan/kernel/linux-5.15/drivers/net/phy/motorcomm.c???
motorcomm_phy.h??--->??longan/kernel/linux-5.15/include/linux/?motorcomm_phy.h
添加Kconfig
config MOTORCOMM_PHY
tristate "Motorcomm PHYs"
---help---
Supports the YT8010, YT8510, YT8511, YT8512 PHYs.
添加Makefile
obj-$(CONFIG_MOTORCOMM_PHY) += motorcomm.o
重新编译烧录后,检查目标机系统里有没有网络设备,如 eht0。
主要是 ping 通。 Ping 通是很关键的一步。Ping 通与以下配置有关:
a) 如果是 rgmii 接口,在设备树配置文件里的 tx_delay 和 rx_dealy 的配置很重要,参考后面关于 rgmii delay line 的配置。
b) PHY 的状态(link up, speed, duplex)是否正确。这个需要在 phy state machine 里增加打印进行跟 踪(通常在 phy.c 里)。
c) 通过统计计数(MAC 层,phy 层)来确认是哪个方向(tx 或者 rx)的问题。
重新编译烧录后,开发板系统里没有网络设备:
(1) Phy 驱动有没被正确加载。
(2) MAC 驱动有没有正确运行,参看开发平台提供的 MAC 驱动,重点检查在 DTS 里配置的 compatible 字段与 MAC 驱动里的定义是否一致。
(3)MDIO 是否访问正确。在 mdio 扫描代码里增加打印看 phy 寄存器的读写是否正确。
(4)Phy id 是否被正确识别。在 mdio 扫描代码里增加打印看读到的 phy id 与 phy 驱动的 phy id 是 否一致。
(5)与硬件工程师确认 phy 芯片是否工作正常(上电时序、时钟,供电及复位等)。