rpcd: iwinfo plugin fixes
[openwrt.git] / tools / firmware-utils / src / mkfwimage.c
index edbd8ec..d8d5239 100644 (file)
@@ -34,9 +34,6 @@
 typedef struct fw_layout_data {
        char            name[PATH_MAX];
        u_int32_t       kern_start;
-       u_int32_t       kern_len;
-       u_int32_t       root_start;
-       u_int32_t       root_len;
        u_int32_t       kern_entry;
        u_int32_t       firmware_max_length;
 } fw_layout_t;
@@ -45,29 +42,50 @@ fw_layout_t fw_layout_data[] = {
        {
                .name           =       "XS2",
                .kern_start     =       0xbfc30000,
-               .kern_len       =       0x00140000,
-               .root_start     =       0xbfc30000 + 0x00140000,
-               .root_len       =       0x002C0000,
                .kern_entry     =       0x80041000,
                .firmware_max_length=   0x00390000,
        },
        {
                .name           =       "XS5",
                .kern_start     =       0xbe030000,
-               .kern_len       =       0x00140000,
-               .root_start     =       0xbe030000 + 0x00140000,
-               .root_len       =       0x002C0000,
                .kern_entry     =       0x80041000,
                .firmware_max_length=   0x00390000,
        },
        {
                .name           =       "RS",
-               .kern_start     =       0x00000000,
-               .kern_len       =       0x00140000,
-               .root_start     =       0x00000000,
-               .root_len       =       0x002C0000,
+               .kern_start     =       0xbf030000,
                .kern_entry     =       0x80060000,
-               .firmware_max_length=   0x00140000 + 0x002C0000,
+               .firmware_max_length=   0x00B00000,
+       },
+       {
+               .name           =       "RSPRO",
+               .kern_start     =       0xbf030000,
+               .kern_entry     =       0x80060000,
+               .firmware_max_length=   0x00F00000,
+       },
+       {
+               .name           =       "LS-SR71",
+               .kern_start     =       0xbf030000,
+               .kern_entry     =       0x80060000,
+               .firmware_max_length=   0x00640000,
+       },
+       {
+               .name           =       "XS2-8",
+               .kern_start     =       0xa8030000,
+               .kern_entry     =       0x80041000,
+               .firmware_max_length=   0x006C0000,
+       },
+       {
+               .name           =       "XM",
+               .kern_start     =       0x9f050000,
+               .kern_entry     =       0x80002000,
+               .firmware_max_length=   0x00760000,
+       },
+       {
+               .name           =       "UBDEV01",
+               .kern_start     =       0x9f050000,
+               .kern_entry     =       0x80002000,
+               .firmware_max_length=   0x006A0000,
        },
        {       .name           =       "",
        },
@@ -90,23 +108,22 @@ typedef struct part_data {
 #define DEFAULT_OUTPUT_FILE    "firmware-image.bin"
 #define DEFAULT_VERSION                "UNKNOWN"
 
-#define OPTIONS "B:hv:o:r:k:"
-
-static int debug = 0;
+#define OPTIONS "B:hv:m:o:r:k:"
 
 typedef struct image_info {
+       char magic[16];
        char version[256];
        char outputfile[PATH_MAX];
        u_int32_t       part_count;
        part_data_t parts[MAX_SECTIONS];
 } image_info_t;
 
-static void write_header(void* mem, const char* version)
+static void write_header(void* mem, const char *magic, const char* version)
 {
        header_t* header = mem;
        memset(header, 0, sizeof(header_t));
 
-       memcpy(header->magic, MAGIC_HEADER, MAGIC_LENGTH);
+       memcpy(header->magic, magic, MAGIC_LENGTH);
        strncpy(header->version, version, sizeof(header->version));
        header->crc = htonl(crc32(0L, (unsigned char *)header,
                                sizeof(header_t) - 2 * sizeof(u_int32_t)));
@@ -171,11 +188,12 @@ static void usage(const char* progname)
              "Usage: %s [options]\n"
             "\t-v <version string>\t - firmware version information, default: %s\n"
             "\t-o <output file>\t - firmware output file, default: %s\n"
+            "\t-m <magic>\t - firmware magic, default: %s\n"
             "\t-k <kernel file>\t\t - kernel file\n"
             "\t-r <rootfs file>\t\t - rootfs file\n"
-            "\t-B <board name>\t\t - choose firmware layout for specified board (XS2, XS5, RS)\n"
+            "\t-B <board name>\t\t - choose firmware layout for specified board (XS2, XS5, RS, XM)\n"
             "\t-h\t\t\t - this help\n", VERSION,
-            progname, DEFAULT_VERSION, DEFAULT_OUTPUT_FILE);
+            progname, DEFAULT_VERSION, DEFAULT_OUTPUT_FILE, MAGIC_HEADER);
 }
 
 static void print_image_info(const image_info_t* im)
