NXP MCU 技术论坛
直播中

从未拥有

10年用户 1020经验值
擅长:可编程逻辑 电源/新能源 光电显示
私信 关注
[问答]

Linux中的SJA1105所有5个端口都通过PHY接口吗?

我正在开发一个基于 SMARC 格式计算机模块和 Rockchip RK3399 CPU 的项目。在同一块主板上,我们有一个 SJA1105 开关。CPU 运行 Linux (5.4) 并使用 NET_DSA_SJA1105 驱动程序。
我们的 CPU 需要通过以太网与其他设备通信,因此 CPU 需要连接到交换机。
在 SJA1105 数据表和 Linux 内核设备树示例中,主机 cpu 始终作为直接通过 xMII 的固定链路连接到交换机
我们不能这样做,因为我们的 SMARC 模块只为我们提供 RK3399 以太网集成 PHY 的引脚输出,无论我们多么想要,我们都无法直接物理访问 CPU 上的 xMII 接口。
同样在 SJA1105 数据表中,它表​​示如下:
“请注意,仅当系统必须支持 AVB 操作或其他桥接管理协议(如 STP/RSTP)时,才需要与主机处理器的以太网连接。如果不需要此类操作,则所有端口都可用于数据流量。”
由于我们不需要 AVB 或 STP/RSTP,并且无论如何我们都无法访问 cpu xMII 接口,因此我们决定将该交换机用作普通的 5 端口交换机,每个端口上都有 PHY 接口。4 个端口,PHY 实际上连接到真正的 RJ45 连接器,1 个端口,PHY 在电路板上硬连线到我们从 SMARC 板上的 CPU 获得的 PHY。这会给我们一个看起来像这样的 Linux 设备树:
(只显示SJA1105相关部分,贴到这里压痕也变歪了)
&spi2 {
状态=“好的”;
#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";
注册 = <1>;
#address-cells = <1>;
#size-cells = <0>;
时钟 = <ðswitch_osc>;
兼容=“恩智浦,sja1105t”;
spi-max-频率 = <25000000>;
fsl,spi-cs-sck-delay = <1000>;
fsl,spi-sck-cs-delay = <1000>;
spi-cpha;
pinctrl-名称=“默认”;
pinctrl-0 = <ðswitch_pins>;
重置-gpios = <&gpio4 RK_PC5 GPIO_ACTIVE_HIGH>;

端口{
#address-cells = <1>;
#size-cells = <0>;
port@0 {
/* 隐式“sja1105,role-mac;” */
标签 = "eth0";
phy-handle = <&rmii_phy0>;
phy-mode = "rmii";
注册 = <0>;
};
port@1 {
/* 隐式“sja1105,role-mac;” */
标签 = "lan1";
phy-handle = <&rmii_phy1>;
phy-mode = "rmii";
注册 = <1>;
};
port@2 {
/* 隐式“sja1105,role-mac;” */
标签 = "lan2";
phy-handle = <&rmii_phy2>;
phy-mode = "rmii";
注册 = <2>;
};
port@3 {
/* 隐式“sja1105,role-mac;” */
phy-handle = <&rmii_phy3>;
标签=“局域网3”;
phy-mode = "rmii";
注册 = <3>;
};
port@4 {
/* 隐式“sja1105,role-mac;” */
phy-handle = <&rmii_phy4>;
标签 = "lan4";
phy-mode = "rmii";
注册 = <4>;
};
};
};
};

这个设备树是有效的并且可以编译,但是在探测期间 NET_DSA_SJA1105 失败,因为它找不到主机 CPU 端口(因为我们没有指定一个)。这个错误来自 net/dsa/dsa2.c *dsa_tree_find_first_cpu(struct dsa_switch_tree *dst) 所以它不是特定于驱动程序的 sja1105 部分,而是更深层次的 Linux 分布式交换机架构。
在所有 devicetree 示例中,始终有一个端口配置为通过 xMII 与固定链路连接的主机 cpu,例如:
port@4 {
/* 连接到 eth2 的内部端口 */
ethernet = <&enet2>;
phy-mode = "rgmii";
注册 = <4>;
/* 隐式“sja1105,role-phy;” */
固定链接 {
速度 = <1000>;
全双工;
};
};

如果我尝试修改我的设备树以使端口看起来更像这样:
端口{
#address-cells = <1>;
#size-cells = <0>;
port@0 {
/* 隐式“sja1105,role-phy;” */
以太网 = <&gmac>;
phy-mode = "rmii";
注册 = <0>;
固定链接 {
速度 = <100>;
全双工;
};
};
port@1 {
/* 隐式“sja1105,role-mac;” */
标签 = "lan1";
phy-handle = <&rmii_phy1>;
phy-mode = "rmii";
注册 = <1>;
};
port@2 {
/* 隐式“sja1105,role-mac;” */
标签 = "lan2";
phy-handle = <&rmii_phy2>;
phy-mode = "rmii";
注册 = <2>;
};
port@3 {
/* 隐式“sja1105,role-mac;” */
phy-handle = <&rmii_phy3>;
标签=“局域网3”;
phy-mode = "rmii";
注册 = <3>;
};
port@4 {
/* 隐式“sja1105,role-mac;” */
phy-handle = <&rmii_phy4>;
标签 = "lan4";
phy-mode = "rmii";
注册 = <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 驱动程序来说是不可能的吗?

更多回帖

发帖
×
20
完善资料,
赚取积分