openwrt/tools/firmware-utils/Makefile
Bjørn Mork 48cad07a55 firmware-utils: zytrx: Add util for ZyXEL specific header
The ZyXEL NR7101 prepend an additional header to U-Boot images. This
header use the TRX magic 0x30524448 (HDR0), but is incompatible with
TRX images.

This code is reverse-engineered based on matching 32 bit numbers
found in the header with lengths and different checksum
calculations of the vendor images found on the device.  The result
was matched against the validation output produced by the
bootloader to name the associated header fields.

Example bootloader validation output:

 Zyxel TRX Image 1 --> Found!  Header Checksum OK
 ============ZyXEL header information==================
         chipId             : MT7621A
         boardId            : NR7101
         modelId            : 07 01 00 01
         kernel_len         : (14177560)
         kernelChksum       : (0x8DD31F69)
         swVersionInt       : 1.00(ABUV.0)D1
         swVersionExt       : 1.00(ABUV.0)D1

 Zyxel TRX Image 2 --> Found!  Header Checksum OK
 ============ZyXEL header information==================
         chipId             : MT7621A
         boardId            : NR7101
         modelId            : 07 01 00 01
         kernel_len         : (14176660)
         kernelChksum       : (0x951A7637)
         swVersionInt       : 1.00(ABUV.0)D0
         swVersionExt       : 1.00(ABUV.0)D0

 =================================================
 Check image validation:
 Image1 Header Magic Number --> OK
 Image2 Header Magic Number --> OK
 Image1 Header Checksum --> OK
 Image2 Header Checksum --> OK
 Image1 Data Checksum --> OK
 Image2 Data Checksum --> OK
 Image1 Stable Flag --> Stable
 Image1 Try Counter --> 0
 Image1: OK
 Image2: OK

The coverage and algorithm for the kernelChksum field is unknown.
This field is not validated by the bootloader or the OEM firmware
upgrade tool. It is therefore set to a static value for now.

The swVersion fields contain free form string values.  The OEM firmware
use ZyXEL structured version numbers as shown above.  The strings are
not interpreted or validated on boot, so they can be repurposed for
anything we want the bootloader to display to the user.  But the OEM
web GUI fails to flash images with freeform strings.

The purpose of the other strings in the header is not known.  The
values appear to be static.  We assume they are fixed for now, until
we have other examples.  One of these strings is the platform name,
which is taken as an input parameter for support other members of
the device family.

Signed-off-by: Bjørn Mork <bjorn@mork.no>
2021-05-09 09:15:44 +02:00

109 lines
3.1 KiB
Makefile

#
# Copyright (C) 2006-2020 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME := firmware-utils
PKG_RELEASE := 7
include $(INCLUDE_DIR)/host-build.mk
include $(INCLUDE_DIR)/kernel.mk
define cc
$(HOSTCC) \
$(HOST_CFLAGS) \
-Wno-unused-parameter \
-include endian.h $(HOST_LDFLAGS) \
-o $(HOST_BUILD_DIR)/bin/$(firstword $(1)) \
$(foreach src,$(1),src/$(src).c) \
$(2)
endef
define Host/Compile
mkdir -p $(HOST_BUILD_DIR)/bin
$(call cc,add_header,-Wall)
$(call cc,addpattern,-Wall)
$(call cc,asustrx,-Wall)
$(call cc,bcm4908asus,-Wall)
$(call cc,bcm4908kernel,-Wall)
$(call cc,buffalo-enc buffalo-lib,-Wall)
$(call cc,buffalo-tag buffalo-lib,-Wall)
$(call cc,buffalo-tftp buffalo-lib,-Wall)
$(call cc,dgfirmware,-Wall)
$(call cc,dgn3500sum,-Wall)
$(call cc,dns313-header,-Wall)
$(call cc,edimax_fw_header,-Wall)
$(call cc,encode_crc,-Wall)
$(call cc,fix-u-media-header cyg_crc32,-Wall)
$(call cc,hcsmakeimage bcmalgo,-Wall)
$(call cc,imagetag imagetag_cmdline cyg_crc32,-Wall)
$(call cc,jcgimage,-lz -Wall)
$(call cc,lxlfw,-Wall)
$(call cc,lzma2eva,-lz -Wall)
$(call cc,makeamitbin,-Wall)
$(call cc,mkbrncmdline,-Wall)
$(call cc,mkbrnimg,-Wall)
$(call cc,mkbuffaloimg,-Wall)
$(call cc,mkcameofw,-Wall)
$(call cc,mkcasfw,-Wall)
$(call cc,mkchkimg,-Wall)
$(call cc,mkcsysimg,-Wall)
$(call cc,mkdapimg,-Wall)
$(call cc,mkdapimg2,-Wall)
$(call cc,mkdhpimg buffalo-lib,-Wall)
$(call cc,mkdlinkfw mkdlinkfw-lib,-lz -Wall --std=c99)
$(call cc,mkdniimg,-Wall)
$(call cc,mkedimaximg,-Wall)
$(call cc,mkfwimage,-lz -Wall -Werror -Wextra -D_FILE_OFFSET_BITS=64)
$(call cc,mkfwimage2,-lz -Wall)
$(call cc,mkheader_gemtek,-lz -Wall)
$(call cc,mkhilinkfw,-lcrypto -Wall)
$(call cc,mkmerakifw sha1,-Wall)
$(call cc,mkmerakifw-old,-Wall)
$(call cc,mkmylofw,-Wall)
$(call cc,mkplanexfw sha1,-Wall)
$(call cc,mkporayfw,-Wall)
$(call cc,mkrasimage,--std=gnu99 -Wall)
$(call cc,mkrtn56uimg,-lz -Wall)
$(call cc,mksenaofw md5,-Wall --std=gnu99)
$(call cc,mksercommfw,-Wall)
$(call cc,mktitanimg,-Wall)
$(call cc,mktplinkfw mktplinkfw-lib md5,-Wall -fgnu89-inline)
$(call cc,mktplinkfw2 mktplinkfw-lib md5,-Wall -fgnu89-inline)
$(call cc,mkwrggimg md5,-Wall)
$(call cc,mkwrgimg md5,-Wall)
$(call cc,mkzcfw cyg_crc32,-Wall)
$(call cc,mkzynfw,-Wall)
$(call cc,motorola-bin,-Wall)
$(call cc,nand_ecc,-Wall)
$(call cc,nec-enc,-Wall --std=gnu99)
$(call cc,osbridge-crc,-Wall)
$(call cc,oseama md5,-Wall)
$(call cc,otrx,-Wall)
$(call cc,pc1crypt)
$(call cc,ptgen cyg_crc32,-Wall)
$(call cc,seama md5,-Wall)
$(call cc,sign_dlink_ru md5,-Wall)
$(call cc,spw303v,-Wall)
$(call cc,srec2bin)
$(call cc,tplink-safeloader md5,-Wall --std=gnu99)
$(call cc,trx,-Wall)
$(call cc,trx2edips,-Wall)
$(call cc,trx2usr,-Wall)
$(call cc,uimage_padhdr,-Wall -lz)
$(call cc,wrt400n cyg_crc32,-Wall)
$(call cc,xorimage,-Wall)
$(call cc,zyimage,-Wall)
$(call cc,zytrx,-Wall)
$(call cc,zyxbcm,-Wall)
endef
define Host/Install
$(INSTALL_BIN) $(HOST_BUILD_DIR)/bin/* $(STAGING_DIR_HOST)/bin/
endef
$(eval $(call HostBuild))