realtek: build ZyXEL vendor firmware compatible initramfs
authorBjørn Mork <>
Sat, 23 Jan 2021 10:08:12 +0000 (11:08 +0100)
committerPetr Štetiar <>
Sun, 24 Jan 2021 17:12:34 +0000 (18:12 +0100)
Append a device specific version trailer used by the stock
firmware upgrade application to validate firmwares.

The trailer contains a list of ZyXEL firmware version
numbers, which includes a four letter hardware identifier.
The stock web UI requires that the current hardware matches
one of the listed versions, and that the version number is
larger than a model specific minimum value. The minimum
version varies between V1.00 and V2.60 for the currently
known GS1900 models. The number is not used anywhere else
to our knowlege, and has no direct relation to the version
info in the u-image header.  We can therefore use an
arbitrary value larger than V2.60.

The stock firmware upgrade application will only load and
flash the part of the file specified in the u-image header,
regardless of file size.  It can therefore not be used to
flash images with an appended rootfs. There is therefore no
need to include the trailer in other images than the
initramfs. This prevents accidentally bricking by attempts
to flash other images from the stock web UI.

Stock images support all models in the series, listing
all of them in the version trailer.  OpenWrt provide model
specific images.  We therefore only list the single supported
hardware identifier for each image.  This eliminates the risk
of flashing the wrong OpenWrt image from stock web UI.

OpenWrt can be installed from stock firmware in two steps:

   1) flash OpenWrt initramfs image from stock web gui
   2) boot OpenWrt and sysupgrade to a squasfs image

The OpenWrt squashfs image depends on a static partition
map in the DTS.  It can only be installed to the "firmware"
partition.  This partition is labeled "RUNTIME1" in u-boot
and in stock firmware, and is referred to as "image 0" in
the stock flash management tool.  The OpenWrt initramfs
can be installed and run from either partitions. But if
you want to keep stock irmware in the spare system partition,
then you must make sure stock firmware is installed to the
"RUNTIME2" partition referred to as "image 1" in the stock
web UI. And the initial OpenWrt initramfs must be flashed
to "RUNTIME1"/"image 0".

The stock flash management application supports direct
selection of both which partition to flash and which
partition to boot next.  This allows software controlled
"dual-boot" between OpenWrt and stock firmware, without
using console access to u-boot. u-boot use the "bootpartition"
variable stored in the second u-boot environment to select
which of the two system partitions to boot.  This variable
is set by the stock flash management application, by direct
user input.  It can also be set in OpenWrt using e.g

 fw_setsys bootpartition 1

to select "RUNTIME2"/"image 1" as default, assuming a
stock firmware version is installed in that partition.

Signed-off-by: Bjørn Mork <>

index c05c504ec4065cda915284bf5301d353a64a00f1..8ad7ad1b5d760dadd5eb51ae8dd81cf0ee62ed05 100644 (file)
@@ -7,6 +7,14 @@ include $(INCLUDE_DIR)/
 KERNEL_LOADADDR = 0x80000000
 KERNEL_ENTRY = 0x80000400
+define Build/zyxel-vers
+       ( echo VERS;\
+       for hw in $(1); do\
+               echo -n "V9.99($$hw.0) | ";\
+               date -d @$(SOURCE_DATE_EPOCH) +%m/%d/%Y;\
+       done ) >> $@
 define Device/Default
   PROFILES = Default
   KERNEL := kernel-bin | append-dtb | gzip | uImage gzip
@@ -70,6 +78,7 @@ define Device/zyxel_gs1900-10hp
   DEVICE_MODEL := GS1900-10HP
   UIMAGE_MAGIC := 0x83800000
+  KERNEL_INITRAMFS := kernel-bin | append-dtb | gzip | zyxel-vers AAZI | uImage gzip
 TARGET_DEVICES += zyxel_gs1900-10hp
@@ -81,6 +90,7 @@ define Device/zyxel_gs1900-8hp-v1
   DEVICE_PACKAGES += lua-rs232
   UIMAGE_MAGIC := 0x83800000
+  KERNEL_INITRAMFS := kernel-bin | append-dtb | gzip | zyxel-vers AAHI | uImage gzip
 TARGET_DEVICES += zyxel_gs1900-8hp-v1
@@ -92,6 +102,7 @@ define Device/zyxel_gs1900-8hp-v2
   DEVICE_PACKAGES += lua-rs232
   UIMAGE_MAGIC := 0x83800000
+  KERNEL_INITRAMFS := kernel-bin | append-dtb | gzip | zyxel-vers AAHI | uImage gzip
 TARGET_DEVICES += zyxel_gs1900-8hp-v2