https://blog.brixit.nl/making-a-linux-managed-network-switch/
有时,定制的 5 端口千兆交流机便是办理方案。
网络交流机是大略的设备,数据包进入,数据包输出。幸运的是,人们已经找到了如何使其变得繁芜的方法,并发明了管理型交流机。 常日,这是通过添加一个用于配置设置的 Web 界面并查看端口状态等信息来实现的。如果您有更昂贵的交流机,那么您乃至可以访问一些备用接口,如 Telnet 和串行掌握年夜驾口。 然而,还有一整类管理型交流机,人们最初并没有想到。这些是消费级路由器内部的网络交流机。这些路由器是小型 Linux 设备,内部有一个交流机芯片,一个或多个端口内部连接到 CPU,别的端口在外部作为物理端口。
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-lts.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-lts.dtsindex 596a25907..10c1a5187 100644--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-lts.dts+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-lts.dts@@ -18,8 +18,78 @@ led { gpios = <r_pio 0 7 GPIO_ACTIVE_LOW>; / PL7 / }; };++switch {+compatible = "realtek,rtl8365rb";+mdc-gpios = <pio 2 5 GPIO_ACTIVE_HIGH>; // PC5+mdio-gpios = <pio 2 7 GPIO_ACTIVE_HIGH>; // PC7+reset-gpios = <pio 8 5 GPIO_ACTIVE_LOW>; // PH5+realtek,disable-leds;++mdio {+compatible = "realtek,smi-mdio";+#address-cells = <1>;+#size-cells = <0>;++ethphy0: ethernet-phy@0 {+reg = <0>;+};++ethphy1: ethernet-phy@1 {+reg = <1>;+};++ethphy2: ethernet-phy@2 {+reg = <2>;+};++ethphy3: ethernet-phy@3 {+reg = <3>;+};++ethphy4: ethernet-phy@4 {+reg = <4>;+};+};++ports {+#address-cells = <1>;+#size-cells = <0>;++port@0 {+reg = <0>;+label = "cpu";+ethernet = <emac>;+};++port@1 {+reg = <1>;+label = "lan1";+phy-handle = <ethphy1>;+};++port@2 {+reg = <2>;+label = "lan2";+phy-handle = <ethphy2>;+};++port@3 {+reg = <3>;+label = "lan3";+phy-handle = <ethphy3>;+};++port@4 {+reg = <4>;+label = "lan4";+phy-handle = <ethphy4>;+};+};+}; };
它加载了带有 realtek, rtl8365rb 的交流机驱动程序,该驱动程序支持包括我在本设计中利用的 RTL8367S 在内的全体瑞昱交流机芯片系列。我从文档示例中删除了 CPU 端口,只添加了 5 个常规交流机端口的定义。 主要的部分是在 port@0 中,这是我的交流机上向后的端口,连接到 A64-lts,我将其链接到 emac,这是对打算机以太网端口的引用。别的的端口则链接到交流机芯片中的相应 PHY。 在代码的顶部还定义了 3 个 GPIO,它们链接到交流机 PCB 上的 SDA/SCL 和 Reset,以使通信事情。系统启动后的结果是这样的:
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:002: eth0: <BROADCAST,MULTICAST> mtu 1508 qdisc noop state DOWN qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff3 lan1@eth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff4 lan2@eth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff5 lan3@eth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff6 lan4@eth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff
$ ip link set eth0 up$ ip link set lan1 up$ ip link set lan2 up$ ip link set lan3 up$ ip link set lan4 up$ ip link1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:002: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1508 qdisc mq state UP qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff3: lan1@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff4: lan2@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff5: lan3@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff6: lan4@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN qlen 1000 link/ether 02:ba:6f:0c:21:c4 brd ff:ff:ff:ff:ff:ff