当前位置: 首页 > news >正文

同时支持10m 100m 1000m的phy设备驱动

以下是一个简单的Linux PHY驱动示例,支持10Mbps、100Mbps和1000Mbps的链路速度。该驱动程序可以与常见的以太网PHY设备配合使用,并实现了不同速率的自动协商。

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/phy.h>
#include <linux/netdevice.h>
#include <linux/ethtool.h>
#include <linux/platform_device.h>static struct phy_device *phydev;
static struct net_device *netdev;// 自定义链路速度和双工模式回调函数
static int my_phy_config_init(struct phy_device *phydev)
{// 配置PHY支持的链路速度和双工模式phydev->supported &= (SUPPORTED_10baseT_Half |SUPPORTED_10baseT_Full |SUPPORTED_100baseT_Half |SUPPORTED_100baseT_Full |SUPPORTED_1000baseT_Full);phydev->advertising = phydev->supported;printk(KERN_INFO "PHY configured to support 10M/100M/1000M speeds\n");return 0;
}// 自定义自动协商配置函数
static int my_phy_config_aneg(struct phy_device *phydev)
{int ret;// 使用通用自动协商配置ret = genphy_config_aneg(phydev);if (ret) {printk(KERN_ERR "Failed to configure auto-negotiation\n");return ret;}printk(KERN_INFO "PHY auto-negotiation configured\n");return 0;
}// 链路状态更新函数
static int my_phy_read_status(struct phy_device *phydev)
{int ret = genphy_read_status(phydev);if (ret) {printk(KERN_ERR "Failed to read PHY status\n");return ret;}if (phydev->link) {printk(KERN_INFO "PHY link up - %d Mbps %s\n",phydev->speed,phydev->duplex == DUPLEX_FULL ? "Full Duplex" : "Half Duplex");} else {printk(KERN_INFO "PHY link down\n");}return 0;
}// 定义自定义的PHY驱动
static struct phy_driver my_phy_driver = {.phy_id         = 0x12345678, // 替换为实际的PHY ID.phy_id_mask    = 0xffffffff,.name           = "Custom PHY Driver",.features       = PHY_BASIC_FEATURES,.config_init    = my_phy_config_init,   // 配置支持的链路速度和双工模式.config_aneg    = my_phy_config_aneg,   // 自动协商配置.read_status    = my_phy_read_status,   // 读取链路状态.suspend        = genphy_suspend,.resume         = genphy_resume,
};// 驱动初始化
static int __init my_phy_driver_init(void)
{int ret;ret = phy_driver_register(&my_phy_driver, THIS_MODULE);if (ret) {printk(KERN_ERR "Failed to register PHY driver\n");return ret;}printk(KERN_INFO "Custom PHY driver registered\n");return 0;
}// 驱动退出
static void __exit my_phy_driver_exit(void)
{phy_driver_unregister(&my_phy_driver);printk(KERN_INFO "Custom PHY driver unregistered\n");
}module_init(my_phy_driver_init);
module_exit(my_phy_driver_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Demo PHY driver supporting 10M/100M/1000M");

代码说明

  1. 链路速度和双工模式配置 (my_phy_config_init):

    • 此函数在PHY初始化时调用,用于配置PHY支持的速率(10M、100M和1000M)和双工模式(半双工和全双工)。
    • phydev->supportedphydev->advertising控制PHY的功能。
  2. 自动协商配置 (my_phy_config_aneg):

    • 使用genphy_config_aneg()来配置自动协商,PHY设备将尝试协商最高的速率和最佳双工模式。
  3. 链路状态读取 (my_phy_read_status):

    • 该函数读取PHY的链路状态,包括当前速度和双工模式,并在链路状态变化时进行日志输出。
  4. PHY驱动结构 (my_phy_driver):

    • 定义了PHY驱动的回调函数,包括链路速度和双工模式配置、自动协商配置和链路状态读取。
    • .suspend.resume 使用通用的 genphy_suspendgenphy_resume

使用说明

在实现该PHY驱动后,可以编译并加载到Linux内核中,并与支持10M、100M和1000M速率的网络设备一起使用。


http://www.mrgr.cn/news/58757.html

相关文章:

  • 分支限界法(Branch and Bound)详细解读
  • 100%自研国产数据库才是真国产,才是我们爱国人士应该支持的产品!
  • Unity3D学习FPS游戏(3)玩家第一人称视角转动和移动
  • 水轮发电机油压自动化控制系统解决方案介绍
  • linux中级wed服务器(https搭建加密服务器)
  • 太速科技-212-RCP-601 CPCI刀片计算机
  • Java进阶篇设计模式之一 ----- 单例模式
  • 【必收藏】史上最全AI工具大盘点!一篇搞定所有需求
  • 经常聊架构模式,设计模式,编程模式,也谈谈“反模式”
  • Python游戏开发超详细第二课/一个小游戏等制作过程(入门级篇共2节)
  • 雷赛DMC5X10系列控制卡——机械原点和工作原点原理
  • 数学证明相关的矩分析。
  • 查缺补漏----CPU,主存数据传送
  • masm 6.15下载及DOSBox自动挂载
  • redo log 日志 与 undo log 日志工作原理
  • 【 IC每日一题】
  • 数据结构------手撕顺序表
  • 深入解析 Lombok 的实现原理:以 @Builder 为例的实战演示(三)
  • 计算机毕业设计Python+大模型微博情感分析 微博舆情预测 微博爬虫 微博大数据 舆情分析系统 大数据毕业设计 NLP文本分类 机器学习 深度学习 AI
  • 深度解析跨境支付之跨境支付与国内支付对比
  • 《C++求解地球可持续发展下的最大养活人数问题》
  • HCIP-HarmonyOS Application Developer 习题(十九)
  • 希尔排序的增量和缩小增量问题
  • Vue 如何批量注册自定义指令
  • 欧拉函数(模板)
  • input子系统中读取流程解析