aboutsummaryrefslogtreecommitdiffstats
path: root/tools/firmware-utils/src/zytrx.c
diff options
context:
space:
mode:
authorPetr Štetiar <ynezz@true.cz>2021-07-05 11:54:26 +0200
committerRafał Miłecki <rafal@milecki.pl>2021-10-05 16:20:10 +0200
commit8cc9a74a3f6bf363645efda6db417f8dadd3d844 (patch)
tree68f1648a077df8e49328f087eccaf94c2e47d1e8 /tools/firmware-utils/src/zytrx.c
parentf82c93b93c0a021921ac7a30ba6e7a090c7ddd1c (diff)
downloadupstream-8cc9a74a3f6bf363645efda6db417f8dadd3d844.tar.gz
upstream-8cc9a74a3f6bf363645efda6db417f8dadd3d844.tar.bz2
upstream-8cc9a74a3f6bf363645efda6db417f8dadd3d844.zip
firmware-utils: update to version 2021-10-05
Includes following changes: db65821f006c cmake: fix missing install target 3a0cfc856991 Add initial GitLab CI support 8f47adea6f87 Add missing includes for byte swap operations fbafae9f8037 Convert to CMake based project Additionaly moves source code into separate Git project repository and converts the package build to utilize CMake. Signed-off-by: Petr Štetiar <ynezz@true.cz> [rmilecki: rebase, update to the latest repo git & rm -r src] Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
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;
-}