1635488_zh-CN

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

1635488_zh-CN

1635488_zh-CN

Linux 中的 SJA1105,通过 PHY 接口连接所有 5 个端口?

您好,

我正在开发一个基于 SMARC 格式计算机模块的项目,该模块配备了 Rockchip RK3399 CPU。在同一块主板上,我们有一个 SJA1105 开关。CPU 运行 Linux (5.4),使用 NET_DSA_SJA1105 驱动程序。

我们的 CPU 需要通过以太网与其他设备通信,因此 CPU 需要连接到交换机。

在 SJA1105 数据表和 Linux 内核设备树示例中,主机 CPU 始终作为固定链路直接通过 XMiI 连接到交换机。(https://www.kernel.org/doc/Documentation/devicetree/bindings/net/dsa/sja1105.txt)

我们无法做到这一点,因为我们的 SMARC 模块只能提供来自 RK3399 以太网集成 PHY 的引脚输出,我们无法直接物理访问 CPU 上的 xMII 接口,无论我们多么希望这样做。

在 SJA1105 数据表中也有如下说明:

" 请注意,只有当系统必须支持 AVB 操作或其他网桥管理协议(如 STP/RSTP)时,才需要与主机处理器建立以太网连接。如果不需要此类操作,所有端口都可用于数据流量。"

由于我们不需要 AVB 或 STP/RSTP,而且我们也无法访问 CPU xMII 接口,因此我们决定将交换机用作一个普通的 5 端口交换机,每个端口都有 PHY 接口。4 个端口,PHY 实际连接到真正的 RJ45 连接器,另一个端口将 PHY 硬接入电路板中,连接到我们从 SMARC 板上的 CPU 获得的 PHY。这将为我们提供一个看起来像这样的 Linux 设备树:

(仅显示与 SJA1105 相关的部分,粘贴到此处时缩进也变拧了)

&spi2 {
status ="okay";
#address-cells =<1>;
#size-cells =<0> ;

num-cs =<2>;
cs-gpios =<& gpio2 RK_PB4 GPIO_ACTIVE_LOW>,<& gpio1 RK_PA3 GPIO_ACTIVE_LOW> ;

sja1105_1: sja1105@1 {
status ="okay";
reg =<1>;
#address-cells =<1>;
#size-cells =<0>;
clocks =<& ethswitch_osc>;
compatible ="nxp,sja1105t";
spi-max-frequency =<25000000> ;

fsl,spi-cs-sck-delay =<1000> ;
fsl,spi-sck-cs-delay =<1000>

;spi-cpha;pinctrl-names = " 默认
";pinctrl-0 = < & et hswitch_pins
>;reset-gpios = < & gpio4 RK_PC5 GPIO_ACTIVE_HIGH >;

端口 {
#address-cells<1> =;
#size-cells =;-cells =<0> 0;

port@0 {
/* 隐含"sja1105,role-mac;" */
label ="eth0";
phy-handle =<& rmii_phy0>;
phy-mode ="rmii";
reg =<0>;
};

port@1 {
/* 隐含"sja1105,role-mac;" */
label ="lan1";
phy-handle =<& rmii_phy1>;
phy-mode ="rmii";
reg =<1>;
};

port@2 {
/* 隐含"sja1105,role-mac;" */
label ="lan2";
phy-handle =<& rmii_phy2>;
phy-mode ="rmii";
reg =<2>;
};
port@3 {
/* 隐含"sja1105,role-mac;" */
phy-handle =<& rmii_phy3> ;
label ="lan3";
phy-mode ="rmii";
reg =<3>;
};
port@4 {
/* Imlicit"sja1105,role-mac;" */
phy-handle =<& rmii_phy4>;
label ="lan4";
phy-mode ="rmii";
reg =<4>;
};

};
};
};


这个 devicetree 是有效的,可以编译,但在探测过程中 NET_DSA_SJA1105 却失败了,因为它找不到 HOST CPU 端口(因为我们没有指定)。该错误来自 net/dsa/dsa2.c*dsa_tree_find_first_cpu(struct dsa_switch_tree *dst),因此它并不是驱动程序的 sja1105 部分所特有的,而是 Linux 分布式交换架构中更深层次的部分。

在所有 devicetree 示例中,总有一个端口配置为主机 CPU,通过 xMII 与固定链路连接,例如像这样:

port@4 {
/* 连接到 eth2 的内部端口 */
ethernet =<& enet2>;
phy-mode ="rgmii";
reg =<4>;
/* 隐含"sja1105,role-phy;" */
fixed-link {
speed =<1000>;
full-duplex;
};
};


如果我尝试修改我的设备树以使端口看起来更像这样:

端口 {
#address-cells =<1>;
#size-cells =<0>;
port@0 {
/* 隐含"sja1105,role-phy;" */
ethernet =<& gmac>;
phy-mode ="rmii";
reg =<0>;
fixed-link {
speed =<100>;
full-duplex;
};
};

port@1 {
/* 隐含"sja1105,role-mac;" */
label ="lan1";
phy-handle =<& rmii_phy1>;
phy-mode ="rmii";
reg =<1>;
};

port@2 {
/* 隐含"sja1105,role-mac;" */
label ="lan2";
phy-handle =<& rmii_phy2>;
phy-mode ="rmii";
reg =<2>;
};
port@3 {
/* 隐含"sja1105,role-mac;" */
phy-handle =<& rmii_phy3> ;
label ="lan3";
phy-mode ="rmii";
reg =<3>;
};
port@4 {
/* Imlicit"sja1105,role-mac;" */
phy-handle =<& rmii_phy4>;
label ="lan4";
phy-mode ="rmii";
reg =<4>;
};

};

然后,驱动程序感到满意,成功地进行了探测并设置了 SJA1105 交换机。端口 1-4 可以工作
,但端口 0(CPU 通过 PHY 连接)当然不能工作,因为它现在被配置为 xMII 直接连接,而实际上我们在 SJA1105 和主机 CPU 之间有一个 PHY。

这是否是 DSA SJA1105 Linux 驱动程序的限制,即必须始终通过 xMII 配置固定链路?我能否以某种方式直接从设备树中配置我根本不希望有专用的 cpu 主机端口,而是只有 5 个普通端口(其中一个恰好是通过 PHY 连接到 CPU...)或者我能否将 CPU 主机端口配置为固定链路,但明确指定那里实际上也有 PHY,而不是 XMiI 接口?我已经尝试了几十种组合,但仍然没有找到任何配置方法,使其能够与我们本应非常简单的设置配合使用。我是不是漏掉了什么非常简单的东西?有什么好办法吗?还是 Linux DSA SJA1105 驱动程序无法做到这一点?


祝好

Re: SJA1105 in Linux, all 5 ports through PHY interfaces?

@kalamata @Sabeur你能解决这个问题吗?我在使用 Toradex imx8mp SoM 时也遇到了类似的情况。

Re: SJA1105 in Linux, all 5 ports through PHY interfaces?

@kalamata @Sabeur你找到解决这个问题的办法了吗?我也遇到了类似的问题,但使用的是 Toradex Verdin IMx8mp SoM。

Re: SJA1105 in Linux, all 5 ports through PHY interfaces?

你好、


我看到 端口 0 的 phy-mode 和 phy-handle:

port@0 {
/* 隐含"sja1105,role-mac;" */

ethernet =<& gmac>;
label ="eth0";
phy-handle =<& rmii_phy0>;
phy-mode ="rmii";
reg =<0>;
};

设备树应该是这样的。


此外,gmac 节点应包含

&gmac {
phy-handle =<& rmii_gmac_phy>;
phy-mode ="rmii";
};


顺祝商祺!

Sabeur

Re: SJA1105 in Linux, all 5 ports through PHY interfaces?

你好,卡拉马塔


感谢您提供的详细信息。

所以我的假设是正确的。

您应该能够为连接的 MAC 接口指定 phy-handle 和 phy 模式。它是经过虚拟测试的,这意味着 MAC-> PHY->---<-PHY <-5.3 内核版本的 MAC。(参见 0e27921816ad99f78140e0e0c61ddf2bc515cc7e22)。
因此 ,这是在设备树中描述这种硬件连接的正确方法。


Regards,
Sabeur

Re: SJA1105 in Linux, all 5 ports through PHY interfaces?

你好,Sabeur,

感谢您的答复!

在您的设置中,上述数据路径可行吗?
是的,我们使用的正是这种设置:(CPU)Mac - Phy - Phy - Switch Mac
(见附件)

Rockchip RK3399 CPU 是否具有内部 PHY?
是的,它有一个内部 PHY,我们只能使用这个内部 PHY,因为它是从 CPU 所在的研华 ROM-5780 SMARC 模块中唯一输出的,所以即使我们想直接使用 CPU MAC 接口也不行。

我们的设置与 SJA1105 数据表建议的典型设置有何不同,请参阅附图。


我们有一款采用 SMARC 格式封装的研华 ROM-5780 片上计算机模块(即瑞芯微 RK3399 CPU)。Rockchip RK3399 集成了 PHY 接口,我们可以通过 SMARC 模块上的输出引脚访问该接口。我们无法实际访问 RK3399 以太网控制器的 MAC 引脚,因为它们不是通过 SMARC 模块输出的,所以我们只能使用 RK3399 PHY 接口。因此,在我们打算连接 CPU 的 SJA1105 的第 5 个端口上,我们有一个 PHY 控制器(就像在第 1-4 个端口上一样),该 PHY 控制器与 RK3399 CPU 的 PHY 控制器永久连接。

sja1105_1.pngsja1105_2.png



Kalamata

Re: SJA1105 in Linux, all 5 ports through PHY interfaces?

您好,

理论上是可行的,但由于预期的设置是直接链接,因此我无法立即投入使用。

可以工作的数据路径是Mac - Phy - Phy - Switch Mac。

在这种情况下,您需要修改 DSA 内核,并为 CPU Mac 和 Switch Mac 指定 Phy 句柄和 Phy 模式。

现在的问题是:上述数据路径在您的设置中可行吗?Rockchip RK3399 CPU 有内置 PHY 吗?


致以最崇高的敬意,
Sabeur

Re: SJA1105 in Linux, all 5 ports through PHY interfaces?可以实现 PHY 对 PHY 的背靠背连接。您必须使用 phy-handle 属性。您还可以绕过自动协商,在 devicetree 绑定中使用"fixed-link" 属性设置固定速度。如果出现问题,并怀疑 devicetree 配置正确,请检查控制路径接口(SPI/I2C/MDIO)。
标记 (1)
无评分
版本历史
最后更新:
‎01-21-2026 02:29 AM
更新人: