Index: target/linux/ramips/image/Makefile =================================================================== --- target/linux/ramips/image/Makefile (revision 39752) +++ target/linux/ramips/image/Makefile (working copy) @@ -422,6 +422,20 @@ Image/Build/Profile/DIR-300-B7=$(call BuildFirmware/Default4M/$(1),$(1),dir-300-b7,DIR-300-B7) Image/Build/Profile/DIR-320-B1=$(call BuildFirmware/Default8M/$(1),$(1),dir-320-b1,DIR-320-B1) +define BuildFirmware/ZyXEL_Keenetic_series/squashfs + $(call BuildFirmware/Default8M/$(1),$(1),$(2),$(3)) + # SquashFS must begin exactly at defined offset $(5)+64 bytes! + dd if=$(KDIR)/vmlinux-$(2).bin.lzma of=$(KDIR)/vmlinux-$(2).bin.lzma.padded bs=$(5) conv=sync + mv $(KDIR)/vmlinux-$(2).bin.lzma.padded $(KDIR)/vmlinux-$(2).bin.lzma + $(call MkImage,lzma,$(KDIR)/vmlinux-$(2).bin.lzma,$(KDIR)/vmlinux-$(2).uImage,$(3)) + $(call MkImageSysupgrade/squashfs,$(1),$(2),$(4),factory) + $(eval output_name=$(IMG_PREFIX)-$(2)-$(1)-factory) + # ZyXEL signature must be aligned at 64K + dd if=$(BIN_DIR)/$(output_name).bin of=$(BIN_DIR)/$(output_name).padded bs=65536 conv=sync + mv $(BIN_DIR)/$(output_name).padded $(BIN_DIR)/$(output_name).bin + $(STAGING_DIR_HOST)/bin/zyimage -v "$(output_name)" -d $(6) $(BIN_DIR)/$(output_name).bin +endef + Image/Build/Profile/NBG-419N=$(call BuildFirmware/Default4M/$(1),$(1),nbg-419n,NBG-419N) Image/Build/Profile/MZKW300NH2=$(call BuildFirmware/Edimax/$(1),$(1),mzk-w300nh2,MZK-W300NH2,$(mzkw300nh2_mtd_size),CSYS,RN52,0x50000,0xc0000) Index: target/linux/ramips/rt305x/profiles/zyxel.mk =================================================================== --- target/linux/ramips/rt305x/profiles/zyxel.mk (revision 0) +++ target/linux/ramips/rt305x/profiles/zyxel.mk (working copy) @@ -0,0 +1,7 @@ +# +# Copyright (C) 2014 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + Index: tools/Makefile =================================================================== --- tools/Makefile (revision 39752) +++ tools/Makefile (working copy) @@ -17,7 +17,7 @@ tools-y += sstrip ipkg-utils genext2fs e2fsprogs mtd-utils mkimage tools-y += firmware-utils patch-image patch quilt yaffs2 flock padjffs2 tools-y += mm-macros xorg-macros xfce-macros missing-macros xz cmake scons bc -tools-y += findutils +tools-y += findutils zyimage tools-$(CONFIG_TARGET_orion_generic) += wrt350nv2-builder upslug2 tools-$(CONFIG_powerpc) += upx tools-$(CONFIG_TARGET_x86) += qemu @@ -68,6 +68,7 @@ $(curdir)/sdcc/compile := $(curdir)/bison/install $(curdir)/b43-tools/compile := $(curdir)/bison/install $(curdir)/padjffs2/compile := $(curdir)/findutils/install +$(curdir)/zyimage/compile := $(curdir)/findutils/install ifneq ($(CONFIG_CCACHE),) $(foreach tool, $(tools-y), $(eval $(curdir)/$(tool)/compile += $(curdir)/ccache/install)) Index: tools/zyimage/Makefile =================================================================== --- tools/zyimage/Makefile (revision 0) +++ tools/zyimage/Makefile (working copy) @@ -0,0 +1,36 @@ +# +# Copyright (C) 2014 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:=zyimage +PKG_VERSION:=1 + +include $(INCLUDE_DIR)/host-build.mk + +define Host/Prepare + mkdir -p $(HOST_BUILD_DIR) + $(CP) ./src/* $(HOST_BUILD_DIR)/ + find $(HOST_BUILD_DIR) -name .svn | $(XARGS) rm -rf +endef + +define Host/Compile + $(MAKE) -C $(HOST_BUILD_DIR) LDFLAGS="$(HOST_STATIC_LINKING)" +endef + +define Host/Configure +endef + +define Host/Install + $(CP) $(HOST_BUILD_DIR)/zyimage $(STAGING_DIR_HOST)/bin/ +endef + +define Host/Clean + rm -f $(STAGING_DIR_HOST)/bin/zyimage +endef + +$(eval $(call HostBuild)) Index: tools/zyimage/src/Makefile =================================================================== --- tools/zyimage/src/Makefile (revision 0) +++ tools/zyimage/src/Makefile (working copy) @@ -0,0 +1,15 @@ +CC = gcc +CFLAGS = +WFLAGS = -Wall -Werror +zyimage-objs = zyimage.o + +all: zyimage + +%.o: %.c + $(CC) $(CFLAGS) $(WFLAGS) -c -o $@ $< + +zyimage: $(zyimage-objs) + $(CC) $(LDFLAGS) -o $@ $(zyimage-objs) + +clean: + rm -f zyimage *.o Index: tools/zyimage/src/zyimage.c =================================================================== --- tools/zyimage/src/zyimage.c (revision 0) +++ tools/zyimage/src/zyimage.c (working copy) @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2014 Soul Trace + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + * + */ + +#include +#include +#include +#include +#include + +#define szbuf 32768 + +u_int32_t crc_tab[256]; + +u_int32_t chksum_crc32 (FILE *f) +{ + register unsigned long crc; + unsigned long i, j; + char *buffer = malloc(szbuf); + char *buf; + + crc = 0xFFFFFFFF; + while (!feof(f)) + { + j = fread(buffer, 1, szbuf, f); + buf = buffer; + for (i = 0; i < j; i++) + crc = ((crc >> 8) & 0x00FFFFFF) ^ crc_tab[(crc ^ *buf++) & 0xFF]; + } + free(buffer); + return crc; +} + +void chksum_crc32gentab () +{ + unsigned long crc, poly; + int i, j; + + poly = 0xEDB88320L; + for (i = 0; i < 256; i++) + { + crc = i; + for (j = 8; j > 0; j--) + { + if (crc & 1) + crc = (crc >> 1) ^ poly; + else + crc >>= 1; + } + crc_tab[i] = crc; + } +} + +void usage(char *progname) +{ + printf("Usage: %s [ -v Version ] [ -d Device_ID ] \n", progname); + exit(1); +} + +int main(int argc, char *argv[]) { + struct signature + { + const char magic[4]; + unsigned int device_id; + char firmware_version[48]; + unsigned int crc32; + } + sign = + { + { 'Z', 'N', 'B', 'G' }, + 1, + { "V.1.0.0(1.0.0)" }, + 0 + }; + FILE *f; + + if (argc < 1) + usage(argv[0]); + + static const char *optString = "v:d:h"; + int opt = getopt( argc, argv, optString ); + while( opt != -1 ) { + switch( opt ) { + case 'v': + if (optarg == NULL) + usage(argv[0]); + strncpy(sign.firmware_version, optarg, sizeof(sign.firmware_version)-1); + sign.firmware_version[sizeof(sign.firmware_version)-1]='\0'; // Make sure that string is terminated correctly + break; + + case 'd': + sign.device_id = atoi(optarg); + if (sign.device_id == 0) + sign.device_id = (int)strtol(optarg, NULL, 16); + break; + + case '?': + case 'h': + usage(argv[0]); + break; + + default: + break; + } + + opt = getopt( argc, argv, optString ); + } + + chksum_crc32gentab(); + char *filename=argv[optind]; + if (access(filename, W_OK) || access(filename, R_OK)) + { + printf("Not open input file %s\n", filename); + exit(1); + } + f = fopen(argv[optind], "r+"); + if (f != NULL) + { + fseek(f, sizeof(sign)*-1, SEEK_END); + struct signature oldsign; + fread(&oldsign, sizeof(oldsign), 1, f); + if (strncmp(oldsign.magic,"ZNBG", sizeof(oldsign.magic)) == 0 ) + { + printf("Image is already signed as:\nDevice ID: 0x%08x\nFirmware version: %s\nImage CRC32: 0x%x\n", oldsign.device_id, oldsign.firmware_version, oldsign.crc32); + exit(0); + } + + fseek(f, 0, SEEK_SET); + sign.crc32 = chksum_crc32(f); + fwrite(&sign, sizeof(sign), 1, f); + fclose(f); + printf("Image signed as:\nDevice ID: 0x%08x\nFirmware version: %s\nImage CRC32: 0x%x\n", sign.device_id, sign.firmware_version, sign.crc32); + } + return 0; +} +