realtek: add support for Zyxel GS1920-24HPv2
authorJonas Jelonek <jelonek.jonas@gmail.com>
Wed, 29 Oct 2025 21:01:02 +0000 (21:01 +0000)
committerHauke Mehrtens <hauke@hauke-m.de>
Fri, 13 Feb 2026 22:33:25 +0000 (23:33 +0100)
Add support for V2 of Zyxel GS1920-24HP with 24 copper ports, 4 combo
SFP/copper ports and PoE.

Specifications:
---------------

 * SoC: Realtek RTL8391M
 * Flash: 32MiB Flash
 * RAM: 256MiB
 * Ethernet: 24x 10/100/1000 Mbps
 * SFP: 4 combo copper/SFP ports (via RTL8214FC)
 * PoE: 24x
 * Fan controller: ADT7468
 * Serial: UART 3.3V TTL logic, 115200 8N1
     * pinout (front to back): GND RX TX VCC
 * Buttons: 1x Reset, 1x Restore

Notable differences to V1 (which require dedicated support):
 * "smaller" SoC (RTL8391M)
 * more RAM (256MiB vs 128MiB)
 * more Flash (32MiB vs 16MiB) + different layout
 * RTL8214FC uses different port numbers
 * SFP 25 and 26 use shared SCL
 * SFP 27 and 28 use different SDA
 * different monitoring IC (LM96000 vs ADT7468)
 * faster serial console by default
 * serial header easier accessible

Note that the port LEDs do not work correctly yet due to missing
LED configuration for RTL839X.

Installation:
-------------

(copied mostly as-is from 2a55846bf4)

This device uses ZyNOS instead of Linux, this makes installation a bit
more cumbersome. Serial console is required!

1. Set the switch to boot from the first image. This step is crucial,
   it will fail to boot if this is not set properly.

2. Connect to the switch using serial and interrupt the boot process
   to enter debug/recovery mode.

3. Load the OpenWrt initramfs image via XMODEM. You need to obtain an
   unlock code, based on your MAC address, first. See the excellent write
   up at https://www.ixo.de/info/zyxel_uclinux/ for details. Replace
   unlock_code in the commands below by the code obtained.
   The file length in bytes needs to be given instead of file_length below.
   You also need an XMODEM upload utility like "lrzsz-sx -X" to transfer
   the file. Start the XMODEM upload after running the ATUPxxxx command:

     > ATEN1,unlock_code
     > ATUP80100000,file_length
     > ATGO80100000

4. Wait for OpenWrt to boot. Once this is done, transfer the loader binary
   and the sysupgrade image to "/tmp" using scp.

5. Install OpenWrt permanently by running the following two commands on
   the switch (over SSH):

    > mtd write /tmp/loader.bin loader
    > mtd write /tmp/sysupgrade.bin firmware

6. Reboot the switch and enjoy OpenWrt.

NB: You do not need to touch the loader binary unless it's recommended.
    The loader is not part of a regular sysupgrade file and will be left
    untouched. The boot loader only checks if the loader is valid to be
    able to boot.

Recovery/ Return to stock:
--------------------------

Just spam the "u" key during (or "z" for 9600 baud) during memory testing
to trigger a recovery XMODEM upload at 115200 baud. A standard OEM upgrade
image works properly.

Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/21944
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
target/linux/realtek/base-files/etc/board.d/02_network
target/linux/realtek/dts/rtl8391_zyxel_gs1920-24hp-v2.dts [new file with mode: 0644]
target/linux/realtek/image/rtl839x.mk

index 67d6a29e7d8921ca1c59eb1a4b58ea2a306e2afa..188f9ded20b5064e6ce1714bf3e83bbe85444982 100644 (file)
@@ -76,7 +76,8 @@ realtek_setup_macs()
        plasmacloud,mcx3|\
        plasmacloud,psx8|\
        plasmacloud,psx10|\
-       plasmacloud,psx28)
+       plasmacloud,psx28|\
+       zyxel,gs1920-24hp-v2)
                lan_mac="$(get_mac_label)"
                ;;
        tplink,tl-st1008f-v2|\
