logicog/RTLPlayground
GitHub: logicog/RTLPlayground
为 RTL8372/RTL8373 芯片的 2.5G 交换机提供替代固件,让非网管设备获得 VLAN、IGMP、端口聚合等管理功能。
Stars: 206 | Forks: 61
# RTLPlayground
这是一个为基于 RTL8372/RTL8373 的 2.5G 交换机的高级用户提供固件开发的 Playground。
对于这些设备的每种硬件配置,通常会出售非网管版和网管版,它们的硬件基本相同。其目的是为非网管设备也提供管理功能,以及附加功能,例如管理 VLAN、DHCP 服务器、多语言支持、IPv6 和 TLS 加密的网页。然而,目前仅提供以下功能:
- 现代化的 Web 界面,支持鼠标悬停以显示更多信息
- 用于配置所有功能的串行控制台界面
- 用于配置 Multicast 流的 IGMP
- 端口配置显示关于自身和 Link-partner 通告的速度设置的详细信息
以及本地端这些设置的配置
- 针对每端口的帧大小 (MTU) 配置,支持 Jumbo-Frame 或限制特定设备的 MTU
- EEE (Energy Efficient Ethernet) 可以按端口进行配置。提供有关 link partner 提供的支持以及端口的 EEE 状态的详细信息。
- VLAN 配置
- 显示插入模块的 SFP 信息,当前传感器值(例如温度、RX 和 TX 功率)会显示在 CLI 中,并在 Web 界面上通过鼠标悬停显示
- 镜像配置
- 可以设置 Link Aggregation Groups
- 详细的端口数据包统计信息
- 通过 Web 界面将配置保存到 flash
- 通过 Web 进行固件更新
- 从原始 Web 界面作为固件升级进行安装
虽然该固件比原始网管固件提供了相当大的改进,但该固件仍然缺乏对 STP 和专有环路预防协议以及 DHCP 的支持。如果您需要这些功能,请勿在您的网管设备上安装此 Playground。无论如何,强烈建议不要安装,除非您至少能够通过 SOIC 夹具(例如也用于 BIOS 备份的夹具)备份原始 flash 内容,并且在出现问题时能够重新安装该固件。这不需要任何焊接技能。
该固件支持具有以下硬件功能的设备:
- 4 个 2.5G 端口 + 2 个 SFP+ 端口
- 5 个 2.5G 端口 + 1 个 SFP+ 端口
- 8 个 2.5G 端口 + 1 个 SFP+ 端口
出售的设备通常具有相当普遍的设计,但是 LED 配置可能存在差异(交换机具有不同颜色和不同类型 LED 的 LED)。已测试设备的列表可以在[受支持的设备](doc/supported_devices.md)中找到。
要进行有意义的开发,您将需要使用串行控制台,因此需要具备焊接技能。刷写必须通过 SOIC-8 PatchClamp 或通过焊接 flash 芯片的插座来完成。
如果您不想打开您的设备,您可以使用项目的代码,例如通过 Ghidra 查看镜像来了解这些设备。如果您想为 Web 界面的设计做出贡献,或者想先了解一下该界面,这里提供了一个独立的设备模拟器,它完全作为本地 Web 服务器在 Linux 下运行。
## (0) 编译要求
安装以下特定的构建先决条件 (Debian 12/13),请注意 Ubuntu 24.04 仍然使用的是较旧版本的 sdcc,但您需要 sdcc 版本 4.5 才能编译代码:
```
sudo apt install make gcc sdcc xxd python-is-python3 libjson-c-dev
```
## (1) 编译用于直接刷写芯片并升级已运行 RTLPlayground 的设备
使用 vi 或 nano 等编辑器编辑 machine.h。选择固件应为其构建的正确机器型号。
现在,构建固件镜像应该可以正常工作了:
```
make
```
请注意,生成的镜像以 .bin 结尾,而不是 .img,这是为了兼容 IMSProg。
镜像位置存储在 `RTLPlayground/output/rtlplayground_version_machine.bin` 中
例如
```
rtlplayground-v0.1.0-12c98ba-dirty-LIANGUO_ZX_SWTGW215AS.bin
```
## (2) 编译用于带管理选项的 OEM 运行设备 (Web 升级)
可以使用特定的升级镜像从现有的原始固件升级网管交换机。
您首先需要构建用于直接刷写芯片的固件:请参见下文 (1)
然后
```
cd installer
make
```
镜像位置存储在 `RTLPlayground/installer/output/rtlplayground_oem_upgrade.bin` 中
编译控制台输出示例
```
RTLPlayground/installer$ make
mkdir -p output
gcc updatebuilder.c -o output/updatebuilder
sdas8051 -plosgff -o output/crtstart.rel crtstart.asm
sdcc -mmcs51 --code-loc 0x1000 -o output/installer.rel -c installer.c
sdcc -mmcs51 -Wl-bHOME=0x1100 -Wl-r -o output/rtlinstaller.ihx output/crtstart.rel output/installer.rel
./output/updatebuilder -i output/rtlinstaller.ihx -o output/rtlplayground_oem_upgrade.bin ../output/rtlplayground.bin
Input file size: 524288
Bytes read: 524288
EOF
Payload sum 1 is: 0x25100
Payload sum 2 is: 0x25100
Payload sum with header is: 0x264ec
Payload sum is: 0xf8fe94
Header checksum is: 0x5a1
```
## (3) 使用 Ghidra 进行沙盒测试(可选)
您可以使用 ghidra 测试镜像,或者刷写真实的 Switch 硬件。有关 ghidra 的更多信息,请参见关于 [Ghidra 镜像](ghidra.md)的信息。
## (4) 通过 Web 界面安装(软件方式)
网管交换机(OEM 固件或 RTLplaygroud 固件)可以通过 Web 界面进行升级。
非网管交换机无法通过这种方式刷写(见 5)。
转到“Firmware update”选项卡,选择正确的文件。
最后,点击“Upload File”按钮即可完成!
## (5) 直接刷写 ROM(硬件方式,也是唯一的救援方式)
如果 ROM 芯片足够大,此程序是刷写非网管交换机的唯一方法。
如果出现问题,这也是使您的设备变砖后恢复的唯一方法。
- 断开交换机的电源。
- 打开交换机。
- 将夹子连接到 flash 芯片上(红线对应 Pin 1,Pin 1 有一个圆点标记)。
- 连接 USB 刷写编程器,交换机上的电源指示灯会亮起,如果不亮请检查线缆。
- 不要惊慌,接反 GND 和 3.3V 通常不会烧毁交换机。
- 使用 IMSProg、Flashrom 或任何其他 Programmer 来检测芯片。
- 备份(DUMP)现有固件!
- 擦除(BLANK)ROM!
- 将固件加载到 IMSProg 中。
- 将其刷写到 ROM 芯片中。
- 断开 ROM 芯片上的夹子。
- 大功告成,准备首次启动。
## (6) 连接串行界面(可选)
您可以将串行线缆连接到所有设备上都有的 UART 端口,设置 8N1 @ 115200 baud。
## (7) 通电
当您给交换机通电时,设备将执行一些示例并提供一个最小化的控制台(如果已连接到串行接口),其文档可以在源代码 `rtlplayground.c` 中找到。
## (8) Web 界面
除非您在编译前在 config.txt 中指定了 IP 地址,否则可以通过 [默认的 192.168.10.247](http://192.168.10.247) 访问 Web 界面。
## (9) 命令行
命令行非常基础,主要用于测试目的。
以下是带有一些示例的启动日志:
```
Detecting CPU
RTL8373 detected
Starting up...
Flash controller
NIC reset
rtl8372_init called
RTL837X_REG_SDS_MODES: 0x00000bed
phy_config_8224 called
phy_config_8224 done
rtl8224_phy_enable called
rtl8224_phy_enable done
rtl8372_init done
A minimal prompt to explore the RTL8372:
CPU detected: RTL8373
Clock register: 0x00001101
Register 0x7b20/RTL837X_REG_SDS_MODES: 0x00000bed
Verifying PHY settings:
Port State Link TxGood TxBad RxGood RxBad
1 On Down 0x00000000 0x00000000 0x00000000 0x00000000
2 On Down 0x00000000 0x00000000 0x00000000 0x00000000
3 On Down 0x00000000 0x00000000 0x00000000 0x00000000
4 On Down 0x00000000 0x00000000 0x00000000 0x00000000
5 On 2.5G 0x00000008 0x00000000 0x00000000 0x00000000
6 On Down 0x00000000 0x00000000 0x00000000 0x00000000
7 On Down 0x00000000 0x00000000 0x00000000 0x00000000
8 On Down 0x00000000 0x00000000 0x00000000 0x00000000
9 NO SFP Down 0x00000000 0x00000000 0x00000000 0x00000000
> port 5 1g
CMD: port 5 1g
PORT 04 1G
> stat
CMD: stat
Port State Link TxGood TxBad RxGood RxBad
1 On Down 0x00000000 0x00000000 0x00000000 0x00000000
2 On Down 0x00000000 0x00000000 0x00000000 0x00000000
3 On Down 0x00000000 0x00000000 0x00000000 0x00000000
4 On Down 0x00000000 0x00000000 0x00000000 0x00000000
5 On 1000M 0x00000035 0x00000000 0x00000017 0x00000000
6 On Down 0x00000000 0x00000000 0x00000000 0x00000000
7 On Down 0x00000000 0x00000000 0x00000000 0x00000000
8 On Down 0x00000000 0x00000000 0x00000000 0x00000000
9 NO SFP Down 0x00000000 0x00000000 0x00000000 0x00000000
>
Rate: 67 Encoding: 01
Lightron Inc. WSPXG-ES3LC-IHA 0000
> stat
CMD: stat
Port State Link TxGood TxBad RxGood RxBad
1 On Down 0x00000000 0x00000000 0x00000000 0x00000000
2 On Down 0x00000000 0x00000000 0x00000000 0x00000000
3 On Down 0x00000000 0x00000000 0x00000000 0x00000000
4 On Down 0x00000000 0x00000000 0x00000000 0x00000000
5 On 1000M 0x00000065 0x00000000 0x0000003b 0x00000000
6 On Down 0x00000000 0x00000000 0x00000000 0x00000000
7 On Down 0x00000000 0x00000000 0x00000000 0x00000000
8 On Down 0x00000000 0x00000000 0x00000000 0x00000000
9 SFP OK 10G 0x00000000 0x00000000 0x0000001c 0x00000000
> sfp
CMD: sfp
Rate: 67 Encoding: 01
Lightron Inc. WSPXG-ES3LC-IHA 0000
```
## (10) 高级配置
您无需使用控制台模式即可对交换机进行更深度的配置。
在编译部分,您可以直接在制作二进制固件之前写入 config.txt 文件
```
nano config.txt
```
如果您想在刷写完成后修改设置,请转到“System Settings”中的“Advanced Settings”选项卡
```
ip xxx.xxx.xxx.xxx = IP adress of the switch
gw yyy.yyy.yyy.yyy = IP adress of the gateway
netmask zzz.zzz.zzz.zzz = Network mask of the switch
port x name xxx = Name xxx the port number x
port z 1g = Set 1g speed for port z
igmp on/off = Turn IGMP on or off
```
[待续]
享受玩耍的乐趣!
## (11) 其他文档
以下文档提供了有关 RTL837x SoC 特定功能的更多说明:
- [RTL8372/3 功能支持](doc/hardware.md)
- [CPU 端口](doc/CpuPort.md)
- [L2 学习](doc/l2.md)
- [IGMP (IP-MC 流)](doc/igmp.md)
- [SFP+ 端口](doc/sfp.md)
- [Trunking(即端口聚合)](doc/trunking.md)
- [VLAN](doc/vlan.md)
- [修改与 Flash 替换](doc/mods.md)
虽然该固件比原始网管固件提供了相当大的改进,但该固件仍然缺乏对 STP 和专有环路预防协议以及 DHCP 的支持。如果您需要这些功能,请勿在您的网管设备上安装此 Playground。无论如何,强烈建议不要安装,除非您至少能够通过 SOIC 夹具(例如也用于 BIOS 备份的夹具)备份原始 flash 内容,并且在出现问题时能够重新安装该固件。这不需要任何焊接技能。
该固件支持具有以下硬件功能的设备:
- 4 个 2.5G 端口 + 2 个 SFP+ 端口
- 5 个 2.5G 端口 + 1 个 SFP+ 端口
- 8 个 2.5G 端口 + 1 个 SFP+ 端口
出售的设备通常具有相当普遍的设计,但是 LED 配置可能存在差异(交换机具有不同颜色和不同类型 LED 的 LED)。已测试设备的列表可以在[受支持的设备](doc/supported_devices.md)中找到。
要进行有意义的开发,您将需要使用串行控制台,因此需要具备焊接技能。刷写必须通过 SOIC-8 PatchClamp 或通过焊接 flash 芯片的插座来完成。
如果您不想打开您的设备,您可以使用项目的代码,例如通过 Ghidra 查看镜像来了解这些设备。如果您想为 Web 界面的设计做出贡献,或者想先了解一下该界面,这里提供了一个独立的设备模拟器,它完全作为本地 Web 服务器在 Linux 下运行。
## (0) 编译要求
安装以下特定的构建先决条件 (Debian 12/13),请注意 Ubuntu 24.04 仍然使用的是较旧版本的 sdcc,但您需要 sdcc 版本 4.5 才能编译代码:
```
sudo apt install make gcc sdcc xxd python-is-python3 libjson-c-dev
```
## (1) 编译用于直接刷写芯片并升级已运行 RTLPlayground 的设备
使用 vi 或 nano 等编辑器编辑 machine.h。选择固件应为其构建的正确机器型号。
现在,构建固件镜像应该可以正常工作了:
```
make
```
请注意,生成的镜像以 .bin 结尾,而不是 .img,这是为了兼容 IMSProg。
镜像位置存储在 `RTLPlayground/output/rtlplayground_version_machine.bin` 中
例如
```
rtlplayground-v0.1.0-12c98ba-dirty-LIANGUO_ZX_SWTGW215AS.bin
```
## (2) 编译用于带管理选项的 OEM 运行设备 (Web 升级)
可以使用特定的升级镜像从现有的原始固件升级网管交换机。
您首先需要构建用于直接刷写芯片的固件:请参见下文 (1)
然后
```
cd installer
make
```
镜像位置存储在 `RTLPlayground/installer/output/rtlplayground_oem_upgrade.bin` 中
编译控制台输出示例
```
RTLPlayground/installer$ make
mkdir -p output
gcc updatebuilder.c -o output/updatebuilder
sdas8051 -plosgff -o output/crtstart.rel crtstart.asm
sdcc -mmcs51 --code-loc 0x1000 -o output/installer.rel -c installer.c
sdcc -mmcs51 -Wl-bHOME=0x1100 -Wl-r -o output/rtlinstaller.ihx output/crtstart.rel output/installer.rel
./output/updatebuilder -i output/rtlinstaller.ihx -o output/rtlplayground_oem_upgrade.bin ../output/rtlplayground.bin
Input file size: 524288
Bytes read: 524288
EOF
Payload sum 1 is: 0x25100
Payload sum 2 is: 0x25100
Payload sum with header is: 0x264ec
Payload sum is: 0xf8fe94
Header checksum is: 0x5a1
```
## (3) 使用 Ghidra 进行沙盒测试(可选)
您可以使用 ghidra 测试镜像,或者刷写真实的 Switch 硬件。有关 ghidra 的更多信息,请参见关于 [Ghidra 镜像](ghidra.md)的信息。
## (4) 通过 Web 界面安装(软件方式)
网管交换机(OEM 固件或 RTLplaygroud 固件)可以通过 Web 界面进行升级。
非网管交换机无法通过这种方式刷写(见 5)。
转到“Firmware update”选项卡,选择正确的文件。
最后,点击“Upload File”按钮即可完成!
## (5) 直接刷写 ROM(硬件方式,也是唯一的救援方式)
如果 ROM 芯片足够大,此程序是刷写非网管交换机的唯一方法。
如果出现问题,这也是使您的设备变砖后恢复的唯一方法。
- 断开交换机的电源。
- 打开交换机。
- 将夹子连接到 flash 芯片上(红线对应 Pin 1,Pin 1 有一个圆点标记)。
- 连接 USB 刷写编程器,交换机上的电源指示灯会亮起,如果不亮请检查线缆。
- 不要惊慌,接反 GND 和 3.3V 通常不会烧毁交换机。
- 使用 IMSProg、Flashrom 或任何其他 Programmer 来检测芯片。
- 备份(DUMP)现有固件!
- 擦除(BLANK)ROM!
- 将固件加载到 IMSProg 中。
- 将其刷写到 ROM 芯片中。
- 断开 ROM 芯片上的夹子。
- 大功告成,准备首次启动。
## (6) 连接串行界面(可选)
您可以将串行线缆连接到所有设备上都有的 UART 端口,设置 8N1 @ 115200 baud。
## (7) 通电
当您给交换机通电时,设备将执行一些示例并提供一个最小化的控制台(如果已连接到串行接口),其文档可以在源代码 `rtlplayground.c` 中找到。
## (8) Web 界面
除非您在编译前在 config.txt 中指定了 IP 地址,否则可以通过 [默认的 192.168.10.247](http://192.168.10.247) 访问 Web 界面。
## (9) 命令行
命令行非常基础,主要用于测试目的。
以下是带有一些示例的启动日志:
```
Detecting CPU
RTL8373 detected
Starting up...
Flash controller
NIC reset
rtl8372_init called
RTL837X_REG_SDS_MODES: 0x00000bed
phy_config_8224 called
phy_config_8224 done
rtl8224_phy_enable called
rtl8224_phy_enable done
rtl8372_init done
A minimal prompt to explore the RTL8372:
CPU detected: RTL8373
Clock register: 0x00001101
Register 0x7b20/RTL837X_REG_SDS_MODES: 0x00000bed
Verifying PHY settings:
Port State Link TxGood TxBad RxGood RxBad
1 On Down 0x00000000 0x00000000 0x00000000 0x00000000
2 On Down 0x00000000 0x00000000 0x00000000 0x00000000
3 On Down 0x00000000 0x00000000 0x00000000 0x00000000
4 On Down 0x00000000 0x00000000 0x00000000 0x00000000
5 On 2.5G 0x00000008 0x00000000 0x00000000 0x00000000
6 On Down 0x00000000 0x00000000 0x00000000 0x00000000
7 On Down 0x00000000 0x00000000 0x00000000 0x00000000
8 On Down 0x00000000 0x00000000 0x00000000 0x00000000
9 NO SFP Down 0x00000000 0x00000000 0x00000000 0x00000000
> port 5 1g
CMD: port 5 1g
PORT 04 1G
> stat
CMD: stat
Port State Link TxGood TxBad RxGood RxBad
1 On Down 0x00000000 0x00000000 0x00000000 0x00000000
2 On Down 0x00000000 0x00000000 0x00000000 0x00000000
3 On Down 0x00000000 0x00000000 0x00000000 0x00000000
4 On Down 0x00000000 0x00000000 0x00000000 0x00000000
5 On 1000M 0x00000035 0x00000000 0x00000017 0x00000000
6 On Down 0x00000000 0x00000000 0x00000000 0x00000000
7 On Down 0x00000000 0x00000000 0x00000000 0x00000000
8 On Down 0x00000000 0x00000000 0x00000000 0x00000000
9 NO SFP Down 0x00000000 0x00000000 0x00000000 0x00000000
>
```
ip xxx.xxx.xxx.xxx = IP adress of the switch
gw yyy.yyy.yyy.yyy = IP adress of the gateway
netmask zzz.zzz.zzz.zzz = Network mask of the switch
port x name xxx = Name xxx the port number x
port z 1g = Set 1g speed for port z
igmp on/off = Turn IGMP on or off
```
[待续]
享受玩耍的乐趣!
## (11) 其他文档
以下文档提供了有关 RTL837x SoC 特定功能的更多说明:
- [RTL8372/3 功能支持](doc/hardware.md)
- [CPU 端口](doc/CpuPort.md)
- [L2 学习](doc/l2.md)
- [IGMP (IP-MC 流)](doc/igmp.md)
- [SFP+ 端口](doc/sfp.md)
- [Trunking(即端口聚合)](doc/trunking.md)
- [VLAN](doc/vlan.md)
- [修改与 Flash 替换](doc/mods.md)标签:RTL8372, RTL8373, Web界面, 固件, 客户端加密, 嵌入式开发, 网络交换机, 网络配置, 逆向工具