OpenWRT on Zyxel GS1900-48HP

I recently acquired a Zyxel GS1900-48HP that is currently stuck in a bootloop. My goal would be to install OpenWRT on it. Based on various forum posts, I concluded that the hardware (except for PoE) is very similar to the GS1900-48. Would it therefore be possible to use a GS1900-48 image? Or does it need another DTS file?

Thanks,
Mike

You could start with a GS1900-48 image as indeed the main board appears to be shared between the -48 and -48HP, a albeit with some things unpopulated on the -48 board. To be on the safe side you should load an initramfs via the u-boot console.

To get PoE going, you will need to ensure GPIO36 on the RTL8231 is configured correctly so the PoE MCU doesn't stay in reset (active-low pin). GPIO13 on the RTL8231 is probably the PoE MCU enable signal, like on the other GS1900 boards.

GPIO21 is the fan status line, but I'm looking to add that to the GS1900-48 devicetree at the moment.

@svanheule

Thanks for your valuable feedback! I have already created a new DTS file for the GS1900-48HP based on GS1900-48. I will configure the GPIO as you suggested. I'm going to build and install it. Let’s see what happens.

To download the initramfs via u-boot, the following tftp command should work?

tftpboot 0x84f00000 192.168.1.10:initramfs-kernel.bin

So, is this the same process as with, for example, the GS1900-8HP (https://openwrt.org/toh/zyxel/gs1900-8hp_v1#oem_installation_using_the_tftp_method)? Does the RAM load address also work in this case?

The procedure should indeed be the same as documented for the GS1900-8HP. Memory layout is the same.

1 Like

I've noticed that there's also a GS1900-48HPv2. Are you aware of the technical differences between the GS1900-48HP and the GS1900-48HPv2? Should I create a generic DTS file and corresponding identifiers for the GS1900-48HP, or do we need to differentiate between v1 and v2?

Start with what you know, with your device (and name it accordingly), everything else can only be answered if/ when someone with the other variant shows up and picks up the work. The only thing you can do, is making sure to be explicit about the device name.

1 Like

Looks good so far, OpenWRT boots but PoE isn't working. Maybe something is probably still wrong with the DTS file. Following error messages in the log:

...
[01.01.1970, 00:05:55 UTC] daemon.warn: realtek-poe: Invalid port in power stat (port=33)
[01.01.1970, 00:05:55 UTC] daemon.warn: realtek-poe: Invalid port in power stat (port=34)
[01.01.1970, 00:05:55 UTC] daemon.warn: realtek-poe: Invalid port in power stat (port=35)
[01.01.1970, 00:05:55 UTC] daemon.warn: realtek-poe: Invalid port in power stat (port=36)
...

@svanheule Would you be so kind as to take a look at my modifications for the GS1900-48HP? Perhaps I've missed something: https://github.com/loswochos/openwrt/commit/12d973c68d2a14b64b53cff9a2ebf3e2f995e7d7

ubus output:

root@OpenWrt:~# ubus -v list poe
'poe' @b0a6ea32
	"info":{}
	"debug":{}
	"reload":{}
	"sendframe":{"frame":"String"}
	"manage":{"port":"String","enable":"Boolean"}
root@OpenWrt:~# ubus call poe info
{
	"firmware": "v17.1",
	"mcu": "ST Micro ST32F100 Microcontroller",
	"budget": 170.000000,
	"consumption": 0.000000,
	"ports": {
		"lan1": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan2": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan3": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan4": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan5": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan6": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan7": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan8": {
			"priority": 0,
			"mode": "PoE",
			"status": "Requesting power"
		},
		"lan9": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan10": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan11": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan12": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan13": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan14": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan15": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan16": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan17": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan18": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan19": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan20": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan21": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan22": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan23": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan24": {
			"priority": 0,
			"mode": "PoE",
			"status": "Searching"
		},
		"lan25": {
			"priority": 0,
			"mode": "PoE+",
			"status": "unknown"
		},
		"lan26": {
			"priority": 0,
			"status": "unknown"
		},
		"lan27": {
			"priority": 0,
			"status": "unknown"
		},
		"lan28": {
			"priority": 0,
			"status": "unknown"
		},
		"lan29": {
			"priority": 0,
			"status": "unknown"
		},
		"lan30": {
			"priority": 0,
			"status": "unknown"
		},
		"lan31": {
			"priority": 0,
			"status": "unknown"
		},
		"lan32": {
			"priority": 0,
			"status": "unknown"
		},
		"lan33": {
			"priority": 0,
			"status": "unknown"
		},
		"lan34": {
			"priority": 0,
			"status": "unknown"
		},
		"lan35": {
			"priority": 0,
			"status": "unknown"
		},
		"lan36": {
			"priority": 0,
			"status": "unknown"
		},
		"lan37": {
			"priority": 0,
			"status": "unknown"
		},
		"lan38": {
			"priority": 0,
			"status": "unknown"
		},
		"lan39": {
			"priority": 0,
			"status": "unknown"
		},
		"lan40": {
			"priority": 0,
			"status": "unknown"
		},
		"lan41": {
			"priority": 0,
			"status": "unknown"
		},
		"lan42": {
			"priority": 0,
			"status": "unknown"
		},
		"lan43": {
			"priority": 0,
			"status": "unknown"
		},
		"lan44": {
			"priority": 0,
			"status": "unknown"
		},
		"lan45": {
			"priority": 0,
			"status": "unknown"
		},
		"lan46": {
			"priority": 0,
			"status": "unknown"
		},
		"lan47": {
			"priority": 0,
			"status": "unknown"
		},
		"lan48": {
			"priority": 0,
			"status": "unknown"
		}
	}
}