@@ -222,9 +240,9 @@ static int create_image_layout(const char* kernelfile, const char* rootfsfile, c
        fw_layout_t* p;
 
        p = &fw_layout_data[0];
-       while ((strlen(p->name) != 0) && (strncmp(p->name, board_name, sizeof(board_name)) != 0))
+       while (*p->name && (strcmp(p->name, board_name) != 0))
                p++;
-       if (p->name == NULL) {
+       if (!*p->name) {
                printf("BUG! Unable to find default fw layout!\n");
                exit(-1);
        }
@@ -233,7 +251,7 @@ static int create_image_layout(const char* kernelfile, const char* rootfsfile, c
        strcpy(kernel->partition_name, "kernel");
        kernel->partition_index = 1;
        kernel->partition_baseaddr = p->kern_start;
-       if ( (kernel->partition_length = filelength(kernelfile)) < 0) return (-1);
+       if ( (kernel->partition_length = filelength(kernelfile)) == (u_int32_t)-1) return (-1);
        kernel->partition_memaddr = p->kern_entry;
        kernel->partition_entryaddr = p->kern_entry;
        strncpy(kernel->filename, kernelfile, sizeof(kernel->filename));
@@ -249,8 +267,8 @@ static int create_image_layout(const char* kernelfile, const char* rootfsfile, c
        rootfs->partition_entryaddr = 0x00000000;
        strncpy(rootfs->filename, rootfsfile, sizeof(rootfs->filename));
 
-printf("kernel: %d 0x%08x\n", kernel->partition_length, kernel->partition_baseaddr);
-printf("root: %d 0x%08x\n", rootfs->partition_length, rootfs->partition_baseaddr);
+       printf("kernel: %d 0x%08x\n", kernel->partition_length, kernel->partition_baseaddr);
+       printf("root: %d 0x%08x\n", rootfs->partition_length, rootfs->partition_baseaddr);
        im->part_count = 2;
 
        return 0;
@@ -327,7 +345,7 @@ static int build_image(image_info_t* im)
        }
 
        // write header
-       write_header(mem, im->version);
+       write_header(mem, im->magic, im->version);
        ptr = mem + sizeof(header_t);
        // write all parts
        for (i = 0; i < im->part_count; ++i)
@@ -378,6 +396,7 @@ int main(int argc, char* argv[])
 
        strcpy(im.outputfile, DEFAULT_OUTPUT_FILE);
        strcpy(im.version, DEFAULT_VERSION);
+       strncpy(im.magic, MAGIC_HEADER, sizeof(im.magic));
 
        while ((o = getopt(argc, argv, OPTIONS)) != -1)
        {
@@ -390,6 +409,10 @@ int main(int argc, char* argv[])
                        if (optarg)
                                strncpy(im.outputfile, optarg, sizeof(im.outputfile));
                        break;
+               case 'm':
+                       if (optarg)
+                               strncpy(im.magic, optarg, sizeof(im.magic));
+                       break;
                case 'h':
                        usage(argv[0]);
                        return -1;