首页 > 其他分享 >多个phy设备同时工作

多个phy设备同时工作

时间:2024-10-27 10:16:40浏览次数:5  
标签:多个 netdev driver PHY dev phy 设备

在Linux系统中支持多个PHY设备同时工作,通常需要为每个PHY设备分配不同的MAC控制器接口或网卡设备,并且配置适当的网络协议栈和交换逻辑。以下是实现多个PHY设备同时工作的关键步骤和注意事项。

### 1. 设备树配置

设备树中,定义多个PHY设备并将它们连接到不同的MAC控制器(或网卡接口)。例如,有两个PHY设备,分别用于两个不同的网络接口(如`eth0`和`eth1`)。

```dts
&mdio {
    phy0: ethernet-phy@0 {
        reg = <0>;  // PHY地址0
        reset-gpios = <&gpio1 16 GPIO_ACTIVE_LOW>;
        phy-mode = "rgmii";
    };
    
    phy1: ethernet-phy@1 {
        reg = <1>;  // PHY地址1
        reset-gpios = <&gpio1 17 GPIO_ACTIVE_LOW>;
        phy-mode = "rgmii";
    };
};

&ethernet0 {
    phy-handle = <&phy0>;
    phy-mode = "rgmii";
    status = "okay";
};

&ethernet1 {
    phy-handle = <&phy1>;
    phy-mode = "rgmii";
    status = "okay";
};
```

在上述示例中:
- `phy0`和`phy1`分别绑定到`ethernet0`和`ethernet1`接口。
- 每个PHY设备通过不同的GPIO引脚控制复位,每个接口也有自己的`phy-mode`(如`rgmii`)。

### 2. PHY驱动配置和初始化

通过驱动的初始化函数为每个PHY设备建立连接,使得每个PHY能够独立工作,数据链路层可以正确识别和处理数据。

```c
#include <linux/phy.h>
#include <linux/of_mdio.h>

static int my_driver_probe(struct platform_device *pdev)
{
    struct net_device *netdev;
    struct phy_device *phydev;
    struct device_node *np = pdev->dev.of_node;
    int i;

    // 遍历设备树,初始化每个PHY设备
    for (i = 0; i < 2; i++) {
        netdev = alloc_etherdev(sizeof(struct net_device));  // 分配网络设备
        if (!netdev) {
            dev_err(&pdev->dev, "Failed to allocate net device\n");
            return -ENOMEM;
        }

        // 获取与网络设备关联的PHY节点
        struct device_node *phy_node = of_parse_phandle(np, "phy-handle", i);
        if (!phy_node) {
            dev_err(&pdev->dev, "No phy-handle found\n");
            free_netdev(netdev);
            return -ENODEV;
        }

        // 获取PHY设备并连接
        phydev = of_phy_connect(netdev, phy_node, &adjust_link, 0, PHY_INTERFACE_MODE_RGMII);
        if (!phydev) {
            dev_err(&pdev->dev, "Failed to connect to PHY\n");
            free_netdev(netdev);
            return -ENODEV;
        }

        netdev->phydev = phydev;
        phy_start(phydev);
        
        // 将netdev注册到系统
        register_netdev(netdev);
    }

    return 0;
}

static const struct of_device_id my_driver_of_match[] = {
    { .compatible = "my,phy-multi-demo" },
    { }
};
MODULE_DEVICE_TABLE(of, my_driver_of_match);

static struct platform_driver my_driver = {
    .probe = my_driver_probe,
    .driver = {
        .name = "phy-multi-demo",
        .of_match_table = my_driver_of_match,
    },
};

module_platform_driver(my_driver);
MODULE_LICENSE("GPL");
```

### 3. 配置和验证

加载驱动后,可以使用工具(例如`ifconfig`或`ip link`)查看是否成功注册了多个网络接口。通常,Linux系统会分配接口名(如`eth0`和`eth1`)给不同的PHY设备,确保它们各自工作在独立的网络通道上。

```shell
ifconfig eth0 up
ifconfig eth1 up
```

然后,使用`ethtool`检查每个接口的链路状态、速度、双工模式等配置:

```shell
ethtool eth0
ethtool eth1
```

### 4. 同时工作的场景配置

对于多个PHY设备的场景,常见的配置包括:

- **独立网络连接**:每个PHY连接到不同的网络子网,可以分别设置不同的IP地址。
- **多接口负载均衡**:利用Linux的`bonding`模块实现接口聚合,提供负载均衡和链路冗余。
- **网络隔离和路由**:通过Linux的网络命名空间或路由表,将不同的PHY接口隔离到不同的网络空间或路由策略。

#### 示例:为每个PHY分配IP地址

```shell
ifconfig eth0 192.168.1.2 netmask 255.255.255.0 up
ifconfig eth1 192.168.2.2 netmask 255.255.255.0 up
```

### 5. 注意事项

1. **同步问题**:确保每个PHY设备的操作不会相互干扰,可以使用锁或其他同步机制。
2. **中断配置**:若PHY使用中断方式通知链路状态变化,需要确保中断处理逻辑正确区分不同的PHY设备。
3. **流量控制**:在高负载或多PHY同时工作情况下,可能需要启用流量控制,避免数据丢包。