Kernel Log: https://drive.google.com/file/d/1eMfvMkf7B7oYUwfYDB6X7GP0mlJEbJBX/view?usp=sharing

Not an expert, but I’ve made the GS1900-10HP B1/v2 work despite officially not being supported. Can you please check the revision of the switch? “v2” should be “B1” on the label.

If it’s B1, POE probably works if you add the following lines to your /etc/config/poe:

	option force_baudrate '115200'
	option force_dialect 'realtek'

Edit: But this may be not applicable if poe already detects the firmware version and chip.

I think the differences between the A and B revisions of the GS1900 devices has typically been them amount of RAM.

[ 2.030018] rtl8231-expander realtek-aux-mdio:03: RTL8231 not present or ready 0x0 != 0x37
...
[ 19.732221] platform i2c-gpio-0: deferred probe pending: (reason unknown)
[ 19.739824] platform i2c-gpio-1: deferred probe pending: (reason unknown)
[ 19.747475] platform sfp-p49: deferred probe pending: (reason unknown)
[ 19.754825] platform sfp-p50: deferred probe pending: (reason unknown)
[ 19.762278] platform keys: deferred probe pending: (reason unknown)

This means the GPIO expander is not probing correctly, so all the PoE control signals will be missing too. Even if you are communicating to the MCU in the correct format, you won't be able to switch on the poe-enable signal.

You'll have to do some more digging to find out why that's failing here.

@p.p

The label doesn't indicate a revision or version number, so I assume it's "V1."

@svanheule

Thank you for your input. I completely missed the kernel messages. I’ll take a look and see what I can find out.

1 Like

I tested a few things, unfortunately without success. I also tried the DTS from this mailing list post: https://lists.openwrt.org/pipermail/openwrt-devel/2025-November/044370.html

The same error pattern here as well, although PoE basically should work according to the boot.log of the mailing list post.

What makes me a bit suspicious and I therefore think this could be a more deeper (u-boot or hardware?) issue:

The switch has not booted since an unplanned power shutdown. In the serial console I was able to determine that it was stuck in the factory self test.

bootcmd=cst fcTest; boota

This means that the port test runs and then some addresses are read from the flash and rewritten. The last step runs almost endless rounds. The test did not show any error messages at any time.

When I skip the factory test and boot the vendor image, it works without any problems at first, but the switch reports as GS1900-8 in the WebUI. Accordingly, neither all ports work nor does PoE work. I tested both bootpartion 0 and bootpartion 1. In the u-boot environment variables everything looks as it should, device model is correct.

I tried (without success) a hard reset and flashed an up-to-date vendor firmware image for the gs1900-48hp via zyxel webui as well as via openwrt.

Does anyone have an idea what I can do here?

If PoE isn't working and the devices misidentifies itself, I wonder if the RTL8231 is working at all. These switch series often have a set of pull-up/down ID resistors on the RTL8231 expander, which the firmware would read to select the right hardware profile.