From d673a23639860e21ef87c4c455018c4b6245868a Mon Sep 17 00:00:00 2001 From: John Crispin Date: Wed, 3 Nov 2021 14:32:11 +0100 Subject: [PATCH] tools: add realtek image building code Signed-off-by: John Crispin --- tools/Makefile | 1 + tools/rtk-tools/Makefile | 50 ++++ tools/rtk-tools/src/apmib.h | 77 +++++++ tools/rtk-tools/src/cvimg.c | 443 ++++++++++++++++++++++++++++++++++++ tools/rtk-tools/src/mgbin.c | 429 ++++++++++++++++++++++++++++++++++ 5 files changed, 1000 insertions(+) create mode 100644 tools/rtk-tools/Makefile create mode 100644 tools/rtk-tools/src/apmib.h create mode 100644 tools/rtk-tools/src/cvimg.c create mode 100644 tools/rtk-tools/src/mgbin.c diff --git a/tools/Makefile b/tools/Makefile index ae3cc5dfd6..a2d49967e7 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -36,6 +36,7 @@ tools-$(CONFIG_TARGET_tegra) += cbootimage cbootimage-configs tools-$(CONFIG_USES_MINOR) += kernel2minor tools-$(CONFIG_USE_SPARSE) += sparse tools-$(CONFIG_USE_LLVM_BUILD) += llvm-bpf +tools-$(CONFIG_TARGET_rtkmipsel) += rtk-tools # builddir dependencies $(curdir)/autoconf/compile := $(curdir)/m4/compile diff --git a/tools/rtk-tools/Makefile b/tools/rtk-tools/Makefile new file mode 100644 index 0000000000..a7f79c04b6 --- /dev/null +++ b/tools/rtk-tools/Makefile @@ -0,0 +1,50 @@ +# +# Copyright (C) 2006-2010 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:=rtk-tools +PKG_VERSION:=0.1 + +HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/${PKG_NAME}-$(PKG_VERSION) +HOST_CFLAGS += -DCOMPACT_FILENAME_BUFFER -DHOME_GATEWAY + +include $(INCLUDE_DIR)/host-build.mk + +define Host/Compile + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_8196C src/cvimg.c -o $(HOST_BUILD_DIR)/cvimg-rtl8196c + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_8196C src/mgbin.c -o $(HOST_BUILD_DIR)/mgbin-rtl8196c + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_8196E src/cvimg.c -o $(HOST_BUILD_DIR)/cvimg-rtl8196e + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_8196E src/mgbin.c -o $(HOST_BUILD_DIR)/mgbin-rtl8196e + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_819XD src/cvimg.c -o $(HOST_BUILD_DIR)/cvimg-rtl819xd + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_819XD src/mgbin.c -o $(HOST_BUILD_DIR)/mgbin-rtl819xd + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_819XD src/cvimg.c -o $(HOST_BUILD_DIR)/cvimg-rtl819xdt + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_819XD src/mgbin.c -o $(HOST_BUILD_DIR)/mgbin-rtl819xdt + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_819XD src/cvimg.c -o $(HOST_BUILD_DIR)/cvimg-rtl89xxd + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_819XD src/cvimg.c -o $(HOST_BUILD_DIR)/cvimg-rtl8198c + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_819XD src/cvimg.c -o $(HOST_BUILD_DIR)/cvimg-rtl8954e + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_819XD src/cvimg.c -o $(HOST_BUILD_DIR)/cvimg-rtl8197f + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_819XD src/mgbin.c -o $(HOST_BUILD_DIR)/mgbin-rtl89xxd + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_819XD src/mgbin.c -o $(HOST_BUILD_DIR)/mgbin-rtl8198c + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_819XD src/mgbin.c -o $(HOST_BUILD_DIR)/mgbin-rtl8954e + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_819XD src/mgbin.c -o $(HOST_BUILD_DIR)/mgbin-rtl8197f + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_8881A src/cvimg.c -o $(HOST_BUILD_DIR)/cvimg-rtl8881a + $(HOSTCC) $(HOST_CFLAGS) -DCONFIG_RTL_8881A src/mgbin.c -o $(HOST_BUILD_DIR)/mgbin-rtl8881a +endef + +define Host/Install + $(INSTALL_DIR) $(STAGING_DIR_HOST)/bin + $(INSTALL_BIN) $(HOST_BUILD_DIR)/cvimg* $(STAGING_DIR_HOST)/bin/ + $(INSTALL_BIN) $(HOST_BUILD_DIR)/mgbin* $(STAGING_DIR_HOST)/bin/ +endef + +define Host/Clean + rm -f $(STAGING_DIR_HOST)/bin/cvimg* + rm -f $(STAGING_DIR_HOST)/bin/mgbin* +endef + +$(eval $(call HostBuild)) diff --git a/tools/rtk-tools/src/apmib.h b/tools/rtk-tools/src/apmib.h new file mode 100644 index 0000000000..bf7257efa1 --- /dev/null +++ b/tools/rtk-tools/src/apmib.h @@ -0,0 +1,77 @@ +#ifndef __APMIB_H +#define __APMIB_H + +#ifndef WIN32 +#define __PACK__ __attribute__ ((packed)) +#else +#define __PACK__ +#endif + +#define BOOT_HEADER ((char *)"boot") + +#if defined(CONFIG_RTL_8196B) +#define ROOT_HEADER ((char *)"r6br") +#elif defined(CONFIG_RTL_8196C) || defined(CONFIG_RTL_8198) || defined(CONFIG_RTL_819XD) || defined(CONFIG_RTL_8196E) || defined(CONFIG_RTL_8881A) +#define ROOT_HEADER ((char *)"r6cr") +#else +#define ROOT_HEADER ((char *)"root") +#endif //#if defined(CONFIG_RTL_8196B) + +#if defined(CONFIG_RTL_8196B) +#if (defined(HOME_GATEWAY) && defined(VPN_SUPPORT)) +#define WEB_HEADER ((char *)"w6bv") +#elif (defined(HOME_GATEWAY)) +#define WEB_HEADER ((char *)"w6bg") +#else +#define WEB_HEADER ((char *)"w6ba") +#endif +#elif defined(CONFIG_RTL_8196C) || defined(CONFIG_RTL_8198) || defined(CONFIG_RTL_819XD) || defined(CONFIG_RTL_8196E) || defined(CONFIG_RTL_8881A) +#if (defined(HOME_GATEWAY) && defined(VPN_SUPPORT)) +#define WEB_HEADER ((char *)"w6cv") +#elif (defined(HOME_GATEWAY)) +#define WEB_HEADER ((char *)"w6cg") +#else +#define WEB_HEADER ((char *)"w6ca") +#endif +#else +#if (defined(HOME_GATEWAY) && defined(VPN_SUPPORT)) +#define WEB_HEADER ((char *)"webv") +#elif (defined(HOME_GATEWAY)) +#define WEB_HEADER ((char *)"webg") +#else +#define WEB_HEADER ((char *)"weba") +#endif +#endif //#if defined(CONFIG_RTL_8196B) + +#if defined(CONFIG_RTL_8196B) +#define FW_HEADER_WITH_ROOT ((char *)"cr6b") +#define FW_HEADER ((char *)"cs6b") +#elif defined(CONFIG_RTL_8196C) || defined(CONFIG_RTL_8198) || defined(CONFIG_RTL_819XD) || defined(CONFIG_RTL_8196E) || defined(CONFIG_RTL_8881A) +#define FW_HEADER_WITH_ROOT ((char *)"cr6c") +#define FW_HEADER ((char *)"cs6c") +#else +#define FW_HEADER_WITH_ROOT ((char *)"csro") +#define FW_HEADER ((char *)"csys") +#endif //#if defined(CONFIG_RTL_8196B) + +#define ALL_HEADER ((char *)"allp") + +#define HW_SETTING_OFFSET 0x6000 +#define DEFAULT_SETTING_OFFSET 0x8000 +#define CURRENT_SETTING_OFFSET 0xc000 + +#define DWORD_SWAP(v) ( (((v&0xff)<<24)&0xff000000) | ((((v>>8)&0xff)<<16)&0xff0000) | \ + ((((v>>16)&0xff)<<8)&0xff00) | (((v>>24)&0xff)&0xff) ) + +#define WORD_SWAP(v) ((unsigned short)(((v>>8)&0xff) | ((v<<8)&0xff00))) + +#define SIGNATURE_LEN 4 + +typedef struct img_header { + unsigned char signature[SIGNATURE_LEN]; + unsigned int startAddr; + unsigned int burnAddr; + unsigned int len; +}__PACK__ IMG_HEADER_T, *IMG_HEADER_Tp; + +#endif diff --git a/tools/rtk-tools/src/cvimg.c b/tools/rtk-tools/src/cvimg.c new file mode 100644 index 0000000000..de681d803e --- /dev/null +++ b/tools/rtk-tools/src/cvimg.c @@ -0,0 +1,443 @@ +/* + * Tool to convert ELF image to be the AP downloadable binary + * + * Authors: David Hsu + * + * $Id: cvimg.c,v 1.4 2009/06/12 07:10:44 michael Exp $ + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#undef HOME_GATEWAY +#define HOME_GATEWAY +#define RTK_4K_CHKSUM_FIX + +#include "apmib.h" + +/* 32-bit ELF base types. */ +typedef unsigned int Elf32_Addr; +typedef unsigned short Elf32_Half; +typedef unsigned int Elf32_Off; +typedef unsigned int Elf32_Word; + +#define EI_NIDENT 16 + +typedef struct elf32_hdr{ + unsigned char e_ident[EI_NIDENT]; + Elf32_Half e_type; + Elf32_Half e_machine; + Elf32_Word e_version; + Elf32_Addr e_entry; /* Entry point */ + Elf32_Off e_phoff; + Elf32_Off e_shoff; + Elf32_Word e_flags; + Elf32_Half e_ehsize; + Elf32_Half e_phentsize; + Elf32_Half e_phnum; + Elf32_Half e_shentsize; + Elf32_Half e_shnum; + Elf32_Half e_shstrndx; +} Elf32_Ehdr; + +#define DEFAULT_START_ADDR 0x80500000 +#define DEFAULT_BASE_ADDR 0x80000000 + +static unsigned short calculateChecksum(char *buf, int len); + +///////////////////////////////////////////////////////// +static unsigned int calculate_long_checksum(unsigned int *buf, int len) +{ + int i, j; + unsigned int sum=0, tmp; + + j = len/4; + + for (i=0; i input-filename output-filename start-addr burn-addr [signature]\n"); + printf("