brcm63xx: add support for Huawei HG622
[librecmc/librecmc.git] / tools / firmware-utils / src / mkbrnimg.c
index fff92c4ef660e5c5a1c17c70ed9d138835d47e4f..b7a73ff59d2b7b22c1a952ebc39b14837dd02cf0 100644 (file)
 
 static uint32_t crc32[1<<BPB];
 
+static char *output_file = "default-brnImage";
+static uint32_t magic = 0x12345678;
+static char *signature = "BRNDTW502";
+static uint32_t crc32_poly = 0x2083b8ed;
+
 static void init_crc32()
 {
-       const uint32_t poly = ntohl(0x2083b8ed);
+       const uint32_t poly = ntohl(crc32_poly);
        int n;
 
        for (n = 0; n < 1<<BPB; n++) {
@@ -61,21 +66,17 @@ static void usage(const char *) __attribute__ (( __noreturn__ ));
 static void usage(const char *mess)
 {
        fprintf(stderr, "Error: %s\n", mess);
-       fprintf(stderr, "Usage: mkbrnimg [-o output_file] [-m magic] [-s signature] kernel_file [additional files]\n");
+       fprintf(stderr, "Usage: mkbrnimg [-o output_file] [-m magic] [-s signature] [-p crc32 poly] kernel_file [additional files]\n");
        fprintf(stderr, "\n");
        exit(1);
 }
 
-static char *output_file = "default-brnImage";
-static uint32_t magic = 0x12345678;
-static char *signature = "BRNDTW502";
-
 static void parseopts(int *argc, char ***argv)
 {
        char *endptr;
        int res;
 
-       while ((res = getopt(*argc, *argv, "o:m:s:")) != -1) {
+       while ((res = getopt(*argc, *argv, "o:m:s:p:")) != -1) {
                switch (res) {
                default:
                        usage("Unknown option");
@@ -91,6 +92,11 @@ static void parseopts(int *argc, char ***argv)
                case 's':
                        signature = optarg;
                        break;
+               case 'p':
+                       crc32_poly = strtoul(optarg, &endptr, 0);
+                       if (endptr == optarg || *endptr != 0)
+                               usage("'crc32 poly' must be a decimal or hexadecimal 32-bit value");
+                       break;
                }
        }
        *argc -= optind;
@@ -136,7 +142,7 @@ static void appendfile(int outfd, char *path, int kernel) {
 
        // write padding
        padded_len = ((len + sizeof(footer) + sizeof(padding) - 1) & ~(sizeof(padding) - 1)) - sizeof(footer);
-       fprintf(stderr, "len=%08x padded_len=%08x\n", len, padded_len);
+       fprintf(stderr, "len=%08zx padded_len=%08zx\n", len, padded_len);
        write(outfd, padding, padded_len - len);
 
        // write footer