代码说明
MDIO总线的注册和初始化:分配并注册MDIO总线,用于与PHY设备通信。
网络设备的创建:分配网络设备(如以太网接口)。
PHY设备连接:通过phy_connect函数连接PHY设备,指定回调函数my_adjust_link处理链路状态变化。
PHY设备配置与启动:设置PHY的支持模式和配置,然后使用phy_start启动PHY设备。
使用说明
编译并插入该模块:
sh
复制代码
make
sudo insmod my_phy_driver.ko
在dmesg或系统日志中查看输出,以确认PHY设备是否成功初始化和连接。
新增的部分说明
PHY驱动结构体 (phy_driver):定义了PHY设备的基本信息和回调函数,例如config_init、config_aneg、read_status等。这些函数用于初始化配置、管理状态、挂起和恢复PHY设备。
phy_id:用于匹配设备的PHY ID。
config_aneg:配置自动协商。
read_status:读取设备状态,这里使用了通用的genphy_read_status。
PHY驱动注册 (phy_driver_register):在初始化时注册PHY驱动,并在卸载时取消注册。
状态机检查:read_status回调将读取PHY的状态,并在链路状态变化时更新状态机。
增加的内容说明
扫描PHY设备:在my_scan_and_register_phy函数中,通过mdiobus_get_phy()函数扫描MDIO总线的每个地址(通常为0到31),检查是否存在可用的PHY设备,并尝试连接。
注册找到的PHY设备:如果找到了PHY设备,通过try_module_get()来确保该设备的驱动模块被引用,然后使用phy_connect()连接到网络设备,并配置PHY的支持模式。
错误处理:在扫描和注册过程中,加入了错误处理逻辑,确保在没有找到PHY设备或连接失败时,能够清理资源并退出。
代码自定义部分说明
my_config_init:在config_init回调中可以添加PHY的特定初始化配置,比如写入特定寄存器以启用特定功能。在本例中,写入寄存器0x1F来执行初始化配置。
my_config_aneg:配置自动协商功能,通常使用通用的genphy_config_aneg即可,同时可以在该函数中扩展或自定义自动协商的细节。
my_read_status:自定义状态读取函数。此函数读取PHY的链路状态,并打印当前链路的速度和双工模式。这一部分通常是通过调用genphy_read_status来获取当前状态。
my_suspend 和 my_resume:挂起和恢复函数。在挂起时写入BMCR_PDOWN以进入低功耗模式,在恢复时退出低功耗模式,确保PHY恢复到工作状态。
在Linux系统中增加一个PHY驱动并实现其编译、加载和使用的步骤如下:
步骤 1:编写PHY驱动代码
- 创建驱动代码:首先编写一个支持标准10M、100M、1000M速率的PHY驱动。可以参考前面提供的示例代码,将代码保存为
my_phy_driver.c
。 - 确保代码结构:该驱动应包含PHY的基本初始化、自动协商、状态读取、挂起和恢复功能。
步骤 2:配置驱动的Makefile
- 创建一个
Makefile
,用于编译驱动模块。Makefile
示例:makefile
复制代码
obj-m += my_phy_driver.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Makefile
中的obj-m
定义驱动模块文件my_phy_driver.o
,$(PWD)
表示当前工作目录。该配置将编译驱动到当前的Linux内核版本中。
步骤 3:编译驱动
在终端中进入保存驱动和Makefile
的目录,执行以下命令进行编译:
bash
复制代码
make
成功编译后,会生成.ko
文件,例如my_phy_driver.ko
,表示该驱动的可加载内核模块文件。
步骤 4:加载驱动模块
- 加载模块:使用
insmod
命令加载模块:bash
复制代码
sudo insmod my_phy_driver.ko
- 检查加载状态:通过以下命令确认模块是否正确加载:
bash
复制代码
lsmod | grep my_phy_driver
- 查看日志:可以使用
dmesg
命令查看内核日志输出,确保驱动正常加载并初始化:bash
复制代码
dmesg | tail
步骤 5:测试PHY驱动
- 连接设备:将支持的以太网设备连接到系统网络接口,以便PHY驱动可以检测到链路并自动协商速率。
- 检查PHY状态:驱动中的状态函数会在检测到链路后打印信息(如10M、100M、1000M的速率以及双工模式)。
- 使用 ethtool 测试:可以通过
ethtool
命令查询接口状态,验证PHY是否正常工作:bash
复制代码
sudo ethtool <network-interface-name>
步骤 6:卸载驱动
完成测试后,可以通过以下命令卸载驱动:
bash
复制代码
sudo rmmod my_phy_driver
总结
- 编写PHY驱动并配置
Makefile
。 - 编译驱动以生成
.ko
模块文件。 - 使用
insmod
加载驱动,检查加载状态。 - 使用
ethtool
和dmesg
等工具测试驱动功能。