您好,
我正在开发一个基于 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 驱动程序无法做到这一点?
祝好
@kalamata @Sabeur你能解决这个问题吗?我在使用 Toradex imx8mp SoM 时也遇到了类似的情况。
@kalamata @Sabeur你找到解决这个问题的办法了吗?我也遇到了类似的问题,但使用的是 Toradex Verdin IMx8mp SoM。
你好、
我看到 端口 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
你好,卡拉马塔 、
感谢您提供的详细信息。
所以我的假设是正确的。
您应该能够为连接的 MAC 接口指定 phy-handle 和 phy 模式。它是经过虚拟测试的,这意味着 MAC-> PHY->---<-PHY <-5.3 内核版本的 MAC。(参见 0e27921816ad99f78140e0e0c61ddf2bc515cc7e22)。
因此 ,这是在设备树中描述这种硬件连接的正确方法。
Regards,
Sabeur
你好,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 控制器永久连接。
Kalamata
您好,
理论上是可行的,但由于预期的设置是直接链接,因此我无法立即投入使用。
可以工作的数据路径是Mac - Phy - Phy - Switch Mac。
在这种情况下,您需要修改 DSA 内核,并为 CPU Mac 和 Switch Mac 指定 Phy 句柄和 Phy 模式。
现在的问题是:上述数据路径在您的设置中可行吗?Rockchip RK3399 CPU 有内置 PHY 吗?
致以最崇高的敬意,
Sabeur