diff --git a/target/linux/realtek/dts/rtl8391_zyxel_gs1920-24hp-v2.dts b/target/linux/realtek/dts/rtl8391_zyxel_gs1920-24hp-v2.dts
new file mode 100644 (file)
index 0000000..54e87df
--- /dev/null
@@ -0,0 +1,134 @@
+/dts-v1/;
+
+#include "rtl839x_zyxel_gs1920-24hp-common.dtsi"
+
+/ {
+       compatible = "zyxel,gs1920-24hp-v2", "realtek,rtl8391-soc";
+       model = "Zyxel GS1920-24HPv2";
+
+       memory@0 {
+               device_type = "memory";
+               reg = <0x0 0x10000000>;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       leds {
+               cloud-amber {
+                       gpios = <&gpio1 27 GPIO_ACTIVE_LOW>;
+                       color = <LED_COLOR_ID_AMBER>;
+               };
+
+               pwr-green {
+                       gpios = <&gpio1 18 GPIO_ACTIVE_LOW>;
+                       function = LED_FUNCTION_POWER;
+                       color = <LED_COLOR_ID_GREEN>;
+                       default-state = "on";
+               };
+
+               pwr-amber {
+                       gpios = <&gpio1 19 GPIO_ACTIVE_HIGH>;
+                       function = LED_FUNCTION_POWER;
+                       color = <LED_COLOR_ID_AMBER>;
+               };
+
+               poe-max {
+                       gpios = <&gpio1 35 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_AMBER>;
+               };
+       };
+
+       keys {
+               compatible = "gpio-keys-polled";
+               poll-interval = <20>;
+
+               restore {
+                       label = "restore";
+                       gpios = <&gpio1 32 GPIO_ACTIVE_LOW>;
+                       linux,code = <BTN_0>;
+                       linux,input-type = <EV_KEY>;
+               };
+       };
+
+       /delete-node/ i2c-gpio-0;
+       /delete-node/ i2c-gpio-1;
+
+       i2c-gpio-shared {
+               compatible = "i2c-gpio-shared";
+               scl-gpios = <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               i2c0: i2c@0 {
+                       sda-gpios = <&gpio1 4 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+                       i2c-gpio,delay-us = <2>;
+               };
+
+               i2c1: i2c@1 {
+                       sda-gpios = <&gpio1 10 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+                       i2c-gpio,delay-us = <2>;
+               };
+       };
+};
+
+&i2c2 {
+       scl-gpios = <&gpio1 9 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+};
+
+&i2c3 {
+       scl-gpios = <&gpio1 15 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+};
+
+&i2c4 {
+       lm96000: lm96000@2e {
+               compatible = "national,lm85";
+               reg = <0x2e>;
+       };
+};
+
+&flash_partitions {
+       partition@20000 {
+               label = "reserved";
+               reg = <0x20000 0x1e0000>;
+               read-only;
+       };
+
+       partition@200000 {
+               reg = <0x200000 0x1e00000>;
+               label = "factory";
+
+               compatible = "fixed-partitions";
+               #address-cells = <1>;
+               #size-cells = <1>;
+
+               partition@0 {
+                       label = "loader";
+                       reg = <0x0 0x10000>;
+               };
+
+               partition@10000 {
+                       label = "firmware";
+                       reg = <0x10000 0x1d00000>;
+                       compatible = "openwrt,uimage", "denx,uimage";
+               };
+       };
+};
+
+&mdio_bus0 {
+       /* External phy RTL8214FC #1 */
+       EXTERNAL_SFP_PHY_FULL(24, 0)
+       EXTERNAL_SFP_PHY_FULL(25, 1)
+       EXTERNAL_SFP_PHY_FULL(26, 2)
+       EXTERNAL_SFP_PHY_FULL(27, 3)
+};
+
+&switch0 {
+       ports {
+               SWITCH_PORT_SDS(24, 25, 6, qsgmii)
+               SWITCH_PORT_SDS(25, 26, 6, qsgmii)
+               SWITCH_PORT_SDS(26, 27, 6, qsgmii)
+               SWITCH_PORT_SDS(27, 28, 6, qsgmii)
+       };
+};
index 6afa80b49d268fa880c9f105bd70fc494ad250fa..a40a2300c270a64719f6bc0f2d9057c0d2401450 100644 (file)
@@ -129,3 +129,12 @@ define Device/zyxel_gs1920-24hp-v1
   DEVICE_VARIANT := v1
 endef
 TARGET_DEVICES += zyxel_gs1920-24hp-v1
+
+define Device/zyxel_gs1920-24hp-v2
+  $(Device/zyxel_gs1920-24hp)
+  SOC := rtl8391
+  FLASH_ADDR := 0xb4210000
+  IMAGE_SIZE := 30720k
+  DEVICE_VARIANT := v2
+endef
+TARGET_DEVICES += zyxel_gs1920-24hp-v2