寻求无驱动场景下访问交换机寄存器的通用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
相关产品推荐
相关产品推荐

