You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求无驱动场景下访问交换机寄存器的通用MDIO设备树节点示例

通用独立MDIO设备树节点的内核源码示例指引

1. MDIO控制器节点基础定义

首先要在设备树中定义SoC的MDIO控制器节点,作为MDIO总线的基础载体,示例如下:

mdio: mdio@12340000 {
    compatible = "generic-mdio";
    reg = <0x12340000 0x100>; // 控制器寄存器基地址与长度
    #address-cells = <1>;
    #size-cells = <0>;
    clocks = <&clk_core 5>; // 按需绑定对应时钟
    status = "okay";
};

compatible字段需匹配SoC对应的MDIO控制器驱动,通用场景可直接使用generic-mdio,部分厂商SoC需用其自定义的兼容字符串。

2. 独立以太网交换机的MDIO节点定义

在MDIO控制器节点下,添加你的以太网交换机节点,无需关联PHY驱动,直接通过MDIO总线访问寄存器,示例:

&mdio {
    eth_switch@10 {
        compatible = "generic-mdio-device";
        reg = <0x10>; // 设备在MDIO总线上的物理地址
        status = "okay";
    };
};

这里的generic-mdio-device是内核提供的通用MDIO设备兼容标识,对应drivers/net/phy/mdio_bus.c中的通用处理逻辑,支持内核模块或用户空间通过MDIO总线API访问设备寄存器。

3. 内核源码中的参考实现

  • 核心通用逻辑:查看drivers/net/phy/mdio_bus.c中的generic_mdio_probe函数,以及设备树匹配逻辑,这是通用MDIO设备的核心处理代码。
  • 厂商驱动示例:部分SoC的MDIO控制器驱动(如drivers/net/phy/mvebu-mdio.c)包含独立MDIO设备的使用案例,可参考其驱动代码与配套的设备树绑定文档。

4. 寄存器访问示例代码

内核中可通过mdio_read()和mdio_write()直接操作目标设备寄存器,代码片段如下:

struct mii_bus *mdio_bus = mdiobus_get("mdio@12340000"); // 对应设备树中MDIO控制器节点名
u16 reg_val = mdio_read(mdio_bus, 0x10, 0x00); // 读取地址0x10的设备、寄存器0x00的值
mdio_write(mdio_bus, 0x10, 0x01, 0x4321); // 向地址0x10的设备、寄存器0x01写入0x4321

内容的提问来源于stack exchange,提问作者rkk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:23:20