aboutsummaryrefslogtreecommitdiffstats
path: root/tools/firmware-utils/src/zytrx.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/firmware-utils/src/zytrx.c')
-rw-r--r--tools/firmware-utils/src/zytrx.c224
1 files changed, 0 insertions, 224 deletions
diff --git a/tools/firmware-utils/src/zytrx.c b/tools/firmware-utils/src/zytrx.c
deleted file mode 100644
index 8c113d6d79..0000000000
--- a/tools/firmware-utils/src/zytrx.c
+++ /dev/null
@@ -1,224 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * zytrx - add header to images for ZyXEL NR7101
- *
- * Based on add_header.c - partially based on OpenWrt's
- * motorola-bin.c
- *
- * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
- * Gabor Juhos <juhosg@openwrt.org>
- * Copyright (C) 2021 Bjørn Mork <bjorn@mork.no>
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <unistd.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <string.h>
-#include <netinet/in.h>
-#include <inttypes.h>
-
-#define BPB 8 /* bits/byte */
-
-static uint32_t crc32[1<<BPB];
-
-static void init_crc32(void)
-{
- const uint32_t poly = ntohl(0x2083b8ed);
- int n;
-
- for (n = 0; n < 1<<BPB; n++) {
- uint32_t crc = n;
- int bit;
-
- for (bit = 0; bit < BPB; bit++)
- crc = (crc & 1) ? (poly ^ (crc >> 1)) : (crc >> 1);
- crc32[n] = crc;
- }
-}
-
-static uint32_t crc32buf(const unsigned char *buf, size_t len)
-{
- uint32_t crc = 0xFFFFFFFF;
-
- for (; len; len--, buf++)
- crc = crc32[(uint8_t)crc ^ *buf] ^ (crc >> BPB);
- return ~crc;
-}
-
-/* HDR0 reversed, to be stored as BE */
-#define MAGIC 0x30524448 /* HDR0 reversed, to be stored as BE */
-
-/* All numbers are stored as BE */
-struct zytrx_t {
- uint32_t magic;
- uint32_t len_h; /* Length of this header */
- uint32_t len_t; /* Total length of file */
- uint32_t crc32_p; /* Bit inverted 32-bit CRC of image payload */
- uint8_t verInt[32]; /* String "5.0.0.0\n" zero padded */
- uint8_t verExt[32]; /* String "\n" zero padded */
- uint32_t len_p; /* Length of image payload */
- uint8_t pad1[12]; /* zero padding(?) */
- uint8_t code[164]; /* string "3 6035 122 0\n" zero padded */
- uint8_t chipid[8]; /* string "MT7621A" zero padded */
- uint8_t boardid[16]; /* string "NR7101" zero padded */
- uint32_t modelid; /* modelid as 4 BCD digits: 0x07010001 */
- uint8_t pad2[8]; /* zero padding(?) */
- uint8_t swVersionInt[32]; /* ZyXEL version string: "1.00(ABUV.0)D0" zero padded */
- uint8_t swVersionExt[32]; /* identical to swVersionInt */
- uint8_t pad4[4]; /* zero padding(?) */
- uint32_t kernelChksum; /* no idea how this is computed - reported but not validated */
- uint8_t pad5[4]; /* zero padding(?) */
- uint32_t crc32_h; /* Bit inverted 32-bit CRC of this header payload */
- uint8_t pad6[4]; /* zero padding(?) */
-};
-
-/* static?() field values of unknown meaning - maybe ove to board
- * table when we know the significance
- */
-#define VER_INT "5.0.0.0\n"
-#define VER_EXT "\n"
-#define CODE "3 6035 122 0\n"
-#define KERNELCHKSUM 0x12345678
-
-/* table of supported devices using this header format */
-static struct board_t {
- uint8_t chipid[8];
- uint8_t boardid[16];
- uint32_t modelid;
-} boards[] = {
- { "MT7621A", "NR7101", 0x07010001 },
- {}
-};
-
-static int find_board(struct zytrx_t *h, char *board)
-{
- struct board_t *p;
-
- for (p = boards; p->modelid; p++) {
- if (strncmp((const char *)p->boardid, board, sizeof(p->boardid)))
- continue;
- memcpy(h->chipid, p->chipid, sizeof(h->chipid));
- memcpy(h->boardid, p->boardid, sizeof(h->boardid));
- h->modelid = htonl(p->modelid);
- return 0;
- }
- return -1;
-}
-
-static void usage(const char *name)
-{
- struct board_t *p;
-
- fprintf(stderr, "Usage:\n");
- fprintf(stderr, " %s -B <board> -v <versionstr> -i <file> [-o <outputfile>]\n\n", name);
- fprintf(stderr, "Supported <board> values:\n");
- for (p = boards; p->modelid; p++)
- fprintf(stderr, "\t%-12s\n", p->boardid);
- fprintf(stderr, "\nExample:\n");
- fprintf(stderr, " %s -B %s -v foobar-1.0 -i my.img -o out.img\n\n", name,
- boards[0].boardid);
- exit(EXIT_FAILURE);
-}
-
-static void errexit(const char *msg)
-{
- fprintf(stderr, "ERR: %s: %s\n", msg, errno ? strerror(errno) : "unknown");
- exit(EXIT_FAILURE);
-}
-
-static void *map_input(const char *name, size_t *len)
-{
- struct stat stat;
- void *mapped;
- int fd;
-
- fd = open(name, O_RDONLY);
- if (fd < 0)
- return NULL;
- if (fstat(fd, &stat) < 0) {
- close(fd);
- return NULL;
- }
- *len = stat.st_size;
- mapped = mmap(NULL, stat.st_size, PROT_READ, MAP_SHARED, fd, 0);
- if (close(fd) < 0) {
- (void) munmap(mapped, stat.st_size);
- return NULL;
- }
- return mapped;
-}
-
-int main(int argc, char **argv)
-{
- int c, fdout = STDOUT_FILENO;
- void *input_file = NULL;
- size_t file_len, len;
- uint32_t crc;
- struct zytrx_t h = {
- .magic = htonl(MAGIC),
- .len_h = htonl(sizeof(h)),
- .verInt = VER_INT,
- .verExt = VER_EXT,
- .code = CODE,
- .kernelChksum = htonl(KERNELCHKSUM),
- };
-
- while ((c = getopt(argc, argv, "B:v:i:o:")) != -1) {
- switch (c) {
- case 'B':
- if (find_board(&h, optarg) < 0)
- errexit("unsupported board");
- break;
- case 'v':
- len = strlen(optarg);
- if (len > sizeof(h.swVersionInt))
- errexit("version string too long");
- memcpy(h.swVersionInt, optarg, len);
- memcpy(h.swVersionExt, optarg, len);
- break;
- case 'i':
- input_file = map_input(optarg, &file_len);
- if (!input_file)
- errexit(optarg);
- break;
- case 'o':
- fdout = open(optarg, O_WRONLY | O_CREAT, 0644);
- if (fdout < 0)
- errexit(optarg);
- break;
- default:
- usage(argv[0]);
- }
- }
-
- /* required paremeters */
- if (!input_file || !h.modelid || !h.swVersionInt[0])
- usage(argv[0]);
-
- /* length fields */
- h.len_t = htonl(sizeof(h) + file_len);
- h.len_p = htonl(file_len);
-
- /* crc fields */
- init_crc32();
- crc = crc32buf(input_file, file_len);
- h.crc32_p = htonl(~crc);
- crc = crc32buf((unsigned char *)&h, sizeof(h));
- h.crc32_h = htonl(~crc);
-
- /* dump new image */
- write(fdout, &h, sizeof(h));
- write(fdout, input_file, file_len);
-
- /* close files */
- munmap(input_file, file_len);
- if (fdout != STDOUT_FILENO)
- close(fdout);
-
- return EXIT_SUCCESS;
-}