aboutsummaryrefslogtreecommitdiffstats
path: root/tools/firmware-utils/src/mksercommfw.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/mksercommfw.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/mksercommfw.c')
-rw-r--r--tools/firmware-utils/src/mksercommfw.c262
1 files changed, 0 insertions, 262 deletions
diff --git a/tools/firmware-utils/src/mksercommfw.c b/tools/firmware-utils/src/mksercommfw.c
deleted file mode 100644
index 5fa323f2d5..0000000000
--- a/tools/firmware-utils/src/mksercommfw.c
+++ /dev/null
@@ -1,262 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <byteswap.h>
-#include <endian.h>
-#include <getopt.h>
-
-#if !defined(__BYTE_ORDER)
-#error "Unknown byte order"
-#endif
-
-#if __BYTE_ORDER == __BIG_ENDIAN
-#define cpu_to_be32(x) (x)
-#elif __BYTE_ORDER == __LITTLE_ENDIAN
-#define cpu_to_be32(x) bswap_32(x)
-#else
-#error "Unsupported endianness"
-#endif
-
-/* #define DEBUG 1 */
-
-#ifdef DEBUG
-#define DBG(...) {printf(__VA_ARGS__); }
-#else
-#define DBG(...) {}
-#endif
-
-#define ERR(...) {printf(__VA_ARGS__); }
-
-/*
- * Fw Header Layout for Netgear / Sercomm devices (bytes)
- *
- * Size : 512 bytes + zipped image size
- *
- * Locations:
- * magic : 0-6 ASCII
- * version: 7-11 fixed
- * hwID : 11-44 ASCII
- * hwVer : 45-54 ASCII
- * swVer : 55-62 uint32_t in BE
- * magic : 63-69 ASCII
- * ChkSum : 511 Inverse value of the full image checksum while this location is 0x00
- */
-static const char* magic = "sErCoMm"; /* 7 */
-static const unsigned char version[4] = { 0x00, 0x01, 0x00, 0x00 };
-static const int header_sz = 512;
-static const int footer_sz = 71;
-
-static int is_header = 1;
-
-struct file_info {
- char* file_name; /* name of the file */
- char* file_data; /* data of the file in memory */
- u_int32_t file_size; /* length of the file */
-};
-
-static u_int8_t getCheckSum(char* data, int len) {
- u_int8_t new = 0;
- int i;
-
- if (!data) {
- ERR("Invalid pointer provided!\n");
- return 0;
- }
-
- for (i = 0; i < len; i++) {
- new += data[i];
- }
-
- return new;
-}
-
-/*
- * read file into buffer
- * add space for header/footer
- */
-static int copyToOutputBuf(struct file_info* finfo) {
- FILE* fp = NULL;
-
- int file_sz = 0;
- int extra_sz;
- int hdr_pos;
- int img_pos;
-
- if (!finfo || !finfo->file_name) {
- ERR("Invalid pointer provided!\n");
- return -1;
- }
-
- DBG("Opening file: %s\n", finfo->file_name);
-
- if (!(fp = fopen(finfo->file_name, "rb"))) {
- ERR("Error opening file: %s\n", finfo->file_name);
- return -1;
- }
-
- /* Get filesize */
- rewind(fp);
- fseek(fp, 0L, SEEK_END);
- file_sz = ftell(fp);
- rewind(fp);
-
- if (file_sz < 1) {
- ERR("Error getting filesize: %s\n", finfo->file_name);
- fclose(fp);
- return -1;
- }
-
- if (is_header) {
- extra_sz = header_sz;
- hdr_pos = 0;
- img_pos = header_sz;
- } else {
- extra_sz = footer_sz;
- hdr_pos = file_sz;
- img_pos = 0;
- }
-
- DBG("Filesize: %i\n", file_sz);
- finfo->file_size = file_sz + extra_sz;
-
- if (!(finfo->file_data = malloc(finfo->file_size))) {
- ERR("Out of memory!\n");
- fclose(fp);
- return -1;
- }
-
- /* init header/footer bytes */
- memset(finfo->file_data + hdr_pos, 0, extra_sz);
-
- /* read file and take care of leading header if exists */
- if (fread(finfo->file_data + img_pos, 1, file_sz, fp) != file_sz) {
- ERR("Error reading file %s\n", finfo->file_name);
- fclose(fp);
- return -1;
- }
-
- DBG("File: read successful\n");
- fclose(fp);
-
- return hdr_pos;
-}
-
-static int writeFile(struct file_info* finfo) {
- FILE* fp;
-
- if (!finfo || !finfo->file_name) {
- ERR("Invalid pointer provided!\n");
- return -1;
- }
-
- DBG("Opening file: %s\n", finfo->file_name);
-
- if (!(fp = fopen(finfo->file_name, "w"))) {
- ERR("Error opening file: %s\n", finfo->file_name);
- return -1;
- }
-
- DBG("Writing file: %s\n", finfo->file_name);
-
- if (fwrite(finfo->file_data, 1, finfo->file_size, fp) != finfo->file_size) {
- ERR("Wanted to write, but something went wrong!\n");
- fclose(fp);
- return -1;
- }
-
- fclose(fp);
- return 0;
-}
-
-static void usage(char* argv[]) {
- printf("Usage: %s [OPTIONS...]\n"
- "\n"
- "Options:\n"
- " -f add sercom footer (if absent, header)\n"
- " -b <hwid> use hardware id specified with <hwid> (ASCII)\n"
- " -r <hwrev> use hardware revision specified with <hwrev> (ASCII)\n"
- " -v <version> set image version to <version> (decimal, hex or octal notation)\n"
- " -i <file> input file\n"
- , argv[0]);
-}
-
-int main(int argc, char* argv[]) {
- struct file_info image = { 0 };
-
- char* hwID = NULL;
- char* hwVer = NULL;
- u_int32_t swVer = 0;
- u_int8_t chkSum;
- int hdr_offset;
-
- while ( 1 ) {
- int c;
-
- c = getopt(argc, argv, "b:i:r:v:f");
- if (c == -1)
- break;
-
- switch (c) {
- case 'b':
- hwID = optarg;
- break;
- case 'f':
- is_header = 0;
- break;
- case 'i':
- image.file_name = optarg;
- break;
- case 'r':
- hwVer = optarg;
- break;
- case 'v':
- swVer = (u_int32_t) strtol(optarg, NULL, 0);
- swVer = cpu_to_be32(swVer);
- break;
- default:
- usage(argv);
- return EXIT_FAILURE;
- }
- }
-
- if (!hwID || !hwVer || !image.file_name) {
- usage(argv);
- return EXIT_FAILURE;
- }
-
- /*
- * copy input to buffer, add extra space for header/footer and return
- * header position
- */
- hdr_offset = copyToOutputBuf(&image);
- if (hdr_offset < 0)
- return EXIT_FAILURE;
-
- DBG("Filling header: %s %s %2X %s\n", hwID, hwVer, swVer, magic);
-
- strncpy(image.file_data + hdr_offset + 0, magic, 7);
- memcpy(image.file_data + hdr_offset + 7, version, sizeof(version));
- strncpy(image.file_data + hdr_offset + 11, hwID, 34);
- strncpy(image.file_data + hdr_offset + 45, hwVer, 10);
- memcpy(image.file_data + hdr_offset + 55, &swVer, sizeof(swVer));
- strncpy(image.file_data + hdr_offset + 63, magic, 7);
-
- /* calculate checksum and invert checksum */
- if (is_header) {
- chkSum = getCheckSum(image.file_data, image.file_size);
- chkSum = (chkSum ^ 0xFF) + 1;
- DBG("Checksum for Image: %hhX\n", chkSum);
-
- /* write checksum to header */
- image.file_data[511] = (char) chkSum;
- }
-
- /* overwrite input file */
- if (writeFile(&image))
- return EXIT_FAILURE;
-
- return EXIT_SUCCESS;
-}