### 6. 示例场景:双PHY设备的网络隔离

在某些应用场景下,多个PHY设备可能用于不同的网络隔离。比如,`eth0`连接到内部网络用于管理,而`eth1`连接到外部网络用于数据传输。在这种场景下,可以通过路由策略或iptables来确保不同的PHY设备隔离:

```shell
# 配置路由策略
ip route add 192.168.1.0/24 dev eth0
ip route add 192.168.2.0/24 dev eth1
```

### 总结

以上内容展示了在Linux中实现多个PHY设备同时工作的方法,通过设备树配置、驱动初始化和网卡配置,可以使多个PHY设备互不干扰地同时工作。在实际应用中,还可以结合不同的网络配置方案实现负载均衡、网络隔离等高级功能。

标签:多个,netdev,driver,PHY,dev,phy,设备
From: https://blog.csdn.net/scm06111/article/details/143254614

相关文章

  • phy驱动开发必备
     PHY驱动调试涉及到物理层接口驱动程序的开发和故障排除,通常应用于网络通信设备,如以太网、光纤通信设备等。在调试过程中,主要关注以下几个方面: 1.PHY驱动基本概念PHY(PhysicalLayer):物理层负责数据的物理传输,PHY芯片用于处理信号编码、解码、传输等底层操作。MAC(MediaA......
  • 【Orange Pi 5 Linux 5.x 内核编程】-字符设备文件操作实现
    字符设备文件与操作(具体实现)文章目录字符设备文件与操作(具体实现)1、内核空间程序(设备驱动)1.1kmalloc()1.2kfree()1.3copy_from_user()1.4copy_to_user()1.5open操作实现1.6write操作实现1.7read操作实现1.8close操作2、用户空间应用程序......
  • 【Orange Pi 5 Linux 5.x 内核编程】-字符设备文件与操作(IOCTL)
    字符设备文件与操作(IOCTL)文章目录字符设备文件与操作(IOCTL)1、IOCTL介绍2、IOCTL使用步骤2.1在驱动程序中创建IOCTL命令2.2在驱动中编写IOCTL函数2.3在用户空间创建IOCTL命令3、内核空间IOCTL驱动实现4、用户空间应用程序5、验证在上一篇文章中,......
  • C++/CLI 类内多线程编程 多个参数
    usingnamespaceSystem;usingnamespaceSystem::Threading;namespaceNNNN{ publicrefclassTTTT { staticThread^t1; staticThread^t2; voidfun() { t1=gcnewThread(gcnewParameterizedThreadStart(DoWork1)); t2=gcnewThread(gcnewP......
  • 告别低效!多微管理神器让你轻松拿捏多个账号!
    有多个微信号都知道,切换账号的繁琐和信息的分散,往往让我们感到无比低效。今天,就和大家分享一个多微管理神器,让你可以轻松管理多个账号。1、网页扫码登录,保障安全无忧你只需在电脑上访问系统的网址,登录你的账号,然后用微信扫一扫即可完成登录。这种方式不仅快速,而且极大地保证......
  • GESP一级真题分析-202303-选择题1-输入输出设备、存储单位、默认数据类型、标识符命名
    GESP一级真题分析-202303-选择题1-输入输出设备、存储单位、默认数据类型、标识符命名PDF文档公众号回复关键字:202410261相关知识点1)输入输出设备输入设备是外界向计算机传送信息的装置。在微型计算机系统中,最常用的输入设备是键盘和鼠标。此外还有电子光笔、数字化......
  • 三周精通FastAPI:8 请求体 - 多个参数、字段、嵌套模型
    本节内容对应FastAPI手册的三节,分别是请求体-多个参数,请求体-字段和请求体-嵌套模型。手册: https://fastapi.tiangolo.com/zh/tutorial/body-multiple-params/源代码示例是python3.10及以上版本。请求体-多个参数¶既然我们已经知道了如何使用 Path 和 Query,下面让......
  • 如何把一个python列表(有很多个元素)变成一个excel表格的第一列?
    大家好,我是Python进阶者。一、前言前几天在Python最强王者群有个叫【麦当】的粉丝问了一个关于Python如何把一个python列表(有很多个元素)变成一个excel表格的第一列的问题,这里拿出来给大家分享下,一起学习。二、解决过程这里给出【dcpeng】和【德善堂小儿推拿-瑜亮老师】大佬......
  • 关于手动关闭多个el-popover的方法且不使用visible属性
    1.在el-popover使用ref<el-popoverref="motifyPopover":width="260"trigger="click"popper-class="modify-popover"/>2.声明motifyPopoverconstmotifyPopover=ref<InstanceType<typeofElPopover>>()......
  • 国产!瑞芯微米尔RK357核心板革新AIoT设备,8核6T高算力
    随着科技的快速发展,AIoT智能终端对嵌入式模块的末端计算能力、数据处理能力等要求日益提高。近日,米尔电子发布了一款基于瑞芯微RK3576核心板和开发板。核心板提供4GB/8GBLPDDR4X、32GB/64GBeMMC等多个型号供选择。瑞芯微RK3576核心优势主要包括高性能数据处理能力、领先的AI智能......