tools/firmware-utils: fix sysupgrade typo in mkdapimg2
This commit is contained in:
parent
fb63c7b784
commit
8f0c8d550b
3
tools/firmware-utils/Makefile
Executable file → Normal file
3
tools/firmware-utils/Makefile
Executable file → Normal file
@ -70,8 +70,8 @@ define Host/Compile
|
||||
$(call cc,fix-u-media-header cyg_crc32,-Wall)
|
||||
$(call cc,hcsmakeimage bcmalgo)
|
||||
$(call cc,mkporayfw, -Wall)
|
||||
$(call cc,mkrasimage, --std=gnu99)
|
||||
$(call cc,mkhilinkfw, -lcrypto)
|
||||
$(call cc,mkdcs932, -Wall)
|
||||
$(call cc,mkheader_gemtek,-lz)
|
||||
$(call cc,mkrtn56uimg, -lz)
|
||||
$(call cc,dgn3500sum, -Wall)
|
||||
@ -84,7 +84,6 @@ define Host/Compile
|
||||
$(call cc,mkdhpimg buffalo-lib, -Wall)
|
||||
$(call cc,mkdlinkfw mkdlinkfw-lib, -lz -Wall --std=gnu99)
|
||||
$(call cc,dns313-header, -Wall)
|
||||
$(call cc,mksercommfw, -Wall --std=gnu99)
|
||||
endef
|
||||
|
||||
define Host/Install
|
||||
|
||||
0
tools/firmware-utils/src/add_header.c
Executable file → Normal file
0
tools/firmware-utils/src/add_header.c
Executable file → Normal file
0
tools/firmware-utils/src/addpattern.c
Executable file → Normal file
0
tools/firmware-utils/src/addpattern.c
Executable file → Normal file
0
tools/firmware-utils/src/asustrx.c
Executable file → Normal file
0
tools/firmware-utils/src/asustrx.c
Executable file → Normal file
0
tools/firmware-utils/src/bcm_tag.h
Executable file → Normal file
0
tools/firmware-utils/src/bcm_tag.h
Executable file → Normal file
0
tools/firmware-utils/src/bcmalgo.c
Executable file → Normal file
0
tools/firmware-utils/src/bcmalgo.c
Executable file → Normal file
0
tools/firmware-utils/src/bcmalgo.h
Executable file → Normal file
0
tools/firmware-utils/src/bcmalgo.h
Executable file → Normal file
0
tools/firmware-utils/src/buffalo-enc.c
Executable file → Normal file
0
tools/firmware-utils/src/buffalo-enc.c
Executable file → Normal file
0
tools/firmware-utils/src/buffalo-lib.c
Executable file → Normal file
0
tools/firmware-utils/src/buffalo-lib.c
Executable file → Normal file
0
tools/firmware-utils/src/buffalo-lib.h
Executable file → Normal file
0
tools/firmware-utils/src/buffalo-lib.h
Executable file → Normal file
0
tools/firmware-utils/src/buffalo-tag.c
Executable file → Normal file
0
tools/firmware-utils/src/buffalo-tag.c
Executable file → Normal file
0
tools/firmware-utils/src/buffalo-tftp.c
Executable file → Normal file
0
tools/firmware-utils/src/buffalo-tftp.c
Executable file → Normal file
0
tools/firmware-utils/src/csysimg.h
Executable file → Normal file
0
tools/firmware-utils/src/csysimg.h
Executable file → Normal file
0
tools/firmware-utils/src/cyg_crc.h
Executable file → Normal file
0
tools/firmware-utils/src/cyg_crc.h
Executable file → Normal file
0
tools/firmware-utils/src/cyg_crc16.c
Executable file → Normal file
0
tools/firmware-utils/src/cyg_crc16.c
Executable file → Normal file
0
tools/firmware-utils/src/cyg_crc32.c
Executable file → Normal file
0
tools/firmware-utils/src/cyg_crc32.c
Executable file → Normal file
0
tools/firmware-utils/src/dgfirmware.c
Executable file → Normal file
0
tools/firmware-utils/src/dgfirmware.c
Executable file → Normal file
0
tools/firmware-utils/src/dgn3500sum.c
Executable file → Normal file
0
tools/firmware-utils/src/dgn3500sum.c
Executable file → Normal file
0
tools/firmware-utils/src/dns313-header.c
Executable file → Normal file
0
tools/firmware-utils/src/dns313-header.c
Executable file → Normal file
0
tools/firmware-utils/src/edimax_fw_header.c
Executable file → Normal file
0
tools/firmware-utils/src/edimax_fw_header.c
Executable file → Normal file
0
tools/firmware-utils/src/encode_crc.c
Executable file → Normal file
0
tools/firmware-utils/src/encode_crc.c
Executable file → Normal file
0
tools/firmware-utils/src/fix-u-media-header.c
Executable file → Normal file
0
tools/firmware-utils/src/fix-u-media-header.c
Executable file → Normal file
8
tools/firmware-utils/src/fw.h
Executable file → Normal file
8
tools/firmware-utils/src/fw.h
Executable file → Normal file
@ -24,7 +24,6 @@
|
||||
#define MAGIC_HEADER "OPEN"
|
||||
#define MAGIC_PART "PART"
|
||||
#define MAGIC_END "END."
|
||||
#define MAGIC_ENDS "ENDS"
|
||||
|
||||
#define MAGIC_LENGTH 4
|
||||
|
||||
@ -58,13 +57,6 @@ typedef struct signature {
|
||||
u_int32_t pad;
|
||||
} __attribute__ ((packed)) signature_t;
|
||||
|
||||
typedef struct signature_rsa {
|
||||
char magic[MAGIC_LENGTH];
|
||||
// u_int32_t crc;
|
||||
unsigned char rsa_signature[256];
|
||||
u_int32_t pad;
|
||||
} __attribute__ ((packed)) signature_rsa_t;
|
||||
|
||||
#define VERSION "1.2"
|
||||
|
||||
#define INFO(...) fprintf(stdout, __VA_ARGS__)
|
||||
|
||||
0
tools/firmware-utils/src/hcsmakeimage.c
Executable file → Normal file
0
tools/firmware-utils/src/hcsmakeimage.c
Executable file → Normal file
0
tools/firmware-utils/src/imagetag.c
Executable file → Normal file
0
tools/firmware-utils/src/imagetag.c
Executable file → Normal file
0
tools/firmware-utils/src/imagetag.ggo
Executable file → Normal file
0
tools/firmware-utils/src/imagetag.ggo
Executable file → Normal file
0
tools/firmware-utils/src/imagetag_cmdline.c
Executable file → Normal file
0
tools/firmware-utils/src/imagetag_cmdline.c
Executable file → Normal file
0
tools/firmware-utils/src/imagetag_cmdline.h
Executable file → Normal file
0
tools/firmware-utils/src/imagetag_cmdline.h
Executable file → Normal file
0
tools/firmware-utils/src/jcgimage.c
Executable file → Normal file
0
tools/firmware-utils/src/jcgimage.c
Executable file → Normal file
0
tools/firmware-utils/src/lzma2eva.c
Executable file → Normal file
0
tools/firmware-utils/src/lzma2eva.c
Executable file → Normal file
0
tools/firmware-utils/src/makeamitbin.c
Executable file → Normal file
0
tools/firmware-utils/src/makeamitbin.c
Executable file → Normal file
0
tools/firmware-utils/src/md5.c
Executable file → Normal file
0
tools/firmware-utils/src/md5.c
Executable file → Normal file
0
tools/firmware-utils/src/md5.h
Executable file → Normal file
0
tools/firmware-utils/src/md5.h
Executable file → Normal file
0
tools/firmware-utils/src/mkbrncmdline.c
Executable file → Normal file
0
tools/firmware-utils/src/mkbrncmdline.c
Executable file → Normal file
0
tools/firmware-utils/src/mkbrnimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mkbrnimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mkbuffaloimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mkbuffaloimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mkcameofw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkcameofw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkcasfw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkcasfw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkchkimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mkchkimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mkcsysimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mkcsysimg.c
Executable file → Normal file
2
tools/firmware-utils/src/mkdapimg.c
Executable file → Normal file
2
tools/firmware-utils/src/mkdapimg.c
Executable file → Normal file
@ -12,7 +12,7 @@
|
||||
|
||||
// Usage: mkdapimg [-p] [-m <model>] -s <sig> -i <input> -o <output>
|
||||
//
|
||||
// e.g.: mkdapimg -s RT3052-AP-DAP1350-3 -i sysupgarde.bin -o factory.bin
|
||||
// e.g.: mkdapimg -s RT3052-AP-DAP1350-3 -i sysupgrade.bin -o factory.bin
|
||||
//
|
||||
// If the model string <model> is not given, we will assume that
|
||||
// the leading characters upto the first "-" is the model.
|
||||
|
||||
2
tools/firmware-utils/src/mkdapimg2.c
Executable file → Normal file
2
tools/firmware-utils/src/mkdapimg2.c
Executable file → Normal file
@ -48,7 +48,7 @@
|
||||
// 0x000000120000-0x000000040000 = 0xE0000 -> 917504
|
||||
//
|
||||
// e.g.: mkdapimg2 -s HONEYBEE-FIRMWARE-DAP-1330 -v 1.00.21 -r Default
|
||||
// -k 917504 -i sysupgarde.bin -o factory.bin
|
||||
// -k 917504 -i sysupgrade.bin -o factory.bin
|
||||
//
|
||||
//
|
||||
// The img_hdr_struct was taken from the D-Link SDK:
|
||||
|
||||
39
tools/firmware-utils/src/mkdcs932.c
Normal file
39
tools/firmware-utils/src/mkdcs932.c
Normal file
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License,
|
||||
* version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* (C) John Crispin <blogic@openwrt.org>
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
uint32_t t = 0, sum = 0x55aa55aa;
|
||||
int fd;
|
||||
|
||||
if ((argc != 2) || ((fd = open(argv[1], O_RDWR)) == -1)) {
|
||||
fprintf(stderr, "Usage: %s input_file\n", *argv);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
lseek(fd, -4, SEEK_END);
|
||||
write(fd, &t, 4);
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
|
||||
while (read(fd, &t, 4) > 0)
|
||||
sum -= t;
|
||||
|
||||
lseek(fd, -4, SEEK_END);
|
||||
write(fd, &sum, 4);
|
||||
close(fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
0
tools/firmware-utils/src/mkdhpimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mkdhpimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mkdlinkfw-lib.c
Executable file → Normal file
0
tools/firmware-utils/src/mkdlinkfw-lib.c
Executable file → Normal file
0
tools/firmware-utils/src/mkdlinkfw-lib.h
Executable file → Normal file
0
tools/firmware-utils/src/mkdlinkfw-lib.h
Executable file → Normal file
0
tools/firmware-utils/src/mkdlinkfw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkdlinkfw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkdniimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mkdniimg.c
Executable file → Normal file
43
tools/firmware-utils/src/mkedimaximg.c
Executable file → Normal file
43
tools/firmware-utils/src/mkedimaximg.c
Executable file → Normal file
@ -17,19 +17,12 @@
|
||||
#include <sys/stat.h>
|
||||
#include <endian.h> /* for __BYTE_ORDER */
|
||||
|
||||
#define FALSE 0
|
||||
#define TRUE 1
|
||||
|
||||
#if (__BYTE_ORDER == __LITTLE_ENDIAN)
|
||||
# define HOST_TO_LE16(x) (x)
|
||||
# define HOST_TO_LE32(x) (x)
|
||||
# define HOST_TO_BE16(x) bswap_16(x)
|
||||
# define HOST_TO_BE32(x) bswap_32(x)
|
||||
#else
|
||||
# define HOST_TO_LE16(x) bswap_16(x)
|
||||
# define HOST_TO_LE32(x) bswap_32(x)
|
||||
# define HOST_TO_BE16(x) (x)
|
||||
# define HOST_TO_BE32(x) (x)
|
||||
#endif
|
||||
|
||||
struct header
|
||||
@ -54,7 +47,6 @@ struct buf
|
||||
};
|
||||
|
||||
static char *progname;
|
||||
static int force_be = FALSE;
|
||||
|
||||
static void usage(int status)
|
||||
{
|
||||
@ -69,8 +61,7 @@ static void usage(int status)
|
||||
" -i <file> read input from file <file>\n"
|
||||
" -o <file> write output to file <file>\n"
|
||||
" -f <flash> set flash address to <flash>\n"
|
||||
" -S <start> set start address to <start>\n"
|
||||
" -b big-endianness mode\n");
|
||||
" -S <start> set start address to <start>\n");
|
||||
|
||||
exit(status);
|
||||
}
|
||||
@ -92,12 +83,8 @@ static unsigned short fwcsum (struct buf *buf) {
|
||||
int i;
|
||||
unsigned short ret = 0;
|
||||
|
||||
for (i = 0; i < buf->size / 2; i++) {
|
||||
if (force_be == FALSE)
|
||||
ret -= ((unsigned short *) buf->start)[i];
|
||||
else
|
||||
ret -= HOST_TO_BE16(((unsigned short *) buf->start)[i]);
|
||||
}
|
||||
for (i = 0; i < buf->size / 2; i++)
|
||||
ret -= ((unsigned short *) buf->start)[i];
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -157,7 +144,7 @@ int main(int argc, char **argv)
|
||||
header.flash = header.size = header.start = 0;
|
||||
progname = basename(argv[0]);
|
||||
|
||||
while((c = getopt(argc, argv, "i:o:m:s:f:S:h:b")) != -1) {
|
||||
while((c = getopt(argc, argv, "i:o:m:s:f:S:h")) != -1) {
|
||||
switch (c) {
|
||||
case 'i':
|
||||
ifinfo.name = optarg;
|
||||
@ -194,9 +181,6 @@ int main(int argc, char **argv)
|
||||
usage(EXIT_FAILURE);
|
||||
}
|
||||
break;
|
||||
case 'b':
|
||||
force_be = TRUE;
|
||||
break;
|
||||
default:
|
||||
usage(EXIT_FAILURE);
|
||||
break;
|
||||
@ -257,23 +241,12 @@ int main(int argc, char **argv)
|
||||
if (fwread(&ifinfo, &ibuf))
|
||||
usage(EXIT_FAILURE);
|
||||
|
||||
if (force_be == FALSE) {
|
||||
header.flash = HOST_TO_LE32(header.flash);
|
||||
header.size = HOST_TO_LE32(obuf.size - sizeof(struct header));
|
||||
header.start = HOST_TO_LE32(header.start);
|
||||
} else {
|
||||
header.flash = HOST_TO_BE32(header.flash);
|
||||
header.size = HOST_TO_BE32(obuf.size - sizeof(struct header));
|
||||
header.start = HOST_TO_BE32(header.start);
|
||||
}
|
||||
|
||||
header.flash = HOST_TO_LE32(header.flash);
|
||||
header.size = HOST_TO_LE32(obuf.size - sizeof(struct header));
|
||||
header.start = HOST_TO_LE32(header.start);
|
||||
memcpy (obuf.start, &header, sizeof(struct header));
|
||||
|
||||
if (force_be == FALSE)
|
||||
csum = HOST_TO_LE16(fwcsum(&ibuf));
|
||||
else
|
||||
csum = HOST_TO_BE16(fwcsum(&ibuf));
|
||||
|
||||
csum = HOST_TO_LE16(fwcsum(&ibuf));
|
||||
memcpy(obuf.start + obuf.size - sizeof(unsigned short),
|
||||
&csum, sizeof(unsigned short));
|
||||
|
||||
|
||||
168
tools/firmware-utils/src/mkfwimage.c
Executable file → Normal file
168
tools/firmware-utils/src/mkfwimage.c
Executable file → Normal file
@ -29,106 +29,65 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
#include <stdbool.h>
|
||||
#include "fw.h"
|
||||
|
||||
typedef struct fw_layout_data {
|
||||
char name[PATH_MAX];
|
||||
u_int32_t kern_start;
|
||||
u_int32_t kern_entry;
|
||||
u_int32_t firmware_max_length;
|
||||
} fw_layout_t;
|
||||
|
||||
struct fw_info {
|
||||
char name[PATH_MAX];
|
||||
struct fw_layout_data fw_layout;
|
||||
bool sign;
|
||||
};
|
||||
|
||||
struct fw_info fw_info[] = {
|
||||
fw_layout_t fw_layout_data[] = {
|
||||
{
|
||||
.name = "XS2",
|
||||
.fw_layout = {
|
||||
.kern_start = 0xbfc30000,
|
||||
.kern_entry = 0x80041000,
|
||||
.firmware_max_length= 0x00390000,
|
||||
},
|
||||
.sign = false,
|
||||
.name = "XS2",
|
||||
.kern_start = 0xbfc30000,
|
||||
.kern_entry = 0x80041000,
|
||||
.firmware_max_length= 0x00390000,
|
||||
},
|
||||
{
|
||||
.name = "XS5",
|
||||
.fw_layout = {
|
||||
.kern_start = 0xbe030000,
|
||||
.kern_entry = 0x80041000,
|
||||
.firmware_max_length= 0x00390000,
|
||||
},
|
||||
.sign = false,
|
||||
.name = "XS5",
|
||||
.kern_start = 0xbe030000,
|
||||
.kern_entry = 0x80041000,
|
||||
.firmware_max_length= 0x00390000,
|
||||
},
|
||||
{
|
||||
.name = "RS",
|
||||
.fw_layout = {
|
||||
.kern_start = 0xbf030000,
|
||||
.kern_entry = 0x80060000,
|
||||
.firmware_max_length= 0x00B00000,
|
||||
},
|
||||
.sign = false,
|
||||
.name = "RS",
|
||||
.kern_start = 0xbf030000,
|
||||
.kern_entry = 0x80060000,
|
||||
.firmware_max_length= 0x00B00000,
|
||||
},
|
||||
{
|
||||
.name = "RSPRO",
|
||||
.fw_layout = {
|
||||
.kern_start = 0xbf030000,
|
||||
.kern_entry = 0x80060000,
|
||||
.firmware_max_length= 0x00F00000,
|
||||
},
|
||||
.sign = false,
|
||||
.name = "RSPRO",
|
||||
.kern_start = 0xbf030000,
|
||||
.kern_entry = 0x80060000,
|
||||
.firmware_max_length= 0x00F00000,
|
||||
},
|
||||
{
|
||||
.name = "LS-SR71",
|
||||
.fw_layout = {
|
||||
.kern_start = 0xbf030000,
|
||||
.kern_entry = 0x80060000,
|
||||
.firmware_max_length= 0x00640000,
|
||||
},
|
||||
.sign = false,
|
||||
.name = "LS-SR71",
|
||||
.kern_start = 0xbf030000,
|
||||
.kern_entry = 0x80060000,
|
||||
.firmware_max_length= 0x00640000,
|
||||
},
|
||||
{
|
||||
.name = "XS2-8",
|
||||
.fw_layout = {
|
||||
.kern_start = 0xa8030000,
|
||||
.kern_entry = 0x80041000,
|
||||
.firmware_max_length= 0x006C0000,
|
||||
},
|
||||
.sign = false,
|
||||
|
||||
.name = "XS2-8",
|
||||
.kern_start = 0xa8030000,
|
||||
.kern_entry = 0x80041000,
|
||||
.firmware_max_length= 0x006C0000,
|
||||
},
|
||||
{
|
||||
.name = "XM",
|
||||
.fw_layout = {
|
||||
.kern_start = 0x9f050000,
|
||||
.kern_entry = 0x80002000,
|
||||
.firmware_max_length= 0x00760000,
|
||||
},
|
||||
.sign = false,
|
||||
.name = "XM",
|
||||
.kern_start = 0x9f050000,
|
||||
.kern_entry = 0x80002000,
|
||||
.firmware_max_length= 0x00760000,
|
||||
},
|
||||
{
|
||||
.name = "UBDEV01",
|
||||
.fw_layout = {
|
||||
.kern_start = 0x9f050000,
|
||||
.kern_entry = 0x80002000,
|
||||
.firmware_max_length= 0x006A0000,
|
||||
},
|
||||
.sign = false,
|
||||
.name = "UBDEV01",
|
||||
.kern_start = 0x9f050000,
|
||||
.kern_entry = 0x80002000,
|
||||
.firmware_max_length= 0x006A0000,
|
||||
},
|
||||
{
|
||||
.name = "WA",
|
||||
.fw_layout = {
|
||||
.kern_start = 0x9f050000,
|
||||
.kern_entry = 0x80002000,
|
||||
.firmware_max_length= 0x00F60000,
|
||||
},
|
||||
.sign = true,
|
||||
},
|
||||
{
|
||||
.name = "",
|
||||
{ .name = "",
|
||||
},
|
||||
};
|
||||
|
||||
@ -157,20 +116,8 @@ typedef struct image_info {
|
||||
char outputfile[PATH_MAX];
|
||||
u_int32_t part_count;
|
||||
part_data_t parts[MAX_SECTIONS];
|
||||
struct fw_info* fwinfo;
|
||||
} image_info_t;
|
||||
|
||||
static struct fw_info* get_fwinfo(char* board_name) {
|
||||
struct fw_info *fwinfo = fw_info;
|
||||
while(strlen(fwinfo->name)) {
|
||||
if(strcmp(fwinfo->name, board_name) == 0) {
|
||||
return fwinfo;
|
||||
}
|
||||
fwinfo++;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void write_header(void* mem, const char *magic, const char* version)
|
||||
{
|
||||
header_t* header = mem;
|
||||
@ -195,17 +142,6 @@ static void write_signature(void* mem, u_int32_t sig_offset)
|
||||
sign->pad = 0L;
|
||||
}
|
||||
|
||||
static void write_signature_rsa(void* mem, u_int32_t sig_offset)
|
||||
{
|
||||
/* write signature */
|
||||
signature_rsa_t* sign = (signature_rsa_t*)(mem + sig_offset);
|
||||
memset(sign, 0, sizeof(signature_rsa_t));
|
||||
|
||||
memcpy(sign->magic, MAGIC_ENDS, MAGIC_LENGTH);
|
||||
// sign->crc = htonl(crc32(0L,(unsigned char *)mem, sig_offset));
|
||||
sign->pad = 0L;
|
||||
}
|
||||
|
||||
static int write_part(void* mem, part_data_t* d)
|
||||
{
|
||||
char* addr;
|
||||
@ -301,9 +237,17 @@ static int create_image_layout(const char* kernelfile, const char* rootfsfile, c
|
||||
part_data_t* kernel = &im->parts[0];
|
||||
part_data_t* rootfs = &im->parts[1];
|
||||
|
||||
fw_layout_t* p = &im->fwinfo->fw_layout;
|
||||
fw_layout_t* p;
|
||||
|
||||
printf("board = %s\n", im->fwinfo->name);
|
||||
p = &fw_layout_data[0];
|
||||
while (*p->name && (strcmp(p->name, board_name) != 0))
|
||||
p++;
|
||||
if (!*p->name) {
|
||||
printf("BUG! Unable to find default fw layout!\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
printf("board = %s\n", p->name);
|
||||
strcpy(kernel->partition_name, "kernel");
|
||||
kernel->partition_index = 1;
|
||||
kernel->partition_baseaddr = p->kern_start;
|
||||
@ -386,12 +330,7 @@ static int build_image(image_info_t* im)
|
||||
int i;
|
||||
|
||||
// build in-memory buffer
|
||||
mem_size = sizeof(header_t);
|
||||
if(im->fwinfo->sign) {
|
||||
mem_size += sizeof(signature_rsa_t);
|
||||
} else {
|
||||
mem_size += sizeof(signature_t);
|
||||
}
|
||||
mem_size = sizeof(header_t) + sizeof(signature_t);
|
||||
for (i = 0; i < im->part_count; ++i)
|
||||
{
|
||||
part_data_t* d = &im->parts[i];
|
||||
@ -420,11 +359,7 @@ static int build_image(image_info_t* im)
|
||||
ptr += sizeof(part_t) + d->stats.st_size + sizeof(part_crc_t);
|
||||
}
|
||||
// write signature
|
||||
if(im->fwinfo->sign) {
|
||||
write_signature_rsa(mem, mem_size - sizeof(signature_rsa_t));
|
||||
} else {
|
||||
write_signature(mem, mem_size - sizeof(signature_t));
|
||||
}
|
||||
write_signature(mem, mem_size - sizeof(signature_t));
|
||||
|
||||
// write in-memory buffer into file
|
||||
if ((f = fopen(im->outputfile, "w")) == NULL)
|
||||
@ -453,7 +388,6 @@ int main(int argc, char* argv[])
|
||||
char board_name[PATH_MAX];
|
||||
int o, rc;
|
||||
image_info_t im;
|
||||
struct fw_info *fwinfo;
|
||||
|
||||
memset(&im, 0, sizeof(im));
|
||||
memset(kernelfile, 0, sizeof(kernelfile));
|
||||
@ -513,14 +447,6 @@ int main(int argc, char* argv[])
|
||||
return -2;
|
||||
}
|
||||
|
||||
if ((fwinfo = get_fwinfo(board_name)) == NULL) {
|
||||
ERROR("Invalid baord name '%s'\n", board_name);
|
||||
usage(argv[0]);
|
||||
return -2;
|
||||
}
|
||||
|
||||
im.fwinfo = fwinfo;
|
||||
|
||||
if ((rc = create_image_layout(kernelfile, rootfsfile, board_name, &im)) != 0)
|
||||
{
|
||||
ERROR("Failed creating firmware layout description - error code: %d\n", rc);
|
||||
|
||||
0
tools/firmware-utils/src/mkfwimage2.c
Executable file → Normal file
0
tools/firmware-utils/src/mkfwimage2.c
Executable file → Normal file
0
tools/firmware-utils/src/mkheader_gemtek.c
Executable file → Normal file
0
tools/firmware-utils/src/mkheader_gemtek.c
Executable file → Normal file
0
tools/firmware-utils/src/mkhilinkfw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkhilinkfw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkmerakifw-old.c
Executable file → Normal file
0
tools/firmware-utils/src/mkmerakifw-old.c
Executable file → Normal file
0
tools/firmware-utils/src/mkmerakifw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkmerakifw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkmylofw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkmylofw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkplanexfw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkplanexfw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkporayfw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkporayfw.c
Executable file → Normal file
@ -1,459 +0,0 @@
|
||||
/*
|
||||
* --- ZyXEL header format ---
|
||||
* Original Version by Benjamin Berg <benjamin@sipsolutions.net>
|
||||
* C implementation based on generation-script by Christian Lamparter <chunkeey@gmail.com>
|
||||
*
|
||||
* The firmware image prefixed with a header (which is written into the MTD device).
|
||||
* The header is one erase block (~64KiB) in size, but the checksum only convers the
|
||||
* first 2KiB. Padding is 0xff. All integers are in big-endian.
|
||||
*
|
||||
* The checksum is always a 16-Bit System V checksum (sum -s) stored in a 32-Bit integer.
|
||||
*
|
||||
* 4 bytes: checksum of the rootfs image
|
||||
* 4 bytes: length of the contained rootfs image file (big endian)
|
||||
* 32 bytes: Firmware Version string (NUL terminated, 0xff padded)
|
||||
* 4 bytes: checksum over the header partition (big endian - see below)
|
||||
* 64 bytes: Model (e.g. "NBG6617", NUL termiated, 0xff padded)
|
||||
* 4 bytes: checksum of the kernel partition
|
||||
* 4 bytes: length of the contained kernel image file (big endian)
|
||||
* rest: 0xff padding (To erase block size)
|
||||
*
|
||||
* The kernel partition checksum and length is not used for every device.
|
||||
* If it's notused, pad those 8 bytes with 0xFF.
|
||||
*
|
||||
* The checksums are calculated by adding up all bytes and if a 16bit
|
||||
* overflow occurs, one is added and the sum is masked to 16 bit:
|
||||
* csum = csum + databyte; if (csum > 0xffff) { csum += 1; csum &= 0xffff };
|
||||
* Should the file have an odd number of bytes then the byte len-0x800 is
|
||||
* used additionally.
|
||||
*
|
||||
* The checksum for the header is calculated over the first 2048 bytes with
|
||||
* the rootfs image checksum as the placeholder during calculation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published
|
||||
* by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
#include <fcntl.h>
|
||||
#include <getopt.h>
|
||||
#include <libgen.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#define VERSION_STRING_LEN 31
|
||||
#define ROOTFS_HEADER_LEN 40
|
||||
|
||||
#define KERNEL_HEADER_LEN 8
|
||||
|
||||
#define BOARD_NAME_LEN 64
|
||||
#define BOARD_HEADER_LEN 68
|
||||
|
||||
#define HEADER_PARTITION_CALC_LENGTH 2048
|
||||
#define HEADER_PARTITION_LENGTH 0x10000
|
||||
|
||||
struct file_info {
|
||||
char *name; /* name of the file */
|
||||
char *data; /* file content */
|
||||
size_t size; /* length of the file */
|
||||
};
|
||||
|
||||
static char *progname;
|
||||
|
||||
static char *board_name = 0;
|
||||
static char *version_name = 0;
|
||||
static unsigned int rootfs_size = 0;
|
||||
|
||||
static struct file_info kernel = { NULL, NULL, 0 };
|
||||
static struct file_info rootfs = { NULL, NULL, 0 };
|
||||
static struct file_info rootfs_out = { NULL, NULL, 0 };
|
||||
static struct file_info out = { NULL, NULL, 0 };
|
||||
|
||||
#define ERR(fmt, ...) do { \
|
||||
fprintf(stderr, "[%s] *** error: " fmt "\n", \
|
||||
progname, ## __VA_ARGS__ ); \
|
||||
} while (0)
|
||||
|
||||
void map_file(struct file_info *finfo)
|
||||
{
|
||||
struct stat file_stat = {0};
|
||||
int fd;
|
||||
|
||||
fd = open(finfo->name, O_RDONLY, (mode_t)0600);
|
||||
if (fd == -1) {
|
||||
ERR("Error while opening file %s.", finfo->name);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (fstat(fd, &file_stat) == -1) {
|
||||
ERR("Error getting file size for %s.", finfo->name);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
finfo->size = file_stat.st_size;
|
||||
finfo->data = mmap(0, finfo->size, PROT_READ, MAP_SHARED, fd, 0);
|
||||
|
||||
if (finfo->data == MAP_FAILED) {
|
||||
ERR("Error mapping file %s.", finfo->name);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
close(fd);
|
||||
}
|
||||
|
||||
void unmap_file(struct file_info *finfo)
|
||||
{
|
||||
if(munmap(finfo->data, finfo->size) == -1) {
|
||||
ERR("Error unmapping file %s.", finfo->name);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
void write_file(struct file_info *finfo)
|
||||
{
|
||||
FILE *fout = fopen(finfo->name, "w");
|
||||
|
||||
fwrite(finfo->data, finfo->size, 1, fout);
|
||||
|
||||
if (ferror(fout)) {
|
||||
ERR("Wanted to write, but something went wrong.");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
fclose(fout);
|
||||
}
|
||||
|
||||
void usage(int status)
|
||||
{
|
||||
FILE *stream = (status != EXIT_SUCCESS) ? stderr : stdout;
|
||||
|
||||
fprintf(stream, "Usage: %s [OPTIONS...]\n", progname);
|
||||
fprintf(stream,
|
||||
"\n"
|
||||
"Options:\n"
|
||||
" -k <kernel> path for kernel image\n"
|
||||
" -r <rootfs> path for rootfs image\n"
|
||||
" -s <rfssize> size of output rootfs\n"
|
||||
" -v <version> version string\n"
|
||||
" -b <boardname> name of board to generate image for\n"
|
||||
" -o <out_name> name of output image\n"
|
||||
" -h show this screen\n"
|
||||
);
|
||||
|
||||
exit(status);
|
||||
}
|
||||
|
||||
static int sysv_chksm(const unsigned char *data, int size)
|
||||
{
|
||||
int r;
|
||||
int checksum;
|
||||
unsigned int s = 0; /* The sum of all the input bytes, modulo (UINT_MAX + 1). */
|
||||
|
||||
|
||||
for (int i = 0; i < size; i++) {
|
||||
s += data[i];
|
||||
}
|
||||
|
||||
r = (s & 0xffff) + ((s & 0xffffffff) >> 16);
|
||||
checksum = (r & 0xffff) + (r >> 16);
|
||||
|
||||
return checksum;
|
||||
}
|
||||
|
||||
static int zyxel_chksm(const unsigned char *data, int size)
|
||||
{
|
||||
return htonl(sysv_chksm(data, size));
|
||||
}
|
||||
|
||||
char *generate_rootfs_header(struct file_info filesystem, char *version)
|
||||
{
|
||||
size_t version_string_length;
|
||||
unsigned int chksm, size;
|
||||
char *rootfs_header;
|
||||
size_t ptr = 0;
|
||||
|
||||
rootfs_header = malloc(ROOTFS_HEADER_LEN);
|
||||
if (!rootfs_header) {
|
||||
ERR("Couldn't allocate memory for rootfs header!");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* Prepare padding for firmware-version string here */
|
||||
memset(rootfs_header, 0xff, ROOTFS_HEADER_LEN);
|
||||
|
||||
chksm = zyxel_chksm((const unsigned char *)filesystem.data, filesystem.size);
|
||||
size = htonl(filesystem.size);
|
||||
|
||||
/* 4 bytes: checksum of the rootfs image */
|
||||
memcpy(rootfs_header + ptr, &chksm, 4);
|
||||
ptr += 4;
|
||||
|
||||
/* 4 bytes: length of the contained rootfs image file (big endian) */
|
||||
memcpy(rootfs_header + ptr, &size, 4);
|
||||
ptr += 4;
|
||||
|
||||
/* 32 bytes: Firmware Version string (NUL terminated, 0xff padded) */
|
||||
version_string_length = strlen(version) <= VERSION_STRING_LEN ? strlen(version) : VERSION_STRING_LEN;
|
||||
memcpy(rootfs_header + ptr, version, version_string_length);
|
||||
ptr += version_string_length;
|
||||
/* Add null-terminator */
|
||||
rootfs_header[ptr] = 0x0;
|
||||
|
||||
return rootfs_header;
|
||||
}
|
||||
|
||||
char *generate_kernel_header(struct file_info kernel)
|
||||
{
|
||||
unsigned int chksm, size;
|
||||
char *kernel_header;
|
||||
size_t ptr = 0;
|
||||
|
||||
kernel_header = malloc(KERNEL_HEADER_LEN);
|
||||
if (!kernel_header) {
|
||||
ERR("Couldn't allocate memory for kernel header!");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
chksm = zyxel_chksm((const unsigned char *)kernel.data, kernel.size);
|
||||
size = htonl(kernel.size);
|
||||
|
||||
/* 4 bytes: checksum of the kernel image */
|
||||
memcpy(kernel_header + ptr, &chksm, 4);
|
||||
ptr += 4;
|
||||
|
||||
/* 4 bytes: length of the contained kernel image file (big endian) */
|
||||
memcpy(kernel_header + ptr, &size, 4);
|
||||
|
||||
return kernel_header;
|
||||
}
|
||||
|
||||
unsigned int generate_board_header_checksum(char *kernel_hdr, char *rootfs_hdr, char *boardname)
|
||||
{
|
||||
char *board_hdr_tmp;
|
||||
unsigned int sum;
|
||||
size_t ptr = 0;
|
||||
|
||||
/*
|
||||
* The checksum of the board header is calculated over the first 2048 bytes of
|
||||
* the header partition with the rootfs checksum used as a placeholder for then
|
||||
* board checksum we calculate in this step. The checksum gained from this step
|
||||
* is then used for the final board header partition.
|
||||
*/
|
||||
|
||||
board_hdr_tmp = malloc(HEADER_PARTITION_CALC_LENGTH);
|
||||
if (!board_hdr_tmp) {
|
||||
ERR("Couldn't allocate memory for temporary board header!");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
memset(board_hdr_tmp, 0xff, HEADER_PARTITION_CALC_LENGTH);
|
||||
|
||||
/* 40 bytes: RootFS header */
|
||||
memcpy(board_hdr_tmp, rootfs_hdr, ROOTFS_HEADER_LEN);
|
||||
ptr += ROOTFS_HEADER_LEN;
|
||||
|
||||
/* 4 bytes: RootFS checksum (BE) as placeholder for board-header checksum */
|
||||
memcpy(board_hdr_tmp + ptr, rootfs_hdr, 4);
|
||||
ptr += 4;
|
||||
|
||||
/* 32 bytes: Model (e.g. "NBG6617", NUL termiated, 0xff padded) */
|
||||
memcpy(board_hdr_tmp + ptr, boardname, strlen(boardname));
|
||||
ptr += strlen(boardname);
|
||||
/* Add null-terminator */
|
||||
board_hdr_tmp[ptr] = 0x0;
|
||||
ptr = ROOTFS_HEADER_LEN + 4 + BOARD_NAME_LEN;
|
||||
|
||||
/* 8 bytes: Kernel header */
|
||||
if (kernel_hdr)
|
||||
memcpy(board_hdr_tmp + ptr, kernel_hdr, 8);
|
||||
|
||||
/* Calculate the checksum over the first 2048 bytes */
|
||||
sum = zyxel_chksm((const unsigned char *)board_hdr_tmp, HEADER_PARTITION_CALC_LENGTH);
|
||||
free(board_hdr_tmp);
|
||||
return sum;
|
||||
}
|
||||
|
||||
char *generate_board_header(char *kernel_hdr, char *rootfs_hdr, char *boardname)
|
||||
{
|
||||
unsigned int board_checksum;
|
||||
char *board_hdr;
|
||||
|
||||
board_hdr = malloc(BOARD_HEADER_LEN);
|
||||
if (!board_hdr) {
|
||||
ERR("Couldn't allocate memory for board header!");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
memset(board_hdr, 0xff, BOARD_HEADER_LEN);
|
||||
|
||||
/* 4 bytes: checksum over the header partition (big endian) */
|
||||
board_checksum = generate_board_header_checksum(kernel_hdr, rootfs_hdr, boardname);
|
||||
memcpy(board_hdr, &board_checksum, 4);
|
||||
|
||||
/* 32 bytes: Model (e.g. "NBG6617", NUL termiated, 0xff padded) */
|
||||
memcpy(board_hdr + 4, boardname, strlen(boardname));
|
||||
board_hdr[4 + strlen(boardname)] = 0x0;
|
||||
|
||||
return board_hdr;
|
||||
}
|
||||
|
||||
int build_image()
|
||||
{
|
||||
char *rootfs_header = NULL;
|
||||
char *kernel_header = NULL;
|
||||
char *board_header = NULL;
|
||||
|
||||
size_t ptr;
|
||||
|
||||
/* Load files */
|
||||
if (kernel.name)
|
||||
map_file(&kernel);
|
||||
map_file(&rootfs);
|
||||
|
||||
/*
|
||||
* Allocate memory and copy input rootfs for temporary output rootfs.
|
||||
* This is important as we have to generate the rootfs checksum over the
|
||||
* entire rootfs partition. As we might have to pad the partition to allow
|
||||
* for flashing via ZyXEL's Web-GUI, we prepare the rootfs partition for the
|
||||
* output image here (and also use it for calculating the rootfs checksum).
|
||||
*
|
||||
* The roofs padding has to be done with 0x00.
|
||||
*/
|
||||
rootfs_out.data = calloc(rootfs_out.size, sizeof(char));
|
||||
memcpy(rootfs_out.data, rootfs.data, rootfs.size);
|
||||
|
||||
/* Prepare headers */
|
||||
rootfs_header = generate_rootfs_header(rootfs_out, version_name);
|
||||
if (kernel.name)
|
||||
kernel_header = generate_kernel_header(kernel);
|
||||
board_header = generate_board_header(kernel_header, rootfs_header, board_name);
|
||||
|
||||
/* Prepare output file */
|
||||
out.size = HEADER_PARTITION_LENGTH + rootfs_out.size;
|
||||
if (kernel.name)
|
||||
out.size += kernel.size;
|
||||
out.data = malloc(out.size);
|
||||
memset(out.data, 0xFF, out.size);
|
||||
|
||||
/* Build output image */
|
||||
memcpy(out.data, rootfs_header, ROOTFS_HEADER_LEN);
|
||||
memcpy(out.data + ROOTFS_HEADER_LEN, board_header, BOARD_HEADER_LEN);
|
||||
if (kernel.name)
|
||||
memcpy(out.data + ROOTFS_HEADER_LEN + BOARD_HEADER_LEN, kernel_header, KERNEL_HEADER_LEN);
|
||||
ptr = HEADER_PARTITION_LENGTH;
|
||||
memcpy(out.data + ptr, rootfs_out.data, rootfs_out.size);
|
||||
ptr += rootfs_out.size;
|
||||
if (kernel.name)
|
||||
memcpy(out.data + ptr, kernel.data, kernel.size);
|
||||
|
||||
/* Write back output image */
|
||||
write_file(&out);
|
||||
|
||||
/* Free allocated memory */
|
||||
if (kernel.name)
|
||||
unmap_file(&kernel);
|
||||
unmap_file(&rootfs);
|
||||
free(out.data);
|
||||
free(rootfs_out.data);
|
||||
|
||||
free(rootfs_header);
|
||||
if (kernel.name)
|
||||
free(kernel_header);
|
||||
free(board_header);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int check_options()
|
||||
{
|
||||
if (!rootfs.name) {
|
||||
ERR("No rootfs filename supplied");
|
||||
return -2;
|
||||
}
|
||||
|
||||
if (!out.name) {
|
||||
ERR("No output filename supplied");
|
||||
return -3;
|
||||
}
|
||||
|
||||
if (!board_name) {
|
||||
ERR("No board-name supplied");
|
||||
return -4;
|
||||
}
|
||||
|
||||
if (!version_name) {
|
||||
ERR("No version supplied");
|
||||
return -5;
|
||||
}
|
||||
|
||||
if (rootfs_size <= 0) {
|
||||
ERR("Invalid rootfs size supplied");
|
||||
return -6;
|
||||
}
|
||||
|
||||
if (strlen(board_name) > 31) {
|
||||
ERR("Board name is to long");
|
||||
return -7;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int ret;
|
||||
progname = basename(argv[0]);
|
||||
while (1) {
|
||||
int c;
|
||||
|
||||
c = getopt(argc, argv, "b:k:o:r:s:v:h");
|
||||
if (c == -1)
|
||||
break;
|
||||
|
||||
switch (c) {
|
||||
case 'b':
|
||||
board_name = optarg;
|
||||
break;
|
||||
case 'h':
|
||||
usage(EXIT_SUCCESS);
|
||||
break;
|
||||
case 'k':
|
||||
kernel.name = optarg;
|
||||
break;
|
||||
case 'o':
|
||||
out.name = optarg;
|
||||
break;
|
||||
case 'r':
|
||||
rootfs.name = optarg;
|
||||
break;
|
||||
case 's':
|
||||
sscanf(optarg, "%u", &rootfs_size);
|
||||
break;
|
||||
case 'v':
|
||||
version_name = optarg;
|
||||
break;
|
||||
default:
|
||||
usage(EXIT_FAILURE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ret = check_options();
|
||||
if (ret)
|
||||
usage(EXIT_FAILURE);
|
||||
|
||||
/* As ZyXEL Web-GUI only accept images with a rootfs equal or larger than the first firmware shipped
|
||||
* for the device, we need to pad rootfs partition to this size. To perform further calculations, we
|
||||
* decide the size of this part here. In case the rootfs we want to integrate in our image is larger,
|
||||
* take it's size, otherwise the supplied size.
|
||||
*
|
||||
* Be careful! We rely on assertion of correct size to be performed beforehand. It is unknown if images
|
||||
* with a to large rootfs are accepted or not.
|
||||
*/
|
||||
rootfs_out.size = rootfs_size < rootfs.size ? rootfs.size : rootfs_size;
|
||||
return build_image();
|
||||
}
|
||||
0
tools/firmware-utils/src/mkrtn56uimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mkrtn56uimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mksenaofw.c
Executable file → Normal file
0
tools/firmware-utils/src/mksenaofw.c
Executable file → Normal file
@ -1,422 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <byteswap.h>
|
||||
#include <endian.h>
|
||||
|
||||
#if !defined(__BYTE_ORDER)
|
||||
#error "Unknown byte order"
|
||||
#endif
|
||||
|
||||
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||
#define cpu_to_be32(x) (x)
|
||||
#define be32_to_cpu(x) (x)
|
||||
#define cpu_to_be16(x) (x)
|
||||
#define be16_to_cpu(x) (x)
|
||||
#elif __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
#define cpu_to_be32(x) bswap_32(x)
|
||||
#define be32_to_cpu(x) bswap_32(x)
|
||||
#define cpu_to_be16(x) bswap_16(x)
|
||||
#define be16_to_cpu(x) bswap_16(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__); }
|
||||
#define ALIGN(a,b) ((a) + ((b) - ((a) % (b))))
|
||||
#define ROOTFS_ALIGN 128
|
||||
#define HEADER_SIZE 71
|
||||
|
||||
/*
|
||||
* 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 */
|
||||
|
||||
/* 7-11: version control/download control ? */
|
||||
static const unsigned char version[4] = { 0x00, 0x01, 0x00, 0x00 };
|
||||
|
||||
|
||||
/* 512 onwards -> ZIP containing rootfs with the same Header */
|
||||
|
||||
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;
|
||||
|
||||
if (!data) {
|
||||
ERR("Invalid pointer provided!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
new += data[i];
|
||||
}
|
||||
|
||||
return new;
|
||||
}
|
||||
|
||||
static int bufferFile(struct file_info* finfo) {
|
||||
int fs = 0;
|
||||
FILE* fp = NULL;
|
||||
|
||||
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);
|
||||
fs = ftell(fp);
|
||||
rewind(fp);
|
||||
|
||||
if (fs < 0) {
|
||||
ERR("Error getting filesize: %s\n", finfo->file_name);
|
||||
fclose(fp);
|
||||
return -1;
|
||||
}
|
||||
|
||||
DBG("Filesize: %i\n", fs);
|
||||
finfo->file_size = fs;
|
||||
|
||||
if (!(finfo->file_data = malloc(fs))) {
|
||||
ERR("Out of memory!\n");
|
||||
fclose(fp);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (fread(finfo->file_data, 1, fs, fp) != fs) {
|
||||
ERR("Error reading file %s\n", finfo->file_name);
|
||||
fclose(fp);
|
||||
return -1;
|
||||
}
|
||||
|
||||
DBG("File: read successful\n");
|
||||
fclose(fp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
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 fi_clean(struct file_info* finfo) {
|
||||
if (!finfo)
|
||||
return;
|
||||
|
||||
if (finfo->file_name) {
|
||||
finfo->file_name = NULL;
|
||||
}
|
||||
|
||||
if (finfo->file_data) {
|
||||
free(finfo->file_data);
|
||||
finfo->file_data = NULL;
|
||||
}
|
||||
|
||||
finfo->file_size = 0;
|
||||
}
|
||||
|
||||
static void usage(char* argv[]) {
|
||||
printf("Usage: %s <sysupgradefile> <kernel_offset> <HWID> <HWVER> <SWID>\n"
|
||||
"All are positional arguments ... \n"
|
||||
" sysupgradefile: File with the kernel uimage at 0\n"
|
||||
" kernel_offset: Offset where the kernel is located (decimal, hex or octal notation)\n"
|
||||
" HWID: Hardware ID, ASCII\n"
|
||||
" HWVER: Hardware Version, ASCII\n"
|
||||
" SWID: Software Version (decimal, hex or octal notation)\n"
|
||||
" \n"
|
||||
, argv[0]);
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
int ret = 1;
|
||||
int rootfsname_sz;
|
||||
int zipfsname_sz;
|
||||
int zipcmd_sz;
|
||||
u_int32_t kernel_offset = 0x90000; /* offset for the kernel inside the rootfs, default val */
|
||||
u_int32_t swVer = 0;
|
||||
struct file_info sysupgrade = { 0 };
|
||||
struct file_info header = { 0 };
|
||||
struct file_info rootfs = { 0 };
|
||||
struct file_info zippedfs = { 0 };
|
||||
struct file_info image = { 0 };
|
||||
char* hwID = NULL;
|
||||
char* hwVer = NULL;
|
||||
char* rootfsname = NULL;
|
||||
char* zipfsname = NULL;
|
||||
char* zipcmd = NULL;
|
||||
u_int8_t chkSum;
|
||||
|
||||
if (argc == 2) {
|
||||
struct file_info myfile = { argv[1], 0, 0 };
|
||||
|
||||
if (bufferFile(&myfile))
|
||||
return 1;
|
||||
|
||||
chkSum = getCheckSum(myfile.file_data, myfile.file_size);
|
||||
printf("Checksum for File: 0x%hhX\n", chkSum);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (argc != 6) {
|
||||
usage(argv);
|
||||
return 1;
|
||||
}
|
||||
|
||||
printf("Building fw image for sercomm devices ..\n");
|
||||
|
||||
/* process args */
|
||||
hwID = argv[3];
|
||||
hwVer = argv[4];
|
||||
|
||||
sysupgrade.file_name = argv[1];
|
||||
image.file_name = argv[1];
|
||||
kernel_offset = (u_int32_t) strtol(argv[2], NULL, 0);
|
||||
swVer = (u_int32_t) strtol(argv[5], NULL, 0);
|
||||
swVer = cpu_to_be32(swVer);
|
||||
|
||||
/* Check if files actually exist */
|
||||
if (access(sysupgrade.file_name, (F_OK | R_OK))) {
|
||||
/* Error */
|
||||
ERR("File not found: %s\n", sysupgrade.file_name);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Calculate amount of required memory (incl. 0-term) */
|
||||
rootfsname_sz = strlen(sysupgrade.file_name) + 7 + 1;
|
||||
zipfsname_sz = strlen(sysupgrade.file_name) + 7 + 4 + 1;
|
||||
|
||||
/* Allocate required memory */
|
||||
if (!(rootfsname = (char*) malloc(rootfsname_sz)) || !(zipfsname =
|
||||
(char*) malloc(zipfsname_sz))) {
|
||||
/* Error */
|
||||
ERR("Out of memory!\n");
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Create filenames */
|
||||
if (snprintf(rootfsname, rootfsname_sz, "%s.rootfs", sysupgrade.file_name)
|
||||
>= rootfsname_sz
|
||||
|| snprintf(zipfsname, zipfsname_sz, "%s.rootfs.zip",
|
||||
sysupgrade.file_name) >= zipfsname_sz) {
|
||||
/* Error */
|
||||
ERR("Buffer too small!\n");
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Buffer all files */
|
||||
if (bufferFile(&sysupgrade)) {
|
||||
/* Error */
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
DBG("Building header: %s %s %2X %s\n", hwID, hwVer, swVer, magic);
|
||||
|
||||
/* Construct the firmware header/magic */
|
||||
header.file_name = NULL;
|
||||
header.file_size = HEADER_SIZE;
|
||||
|
||||
if (!(header.file_data = (char*) calloc(1, HEADER_SIZE))) {
|
||||
/* Error */
|
||||
ERR("Out of memory!\n");
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
strncpy(header.file_data + 0, magic, 7);
|
||||
memcpy(header.file_data + 7, version, sizeof(version));
|
||||
strncpy(header.file_data + 11, hwID, 34);
|
||||
strncpy(header.file_data + 45, hwVer, 10);
|
||||
memcpy(header.file_data + 55, &swVer, sizeof(swVer));
|
||||
strncpy(header.file_data + 63, magic, 7);
|
||||
|
||||
DBG("Creating rootfs ..\n");
|
||||
|
||||
/* Construct a rootfs */
|
||||
rootfs.file_name = rootfsname;
|
||||
rootfs.file_size = ALIGN(
|
||||
sysupgrade.file_size + kernel_offset + header.file_size,
|
||||
ROOTFS_ALIGN);
|
||||
|
||||
if (!(rootfs.file_data = calloc(1, rootfs.file_size))) {
|
||||
/* Error */
|
||||
ERR("Out of memory!\n");
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* copy Owrt image to kernel location */
|
||||
memcpy(rootfs.file_data + kernel_offset, sysupgrade.file_data,
|
||||
sysupgrade.file_size);
|
||||
|
||||
/* Append header after the owrt image. The updater searches for it */
|
||||
memcpy(rootfs.file_data + kernel_offset + sysupgrade.file_size,
|
||||
header.file_data, header.file_size);
|
||||
|
||||
/* Write to file */
|
||||
if (writeFile(&rootfs)) {
|
||||
/* Error */
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Construct a zip */
|
||||
DBG("Preparing to zip ..\n");
|
||||
|
||||
/* now that we got the rootfs, repeat the whole thing again(sorta):
|
||||
* 1. zip the rootfs */
|
||||
zipcmd_sz = 3 + 1 + strlen(zipfsname) + 1 + strlen(rootfs.file_name) + 1;
|
||||
|
||||
if (!(zipcmd = malloc(zipcmd_sz))) {
|
||||
/* Error */
|
||||
ERR("Out of memory!\n");
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (snprintf(zipcmd, zipcmd_sz, "%s %s %s", "zip", zipfsname,
|
||||
rootfs.file_name) >= zipcmd_sz) {
|
||||
/* Error */
|
||||
ERR("Buffer too small!\n");
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (system(zipcmd)) {
|
||||
/* Error */
|
||||
ERR("Error creating a zip file!\n");
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* and load zipped fs */
|
||||
zippedfs.file_name = zipfsname;
|
||||
|
||||
if (bufferFile(&zippedfs)) {
|
||||
/* Error */
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
DBG("Creating Image.\n");
|
||||
|
||||
/* 2. create new file 512 + rootfs size */
|
||||
image.file_size = zippedfs.file_size + 512;
|
||||
if (!(image.file_data = malloc(zippedfs.file_size + 512))) {
|
||||
/* Error */
|
||||
ERR("Out of memory!\n");
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* 3. add header to file */
|
||||
memcpy(image.file_data, header.file_data, header.file_size);
|
||||
|
||||
/* 4. clear remaining space */
|
||||
if (header.file_size < 512)
|
||||
memset(image.file_data + header.file_size, 0, 512 - header.file_size);
|
||||
|
||||
/* 5. copy zipfile at loc 512 */
|
||||
memcpy(image.file_data + 512, zippedfs.file_data, zippedfs.file_size);
|
||||
|
||||
/* 6. do a checksum run, and compute checksum */
|
||||
chkSum = getCheckSum(image.file_data, image.file_size);
|
||||
|
||||
DBG("Checksum for Image: %hhX\n", chkSum);
|
||||
|
||||
/* 7. write the checksum inverted into byte 511 to bring it to 0 on verification */
|
||||
chkSum = (chkSum ^ 0xFF) + 1;
|
||||
image.file_data[511] = (char) chkSum;
|
||||
|
||||
chkSum = getCheckSum(image.file_data, image.file_size);
|
||||
DBG("Checksum for after fix: %hhX\n", chkSum);
|
||||
|
||||
if (chkSum != 0) {
|
||||
ERR("Invalid checksum!\n")
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* 8. pray that the updater will accept the file */
|
||||
if (writeFile(&image)) {
|
||||
/* Error */
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* All seems OK */
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
|
||||
if (rootfs.file_name && !access(rootfs.file_name, F_OK | W_OK))
|
||||
remove(rootfs.file_name);
|
||||
|
||||
if (zippedfs.file_name && !access(zippedfs.file_name, F_OK | W_OK))
|
||||
remove(zippedfs.file_name);
|
||||
|
||||
fi_clean(&sysupgrade);
|
||||
fi_clean(&header);
|
||||
fi_clean(&rootfs);
|
||||
fi_clean(&zippedfs);
|
||||
fi_clean(&image);
|
||||
|
||||
if (rootfsname)
|
||||
free(rootfsname);
|
||||
|
||||
if (zipfsname)
|
||||
free(zipfsname);
|
||||
|
||||
if (zipcmd)
|
||||
free(zipcmd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
0
tools/firmware-utils/src/mktitanimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mktitanimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mktitanimg.h
Executable file → Normal file
0
tools/firmware-utils/src/mktitanimg.h
Executable file → Normal file
0
tools/firmware-utils/src/mktplinkfw-lib.c
Executable file → Normal file
0
tools/firmware-utils/src/mktplinkfw-lib.c
Executable file → Normal file
0
tools/firmware-utils/src/mktplinkfw-lib.h
Executable file → Normal file
0
tools/firmware-utils/src/mktplinkfw-lib.h
Executable file → Normal file
11
tools/firmware-utils/src/mktplinkfw.c
Executable file → Normal file
11
tools/firmware-utils/src/mktplinkfw.c
Executable file → Normal file
@ -107,7 +107,6 @@ static uint32_t reserved_space;
|
||||
static struct file_info inspect_info;
|
||||
static int extract = 0;
|
||||
static bool endian_swap = false;
|
||||
static bool rootfs_ofs_calc = false;
|
||||
|
||||
static const char md5salt_normal[MD5SUM_LEN] = {
|
||||
0xdc, 0xd7, 0x3a, 0xa5, 0xc3, 0x95, 0x98, 0xfb,
|
||||
@ -203,7 +202,6 @@ static void usage(int status)
|
||||
" -r <file> read rootfs image from the file <file>\n"
|
||||
" -a <align> align the rootfs start on an <align> bytes boundary\n"
|
||||
" -R <offset> overwrite rootfs offset with <offset> (hexval prefixed with 0x)\n"
|
||||
" -O calculate rootfs offset for combined images\n"
|
||||
" -o <file> write output to the file <file>\n"
|
||||
" -s strip padding from the end of the image\n"
|
||||
" -j add jffs2 end-of-filesystem markers\n"
|
||||
@ -386,10 +384,6 @@ void fill_header(char *buf, int len)
|
||||
hdr->rootfs_len = htonl(rootfs_info.file_size);
|
||||
}
|
||||
|
||||
if (combined && rootfs_ofs_calc) {
|
||||
hdr->rootfs_ofs = htonl(sizeof(struct fw_header) + kernel_len);
|
||||
}
|
||||
|
||||
hdr->ver_hi = htons(fw_ver_hi);
|
||||
hdr->ver_mid = htons(fw_ver_mid);
|
||||
hdr->ver_lo = htons(fw_ver_lo);
|
||||
@ -545,7 +539,7 @@ int main(int argc, char *argv[])
|
||||
while ( 1 ) {
|
||||
int c;
|
||||
|
||||
c = getopt(argc, argv, "a:H:E:F:L:m:V:N:W:C:ci:k:r:R:o:OxX:ehsjv:");
|
||||
c = getopt(argc, argv, "a:H:E:F:L:m:V:N:W:C:ci:k:r:R:o:xX:ehsjv:");
|
||||
if (c == -1)
|
||||
break;
|
||||
|
||||
@ -598,9 +592,6 @@ int main(int argc, char *argv[])
|
||||
case 'o':
|
||||
ofname = optarg;
|
||||
break;
|
||||
case 'O':
|
||||
rootfs_ofs_calc = 1;
|
||||
break;
|
||||
case 's':
|
||||
strip_padding = 1;
|
||||
break;
|
||||
|
||||
0
tools/firmware-utils/src/mktplinkfw2.c
Executable file → Normal file
0
tools/firmware-utils/src/mktplinkfw2.c
Executable file → Normal file
0
tools/firmware-utils/src/mkwrggimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mkwrggimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mkwrgimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mkwrgimg.c
Executable file → Normal file
0
tools/firmware-utils/src/mkzcfw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkzcfw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkzynfw.c
Executable file → Normal file
0
tools/firmware-utils/src/mkzynfw.c
Executable file → Normal file
0
tools/firmware-utils/src/motorola-bin.c
Executable file → Normal file
0
tools/firmware-utils/src/motorola-bin.c
Executable file → Normal file
0
tools/firmware-utils/src/myloader.h
Executable file → Normal file
0
tools/firmware-utils/src/myloader.h
Executable file → Normal file
0
tools/firmware-utils/src/nand_ecc.c
Executable file → Normal file
0
tools/firmware-utils/src/nand_ecc.c
Executable file → Normal file
0
tools/firmware-utils/src/osbridge-crc.c
Executable file → Normal file
0
tools/firmware-utils/src/osbridge-crc.c
Executable file → Normal file
0
tools/firmware-utils/src/oseama.c
Executable file → Normal file
0
tools/firmware-utils/src/oseama.c
Executable file → Normal file
0
tools/firmware-utils/src/otrx.c
Executable file → Normal file
0
tools/firmware-utils/src/otrx.c
Executable file → Normal file
0
tools/firmware-utils/src/pc1crypt.c
Executable file → Normal file
0
tools/firmware-utils/src/pc1crypt.c
Executable file → Normal file
0
tools/firmware-utils/src/ptgen.c
Executable file → Normal file
0
tools/firmware-utils/src/ptgen.c
Executable file → Normal file
0
tools/firmware-utils/src/seama.c
Executable file → Normal file
0
tools/firmware-utils/src/seama.c
Executable file → Normal file
0
tools/firmware-utils/src/seama.h
Executable file → Normal file
0
tools/firmware-utils/src/seama.h
Executable file → Normal file
0
tools/firmware-utils/src/sha1.c
Executable file → Normal file
0
tools/firmware-utils/src/sha1.c
Executable file → Normal file
0
tools/firmware-utils/src/sha1.h
Executable file → Normal file
0
tools/firmware-utils/src/sha1.h
Executable file → Normal file
0
tools/firmware-utils/src/spw303v.c
Executable file → Normal file
0
tools/firmware-utils/src/spw303v.c
Executable file → Normal file
0
tools/firmware-utils/src/srec2bin.c
Executable file → Normal file
0
tools/firmware-utils/src/srec2bin.c
Executable file → Normal file
336
tools/firmware-utils/src/tplink-safeloader.c
Executable file → Normal file
336
tools/firmware-utils/src/tplink-safeloader.c
Executable file → Normal file
@ -65,7 +65,7 @@ struct image_partition_entry {
|
||||
|
||||
/** A flash partition table entry */
|
||||
struct flash_partition_entry {
|
||||
char *name;
|
||||
const char *name;
|
||||
uint32_t base;
|
||||
uint32_t size;
|
||||
};
|
||||
@ -77,7 +77,7 @@ struct device_info {
|
||||
const char *support_list;
|
||||
char support_trail;
|
||||
const char *soft_ver;
|
||||
struct flash_partition_entry partitions[MAX_PARTITIONS+1];
|
||||
const struct flash_partition_entry partitions[MAX_PARTITIONS+1];
|
||||
const char *first_sysupgrade_partition;
|
||||
const char *last_sysupgrade_partition;
|
||||
};
|
||||
@ -210,17 +210,7 @@ static struct device_info boards[] = {
|
||||
"CPE510(TP-LINK|EU|N300-5):1.1\r\n"
|
||||
"CPE520(TP-LINK|UN|N300-5):1.1\r\n"
|
||||
"CPE520(TP-LINK|US|N300-5):1.1\r\n"
|
||||
"CPE520(TP-LINK|EU|N300-5):1.1\r\n"
|
||||
"CPE510(TP-LINK|EU|N300-5|00000000):2.0\r\n"
|
||||
"CPE510(TP-LINK|EU|N300-5|45550000):2.0\r\n"
|
||||
"CPE510(TP-LINK|EU|N300-5|55530000):2.0\r\n"
|
||||
"CPE510(TP-LINK|UN|N300-5|00000000):2.0\r\n"
|
||||
"CPE510(TP-LINK|UN|N300-5|45550000):2.0\r\n"
|
||||
"CPE510(TP-LINK|UN|N300-5|55530000):2.0\r\n"
|
||||
"CPE510(TP-LINK|US|N300-5|55530000):2.0\r\n"
|
||||
"CPE510(TP-LINK|UN|N300-5):2.0\r\n"
|
||||
"CPE510(TP-LINK|EU|N300-5):2.0\r\n"
|
||||
"CPE510(TP-LINK|US|N300-5):2.0\r\n",
|
||||
"CPE520(TP-LINK|EU|N300-5):1.1\r\n",
|
||||
.support_trail = '\xff',
|
||||
.soft_ver = NULL,
|
||||
|
||||
@ -357,46 +347,6 @@ static struct device_info boards[] = {
|
||||
.last_sysupgrade_partition = "file-system"
|
||||
},
|
||||
|
||||
/** Firmware layout for the A7-V5 */
|
||||
{
|
||||
.id = "ARCHER-A7-V5",
|
||||
.support_list =
|
||||
"SupportList:\n"
|
||||
"{product_name:Archer A7,product_ver:5.0.0,special_id:45550000}\n"
|
||||
"{product_name:Archer A7,product_ver:5.0.0,special_id:55530000}\n"
|
||||
"{product_name:Archer A7,product_ver:5.0.0,special_id:43410000}\n"
|
||||
"{product_name:Archer A7,product_ver:5.0.0,special_id:4A500000}\n"
|
||||
"{product_name:Archer A7,product_ver:5.0.0,special_id:54570000}\n",
|
||||
.support_trail = '\x00',
|
||||
.soft_ver = "soft_ver:1.0.0\n",
|
||||
|
||||
/* We're using a dynamic kernel/rootfs split here */
|
||||
.partitions = {
|
||||
{"factory-boot", 0x00000, 0x20000},
|
||||
{"fs-uboot", 0x20000, 0x20000},
|
||||
{"firmware", 0x40000, 0xec0000}, /* Stock: name os-image base 0x40000 size 0x120000 */
|
||||
/* Stock: name file-system base 0x160000 size 0xda0000 */
|
||||
{"default-mac", 0xf40000, 0x00200},
|
||||
{"pin", 0xf40200, 0x00200},
|
||||
{"device-id", 0xf40400, 0x00100},
|
||||
{"product-info", 0xf40500, 0x0fb00},
|
||||
{"soft-version", 0xf50000, 0x00100},
|
||||
{"extra-para", 0xf51000, 0x01000},
|
||||
{"support-list", 0xf52000, 0x0a000},
|
||||
{"profile", 0xf5c000, 0x04000},
|
||||
{"default-config", 0xf60000, 0x10000},
|
||||
{"user-config", 0xf70000, 0x40000},
|
||||
{"certificate", 0xfb0000, 0x10000},
|
||||
{"partition-table", 0xfc0000, 0x10000},
|
||||
{"log", 0xfd0000, 0x20000},
|
||||
{"radio", 0xff0000, 0x10000},
|
||||
{NULL, 0, 0}
|
||||
},
|
||||
|
||||
.first_sysupgrade_partition = "os-image",
|
||||
.last_sysupgrade_partition = "file-system",
|
||||
},
|
||||
|
||||
/** Firmware layout for the C25v1 */
|
||||
{
|
||||
.id = "ARCHER-C25-V1",
|
||||
@ -408,12 +358,16 @@ static struct device_info boards[] = {
|
||||
.support_trail = '\x00',
|
||||
.soft_ver = "soft_ver:1.0.0\n",
|
||||
|
||||
/* We're using a dynamic kernel/rootfs split here */
|
||||
/**
|
||||
We use a bigger os-image partition than the stock images (and thus
|
||||
smaller file-system), as our kernel doesn't fit in the stock firmware's
|
||||
1MB os-image.
|
||||
*/
|
||||
.partitions = {
|
||||
{"factory-boot", 0x00000, 0x20000},
|
||||
{"fs-uboot", 0x20000, 0x10000},
|
||||
{"firmware", 0x30000, 0x7a0000}, /* Stock: name os-image base 0x30000 size 0x100000 */
|
||||
/* Stock: name file-system base 0x130000 size 0x6a0000 */
|
||||
{"os-image", 0x30000, 0x180000}, /* Stock: base 0x30000 size 0x100000 */
|
||||
{"file-system", 0x1b0000, 0x620000}, /* Stock: base 0x130000 size 0x6a0000 */
|
||||
{"user-config", 0x7d0000, 0x04000},
|
||||
{"default-mac", 0x7e0000, 0x00100},
|
||||
{"device-id", 0x7e0100, 0x00100},
|
||||
@ -459,7 +413,8 @@ static struct device_info boards[] = {
|
||||
{"profile", 0x11700, 0x03900},
|
||||
{"default-config", 0x15000, 0x04000},
|
||||
{"user-config", 0x19000, 0x04000},
|
||||
{"firmware", 0x20000, 0x7c8000},
|
||||
{"os-image", 0x20000, 0x180000},
|
||||
{"file-system", 0x1a0000, 0x648000},
|
||||
{"certyficate", 0x7e8000, 0x08000},
|
||||
{"radio", 0x7f0000, 0x10000},
|
||||
{NULL, 0, 0}
|
||||
@ -482,14 +437,14 @@ static struct device_info boards[] = {
|
||||
.support_trail = '\x00',
|
||||
.soft_ver = "soft_ver:1.0.0\n",
|
||||
|
||||
/* We're using a dynamic kernel/rootfs split here */
|
||||
.partitions = {
|
||||
{"fs-uboot", 0x00000, 0x10000},
|
||||
{"default-mac", 0x10000, 0x00200},
|
||||
{"pin", 0x10200, 0x00200},
|
||||
{"device-id", 0x10400, 0x00100},
|
||||
{"product-info", 0x10500, 0x0fb00},
|
||||
{"firmware", 0x20000, 0xe30000},
|
||||
{"os-image", 0x20000, 0x180000},
|
||||
{"file-system", 0x1a0000, 0xcb0000},
|
||||
{"partition-table", 0xe50000, 0x10000},
|
||||
{"soft-version", 0xe60000, 0x10000},
|
||||
{"support-list", 0xe70000, 0x10000},
|
||||
@ -508,82 +463,6 @@ static struct device_info boards[] = {
|
||||
.last_sysupgrade_partition = "file-system",
|
||||
},
|
||||
|
||||
/** Firmware layout for the C59v2 */
|
||||
{
|
||||
.id = "ARCHER-C59-V2",
|
||||
.vendor = "",
|
||||
.support_list =
|
||||
"SupportList:\r\n"
|
||||
"{product_name:Archer C59,product_ver:2.0.0,special_id:00000000}\r\n"
|
||||
"{product_name:Archer C59,product_ver:2.0.0,special_id:45550000}\r\n"
|
||||
"{product_name:Archer C59,product_ver:2.0.0,special_id:55530000}\r\n",
|
||||
.support_trail = '\x00',
|
||||
.soft_ver = "soft_ver:2.0.0 Build 20161206 rel.7303\n",
|
||||
|
||||
/** We're using a dynamic kernel/rootfs split here */
|
||||
.partitions = {
|
||||
{"factory-boot", 0x00000, 0x20000},
|
||||
{"fs-uboot", 0x20000, 0x10000},
|
||||
{"default-mac", 0x30000, 0x00200},
|
||||
{"pin", 0x30200, 0x00200},
|
||||
{"device-id", 0x30400, 0x00100},
|
||||
{"product-info", 0x30500, 0x0fb00},
|
||||
{"firmware", 0x40000, 0xe10000},
|
||||
{"partition-table", 0xe50000, 0x10000},
|
||||
{"soft-version", 0xe60000, 0x10000},
|
||||
{"support-list", 0xe70000, 0x10000},
|
||||
{"profile", 0xe80000, 0x10000},
|
||||
{"default-config", 0xe90000, 0x10000},
|
||||
{"user-config", 0xea0000, 0x40000},
|
||||
{"usb-config", 0xee0000, 0x10000},
|
||||
{"certificate", 0xef0000, 0x10000},
|
||||
{"extra-para", 0xf00000, 0x10000},
|
||||
{"qos-db", 0xf10000, 0x30000},
|
||||
{"log", 0xfe0000, 0x10000},
|
||||
{"radio", 0xff0000, 0x10000},
|
||||
{NULL, 0, 0}
|
||||
},
|
||||
|
||||
.first_sysupgrade_partition = "os-image",
|
||||
.last_sysupgrade_partition = "file-system",
|
||||
},
|
||||
|
||||
/** Firmware layout for the C6v2 */
|
||||
{
|
||||
.id = "ARCHER-C6-V2",
|
||||
.vendor = "",
|
||||
.support_list =
|
||||
"SupportList:\r\n"
|
||||
"{product_name:Archer C6,product_ver:2.0.0,special_id:45550000}\r\n"
|
||||
"{product_name:Archer C6,product_ver:2.0.0,special_id:52550000}\r\n"
|
||||
"{product_name:Archer C6,product_ver:2.0.0,special_id:4A500000}\r\n",
|
||||
.support_trail = '\x00',
|
||||
.soft_ver = "soft_ver:1.0.0\n",
|
||||
|
||||
.partitions = {
|
||||
{"fs-uboot", 0x00000, 0x20000},
|
||||
{"default-mac", 0x20000, 0x00200},
|
||||
{"pin", 0x20200, 0x00100},
|
||||
{"product-info", 0x20300, 0x00200},
|
||||
{"device-id", 0x20500, 0x0fb00},
|
||||
{"firmware", 0x30000, 0x7a9400},
|
||||
{"soft-version", 0x7d9400, 0x00100},
|
||||
{"extra-para", 0x7d9500, 0x00100},
|
||||
{"support-list", 0x7d9600, 0x00200},
|
||||
{"profile", 0x7d9800, 0x03000},
|
||||
{"default-config", 0x7dc800, 0x03000},
|
||||
{"partition-table", 0x7df800, 0x00800},
|
||||
{"user-config", 0x7e0000, 0x0c000},
|
||||
{"certificate", 0x7ec000, 0x04000},
|
||||
{"radio", 0x7f0000, 0x10000},
|
||||
{NULL, 0, 0}
|
||||
},
|
||||
|
||||
.first_sysupgrade_partition = "os-image",
|
||||
.last_sysupgrade_partition = "file-system",
|
||||
},
|
||||
|
||||
|
||||
/** Firmware layout for the C60v1 */
|
||||
{
|
||||
.id = "ARCHER-C60-V1",
|
||||
@ -608,7 +487,8 @@ static struct device_info boards[] = {
|
||||
{"profile", 0x11700, 0x03900},
|
||||
{"default-config", 0x15000, 0x04000},
|
||||
{"user-config", 0x19000, 0x04000},
|
||||
{"firmware", 0x20000, 0x7c8000},
|
||||
{"os-image", 0x20000, 0x180000},
|
||||
{"file-system", 0x1a0000, 0x648000},
|
||||
{"certyficate", 0x7e8000, 0x08000},
|
||||
{"radio", 0x7f0000, 0x10000},
|
||||
{NULL, 0, 0}
|
||||
@ -637,7 +517,8 @@ static struct device_info boards[] = {
|
||||
{"product-info", 0x1fe00, 0x00100},
|
||||
{"device-id", 0x1ff00, 0x00100},
|
||||
{"fs-uboot", 0x20000, 0x10000},
|
||||
{"firmware", 0x30000, 0x7a0000},
|
||||
{"os-image", 0x30000, 0x180000},
|
||||
{"file-system", 0x1b0000, 0x620000},
|
||||
{"soft-version", 0x7d9500, 0x00100},
|
||||
{"support-list", 0x7d9600, 0x00100},
|
||||
{"extra-para", 0x7d9700, 0x00100},
|
||||
@ -707,12 +588,16 @@ static struct device_info boards[] = {
|
||||
.support_trail = '\x00',
|
||||
.soft_ver = "soft_ver:1.0.0\n",
|
||||
|
||||
/* We're using a dynamic kernel/rootfs split here */
|
||||
/**
|
||||
We use a bigger os-image partition than the stock images (and thus
|
||||
smaller file-system), as our kernel doesn't fit in the stock firmware's
|
||||
1MB os-image.
|
||||
*/
|
||||
.partitions = {
|
||||
{"factory-boot", 0x00000, 0x20000},
|
||||
{"fs-uboot", 0x20000, 0x20000},
|
||||
{"firmware", 0x40000, 0xEC0000}, /* Stock: name os-image base 0x40000 size 0x120000 */
|
||||
/* Stock: name file-system base 0x160000 size 0xda0000 */
|
||||
{"os-image", 0x40000, 0x180000}, /* Stock: base 0x40000 size 0x120000 */
|
||||
{"file-system", 0x1c0000, 0xd40000}, /* Stock: base 0x160000 size 0xda0000 */
|
||||
{"default-mac", 0xf00000, 0x00200},
|
||||
{"pin", 0xf00200, 0x00200},
|
||||
{"device-id", 0xf00400, 0x00100},
|
||||
@ -750,7 +635,11 @@ static struct device_info boards[] = {
|
||||
.support_trail = '\x00',
|
||||
.soft_ver = "soft_ver:1.0.0\n",
|
||||
|
||||
/* We're using a dynamic kernel/rootfs split here */
|
||||
/**
|
||||
We use a bigger os-image partition than the stock images (and thus
|
||||
smaller file-system), as our kernel doesn't fit in the stock firmware's
|
||||
1MB os-image.
|
||||
*/
|
||||
.partitions = {
|
||||
{"factory-boot", 0x00000, 0x20000},
|
||||
{"fs-uboot", 0x20000, 0x20000},
|
||||
@ -767,8 +656,8 @@ static struct device_info boards[] = {
|
||||
{"user-config", 0x80000, 0x40000},
|
||||
|
||||
|
||||
{"firmware", 0xc0000, 0xf00000}, /* Stock: name os-image base 0xc0000 size 0x120000 */
|
||||
/* Stock: name file-system base 0x1e0000 size 0xde0000 */
|
||||
{"os-image", 0xc0000, 0x180000}, /* Stock: base 0xc0000 size 0x120000 */
|
||||
{"file-system", 0x240000, 0xd80000}, /* Stock: base 0x1e0000 size 0xde0000 */
|
||||
|
||||
{"log", 0xfc0000, 0x20000},
|
||||
{"certificate", 0xfe0000, 0x10000},
|
||||
@ -942,7 +831,8 @@ static struct device_info boards[] = {
|
||||
.partitions = {
|
||||
{"factory-boot", 0x00000, 0x20000},
|
||||
{"fs-uboot", 0x20000, 0x20000},
|
||||
{"firmware", 0x40000, 0xec0000},
|
||||
{"os-image", 0x40000, 0x180000},
|
||||
{"file-system", 0x1c0000, 0xd40000},
|
||||
{"default-mac", 0xf00000, 0x00200},
|
||||
{"pin", 0xf00200, 0x00200},
|
||||
{"device-id", 0xf00400, 0x00100},
|
||||
@ -974,10 +864,15 @@ static struct device_info boards[] = {
|
||||
.support_trail = '\x00',
|
||||
.soft_ver = NULL,
|
||||
|
||||
/* We're using a dynamic kernel/rootfs split here */
|
||||
/**
|
||||
We use a bigger os-image partition than the stock images (and thus
|
||||
smaller file-system), as our kernel doesn't fit in the stock firmware's
|
||||
1MB os-image.
|
||||
*/
|
||||
.partitions = {
|
||||
{"fs-uboot", 0x00000, 0x20000},
|
||||
{"firmware", 0x20000, 0xf30000},
|
||||
{"os-image", 0x20000, 0x180000},
|
||||
{"file-system", 0x1a0000, 0xdb0000},
|
||||
{"default-mac", 0xf50000, 0x00200},
|
||||
{"pin", 0xf50200, 0x00200},
|
||||
{"product-info", 0xf50400, 0x0fc00},
|
||||
@ -1013,7 +908,8 @@ static struct device_info boards[] = {
|
||||
*/
|
||||
.partitions = {
|
||||
{"fs-uboot", 0x00000, 0x20000},
|
||||
{"firmware", 0x20000, 0x730000},
|
||||
{"os-image", 0x20000, 0x180000},
|
||||
{"file-system", 0x1a0000, 0x5b0000},
|
||||
{"default-mac", 0x750000, 0x00200},
|
||||
{"pin", 0x750200, 0x00200},
|
||||
{"product-info", 0x750400, 0x0fc00},
|
||||
@ -1045,7 +941,8 @@ static struct device_info boards[] = {
|
||||
|
||||
.partitions = {
|
||||
{"fs-uboot", 0x00000, 0x20000},
|
||||
{"firmware", 0x20000, 0xe20000},
|
||||
{"os-image", 0x20000, 0x180000},
|
||||
{"file-system", 0x1a0000, 0xca0000},
|
||||
{"default-mac", 0xe40000, 0x00200},
|
||||
{"pin", 0xe40200, 0x00200},
|
||||
{"product-info", 0xe40400, 0x0fc00},
|
||||
@ -1084,10 +981,14 @@ static struct device_info boards[] = {
|
||||
.support_trail = '\x00',
|
||||
.soft_ver = NULL,
|
||||
|
||||
/** We're using a dynamic kernel/rootfs split here */
|
||||
/**
|
||||
The original os-image partition is too small,
|
||||
so we enlarge it to 1.75M
|
||||
*/
|
||||
.partitions = {
|
||||
{"fs-uboot", 0x00000, 0x20000},
|
||||
{"firmware", 0x20000, 0x5e0000},
|
||||
{"os-image", 0x20000, 0x1c0000},
|
||||
{"file-system", 0x1e0000, 0x420000},
|
||||
{"partition-table", 0x600000, 0x02000},
|
||||
{"default-mac", 0x610000, 0x00020},
|
||||
{"pin", 0x610100, 0x00020},
|
||||
@ -1122,10 +1023,15 @@ static struct device_info boards[] = {
|
||||
.support_trail = '\x00',
|
||||
.soft_ver = NULL,
|
||||
|
||||
/* We're using a dynamic kernel/rootfs split here */
|
||||
/**
|
||||
The flash partition table for RE355;
|
||||
it is almost the same as the one used by the stock images,
|
||||
576KB were moved from file-system to os-image.
|
||||
*/
|
||||
.partitions = {
|
||||
{"fs-uboot", 0x00000, 0x20000},
|
||||
{"firmware", 0x20000, 0x5e0000},
|
||||
{"os-image", 0x20000, 0x180000},
|
||||
{"file-system", 0x1a0000, 0x460000},
|
||||
{"partition-table", 0x600000, 0x02000},
|
||||
{"default-mac", 0x610000, 0x00020},
|
||||
{"pin", 0x610100, 0x00020},
|
||||
@ -1160,10 +1066,15 @@ static struct device_info boards[] = {
|
||||
.support_trail = '\x00',
|
||||
.soft_ver = NULL,
|
||||
|
||||
/** We're using a dynamic kernel/rootfs split here */
|
||||
/**
|
||||
The flash partition table for RE450;
|
||||
it is almost the same as the one used by the stock images,
|
||||
576KB were moved from file-system to os-image.
|
||||
*/
|
||||
.partitions = {
|
||||
{"fs-uboot", 0x00000, 0x20000},
|
||||
{"firmware", 0x20000, 0x5e0000},
|
||||
{"os-image", 0x20000, 0x180000},
|
||||
{"file-system", 0x1a0000, 0x460000},
|
||||
{"partition-table", 0x600000, 0x02000},
|
||||
{"default-mac", 0x610000, 0x00020},
|
||||
{"pin", 0x610100, 0x00020},
|
||||
@ -1181,46 +1092,6 @@ static struct device_info boards[] = {
|
||||
.last_sysupgrade_partition = "file-system"
|
||||
},
|
||||
|
||||
/** Firmware layout for the RE450 v2 */
|
||||
{
|
||||
.id = "RE450-V2",
|
||||
.vendor = "",
|
||||
.support_list =
|
||||
"SupportList:\r\n"
|
||||
"{product_name:RE450,product_ver:2.0.0,special_id:00000000}\r\n"
|
||||
"{product_name:RE450,product_ver:2.0.0,special_id:55530000}\r\n"
|
||||
"{product_name:RE450,product_ver:2.0.0,special_id:45550000}\r\n"
|
||||
"{product_name:RE450,product_ver:2.0.0,special_id:4A500000}\r\n"
|
||||
"{product_name:RE450,product_ver:2.0.0,special_id:43410000}\r\n"
|
||||
"{product_name:RE450,product_ver:2.0.0,special_id:41550000}\r\n"
|
||||
"{product_name:RE450,product_ver:2.0.0,special_id:41530000}\r\n"
|
||||
"{product_name:RE450,product_ver:2.0.0,special_id:4B520000}\r\n"
|
||||
"{product_name:RE450,product_ver:2.0.0,special_id:42520000}\r\n",
|
||||
.support_trail = '\x00',
|
||||
.soft_ver = NULL,
|
||||
|
||||
/* We're using a dynamic kernel/rootfs split here */
|
||||
.partitions = {
|
||||
{"fs-uboot", 0x00000, 0x20000},
|
||||
{"firmware", 0x20000, 0x5e0000},
|
||||
{"partition-table", 0x600000, 0x02000},
|
||||
{"default-mac", 0x610000, 0x00020},
|
||||
{"pin", 0x610100, 0x00020},
|
||||
{"product-info", 0x611100, 0x01000},
|
||||
{"soft-version", 0x620000, 0x01000},
|
||||
{"support-list", 0x621000, 0x01000},
|
||||
{"profile", 0x622000, 0x08000},
|
||||
{"user-config", 0x630000, 0x10000},
|
||||
{"default-config", 0x640000, 0x10000},
|
||||
{"radio", 0x7f0000, 0x10000},
|
||||
|
||||
{NULL, 0, 0}
|
||||
},
|
||||
|
||||
.first_sysupgrade_partition = "os-image",
|
||||
.last_sysupgrade_partition = "file-system"
|
||||
},
|
||||
|
||||
{}
|
||||
};
|
||||
|
||||
@ -1356,7 +1227,7 @@ static struct image_partition_entry make_soft_version_from_string(const char *so
|
||||
}
|
||||
|
||||
/** Generates the support-list partition */
|
||||
static struct image_partition_entry make_support_list(struct device_info *info) {
|
||||
static struct image_partition_entry make_support_list(const struct device_info *info) {
|
||||
size_t len = strlen(info->support_list);
|
||||
struct image_partition_entry entry = alloc_image_partition("support-list", len + 9);
|
||||
|
||||
@ -1369,7 +1240,7 @@ static struct image_partition_entry make_support_list(struct device_info *info)
|
||||
}
|
||||
|
||||
/** Creates a new image partition with an arbitrary name from a file */
|
||||
static struct image_partition_entry read_file(const char *part_name, const char *filename, bool add_jffs2_eof, struct flash_partition_entry *file_system_partition) {
|
||||
static struct image_partition_entry read_file(const char *part_name, const char *filename, bool add_jffs2_eof) {
|
||||
struct stat statbuf;
|
||||
|
||||
if (stat(filename, &statbuf) < 0)
|
||||
@ -1378,10 +1249,7 @@ static struct image_partition_entry read_file(const char *part_name, const char
|
||||
size_t len = statbuf.st_size;
|
||||
|
||||
if (add_jffs2_eof)
|
||||
if (file_system_partition)
|
||||
len = ALIGN(len + file_system_partition->base, 0x10000) + sizeof(jffs2_eof_mark) - file_system_partition->base;
|
||||
else
|
||||
len = ALIGN(len, 0x10000) + sizeof(jffs2_eof_mark);
|
||||
len = ALIGN(len, 0x10000) + sizeof(jffs2_eof_mark);
|
||||
|
||||
struct image_partition_entry entry = alloc_image_partition(part_name, len);
|
||||
|
||||
@ -1497,7 +1365,7 @@ static void put_md5(uint8_t *md5, uint8_t *buffer, unsigned int len) {
|
||||
1014-1813 Image partition table (2048 bytes, padded with 0xff)
|
||||
1814-xxxx Firmware partitions
|
||||
*/
|
||||
static void * generate_factory_image(struct device_info *info, const struct image_partition_entry *parts, size_t *len) {
|
||||
static void * generate_factory_image(const struct device_info *info, const struct image_partition_entry *parts, size_t *len) {
|
||||
*len = 0x1814;
|
||||
|
||||
size_t i;
|
||||
@ -1530,7 +1398,7 @@ static void * generate_factory_image(struct device_info *info, const struct imag
|
||||
should be generalized when TP-LINK starts building its safeloader into hardware with
|
||||
different flash layouts.
|
||||
*/
|
||||
static void * generate_sysupgrade_image(struct device_info *info, const struct image_partition_entry *image_parts, size_t *len) {
|
||||
static void * generate_sysupgrade_image(const struct device_info *info, const struct image_partition_entry *image_parts, size_t *len) {
|
||||
size_t i, j;
|
||||
size_t flash_first_partition_index = 0;
|
||||
size_t flash_last_partition_index = 0;
|
||||
@ -1593,53 +1461,10 @@ static void build_image(const char *output,
|
||||
uint32_t rev,
|
||||
bool add_jffs2_eof,
|
||||
bool sysupgrade,
|
||||
struct device_info *info) {
|
||||
|
||||
size_t i;
|
||||
const struct device_info *info) {
|
||||
|
||||
struct image_partition_entry parts[7] = {};
|
||||
|
||||
struct flash_partition_entry *firmware_partition = NULL;
|
||||
struct flash_partition_entry *os_image_partition = NULL;
|
||||
struct flash_partition_entry *file_system_partition = NULL;
|
||||
size_t firmware_partition_index = 0;
|
||||
|
||||
for (i = 0; info->partitions[i].name; i++) {
|
||||
if (!strcmp(info->partitions[i].name, "firmware"))
|
||||
{
|
||||
firmware_partition = &info->partitions[i];
|
||||
firmware_partition_index = i;
|
||||
}
|
||||
}
|
||||
|
||||
if (firmware_partition)
|
||||
{
|
||||
os_image_partition = &info->partitions[firmware_partition_index];
|
||||
file_system_partition = &info->partitions[firmware_partition_index + 1];
|
||||
|
||||
struct stat kernel;
|
||||
if (stat(kernel_image, &kernel) < 0)
|
||||
error(1, errno, "unable to stat file `%s'", kernel_image);
|
||||
|
||||
if (kernel.st_size > firmware_partition->size)
|
||||
error(1, 0, "kernel overflowed firmware partition\n");
|
||||
|
||||
for (i = MAX_PARTITIONS-1; i >= firmware_partition_index + 1; i--)
|
||||
info->partitions[i+1] = info->partitions[i];
|
||||
|
||||
file_system_partition->name = "file-system";
|
||||
file_system_partition->base = firmware_partition->base + kernel.st_size;
|
||||
|
||||
/* Align partition start to erase blocks for factory images only */
|
||||
if (!sysupgrade)
|
||||
file_system_partition->base = ALIGN(firmware_partition->base + kernel.st_size, 0x10000);
|
||||
|
||||
file_system_partition->size = firmware_partition->size - file_system_partition->base;
|
||||
|
||||
os_image_partition->name = "os-image";
|
||||
os_image_partition->size = kernel.st_size;
|
||||
}
|
||||
|
||||
parts[0] = make_partition_table(info->partitions);
|
||||
if (info->soft_ver)
|
||||
parts[1] = make_soft_version_from_string(info->soft_ver);
|
||||
@ -1647,22 +1472,18 @@ static void build_image(const char *output,
|
||||
parts[1] = make_soft_version(rev);
|
||||
|
||||
parts[2] = make_support_list(info);
|
||||
parts[3] = read_file("os-image", kernel_image, false, NULL);
|
||||
parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof, file_system_partition);
|
||||
parts[3] = read_file("os-image", kernel_image, false);
|
||||
parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof);
|
||||
|
||||
/* Some devices need the extra-para partition to accept the firmware */
|
||||
if (strcasecmp(info->id, "ARCHER-C25-V1") == 0 ||
|
||||
strcasecmp(info->id, "ARCHER-C59-V2") == 0 ||
|
||||
strcasecmp(info->id, "ARCHER-C60-V2") == 0 ||
|
||||
strcasecmp(info->id, "TLWR1043NV5") == 0) {
|
||||
const char mdat[11] = {0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00};
|
||||
parts[5] = put_data("extra-para", mdat, 11);
|
||||
} else if (strcasecmp(info->id, "ARCHER-A7-V5") == 0 || strcasecmp(info->id, "ARCHER-C7-V4") == 0 || strcasecmp(info->id, "ARCHER-C7-V5") == 0) {
|
||||
} else if (strcasecmp(info->id, "ARCHER-C7-V4") == 0 || strcasecmp(info->id, "ARCHER-C7-V5") == 0) {
|
||||
const char mdat[11] = {0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0xca, 0x00, 0x01, 0x00, 0x00};
|
||||
parts[5] = put_data("extra-para", mdat, 11);
|
||||
} else if (strcasecmp(info->id, "ARCHER-C6-V2") == 0) {
|
||||
const char mdat[11] = {0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00};
|
||||
parts[5] = put_data("extra-para", mdat, 11);
|
||||
}
|
||||
|
||||
size_t len;
|
||||
@ -1683,6 +1504,7 @@ static void build_image(const char *output,
|
||||
|
||||
free(image);
|
||||
|
||||
size_t i;
|
||||
for (i = 0; parts[i].name; i++)
|
||||
free_image_partition(parts[i]);
|
||||
}
|
||||
@ -1712,7 +1534,7 @@ static void usage(const char *argv0) {
|
||||
};
|
||||
|
||||
|
||||
static struct device_info *find_board(const char *id)
|
||||
static const struct device_info *find_board(const char *id)
|
||||
{
|
||||
struct device_info *board = NULL;
|
||||
|
||||
@ -1744,10 +1566,6 @@ static int add_flash_partition(
|
||||
}
|
||||
|
||||
part_list->name = calloc(1, strlen(name) + 1);
|
||||
if (!part_list->name) {
|
||||
error(1, 0, "Unable to allocate memory");
|
||||
}
|
||||
|
||||
memcpy((char *)part_list->name, name, strlen(name));
|
||||
part_list->base = base;
|
||||
part_list->size = size;
|
||||
@ -2046,7 +1864,7 @@ int main(int argc, char *argv[]) {
|
||||
const char *extract_image = NULL, *output_directory = NULL, *convert_image = NULL;
|
||||
bool add_jffs2_eof = false, sysupgrade = false;
|
||||
unsigned rev = 0;
|
||||
struct device_info *info;
|
||||
const struct device_info *info;
|
||||
set_source_date_epoch();
|
||||
|
||||
while (true) {
|
||||
|
||||
0
tools/firmware-utils/src/trx.c
Executable file → Normal file
0
tools/firmware-utils/src/trx.c
Executable file → Normal file
0
tools/firmware-utils/src/trx2edips.c
Executable file → Normal file
0
tools/firmware-utils/src/trx2edips.c
Executable file → Normal file
0
tools/firmware-utils/src/trx2usr.c
Executable file → Normal file
0
tools/firmware-utils/src/trx2usr.c
Executable file → Normal file
0
tools/firmware-utils/src/wrt400n.c
Executable file → Normal file
0
tools/firmware-utils/src/wrt400n.c
Executable file → Normal file
39
tools/firmware-utils/src/xorimage.c
Executable file → Normal file
39
tools/firmware-utils/src/xorimage.c
Executable file → Normal file
@ -20,13 +20,11 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
static char default_pattern[] = "12345678";
|
||||
static int is_hex_pattern;
|
||||
|
||||
|
||||
int xor_data(uint8_t *data, size_t len, const uint8_t *pattern, int p_len, int p_off)
|
||||
@ -45,7 +43,7 @@ void usage(void) __attribute__ (( __noreturn__ ));
|
||||
|
||||
void usage(void)
|
||||
{
|
||||
fprintf(stderr, "Usage: xorimage [-i infile] [-o outfile] [-p <pattern>] [-x]\n");
|
||||
fprintf(stderr, "Usage: xorimage [-i infile] [-o outfile] [-p <pattern>]\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
@ -58,14 +56,12 @@ int main(int argc, char **argv)
|
||||
char *ifn = NULL;
|
||||
char *ofn = NULL;
|
||||
const char *pattern = default_pattern;
|
||||
char hex_pattern[128];
|
||||
unsigned int hex_buf;
|
||||
int c;
|
||||
int v0, v1, v2;
|
||||
size_t n;
|
||||
int p_len, p_off = 0;
|
||||
|
||||
while ((c = getopt(argc, argv, "i:o:p:xh")) != -1) {
|
||||
while ((c = getopt(argc, argv, "i:o:p:h")) != -1) {
|
||||
switch (c) {
|
||||
case 'i':
|
||||
ifn = optarg;
|
||||
@ -76,9 +72,6 @@ int main(int argc, char **argv)
|
||||
case 'p':
|
||||
pattern = optarg;
|
||||
break;
|
||||
case 'x':
|
||||
is_hex_pattern = true;
|
||||
break;
|
||||
case 'h':
|
||||
default:
|
||||
usage();
|
||||
@ -107,27 +100,6 @@ int main(int argc, char **argv)
|
||||
usage();
|
||||
}
|
||||
|
||||
if (is_hex_pattern) {
|
||||
int i;
|
||||
|
||||
if ((p_len / 2) > sizeof(hex_pattern)) {
|
||||
fprintf(stderr, "provided hex pattern is too long\n");
|
||||
usage();
|
||||
}
|
||||
|
||||
if (p_len % 2 != 0) {
|
||||
fprintf(stderr, "the number of characters (hex) is incorrect\n");
|
||||
usage();
|
||||
}
|
||||
|
||||
for (i = 0; i < (p_len / 2); i++) {
|
||||
if (sscanf(pattern + (i * 2), "%2x", &hex_buf) < 0) {
|
||||
fprintf(stderr, "invalid hex digit around %d\n", i * 2);
|
||||
usage();
|
||||
}
|
||||
hex_pattern[i] = (char)hex_buf;
|
||||
}
|
||||
}
|
||||
|
||||
while ((n = fread(buf, 1, sizeof(buf), in)) > 0) {
|
||||
if (n < sizeof(buf)) {
|
||||
@ -138,12 +110,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
if (is_hex_pattern) {
|
||||
p_off = xor_data(buf, n, hex_pattern, (p_len / 2),
|
||||
p_off);
|
||||
} else {
|
||||
p_off = xor_data(buf, n, pattern, p_len, p_off);
|
||||
}
|
||||
p_off = xor_data(buf, n, pattern, p_len, p_off);
|
||||
|
||||
if (!fwrite(buf, n, 1, out)) {
|
||||
FWRITE_ERROR:
|
||||
|
||||
0
tools/firmware-utils/src/zyimage.c
Executable file → Normal file
0
tools/firmware-utils/src/zyimage.c
Executable file → Normal file
0
tools/firmware-utils/src/zynos.h
Executable file → Normal file
0
tools/firmware-utils/src/zynos.h
Executable file → Normal file
0
tools/firmware-utils/src/zyxbcm.c
Executable file → Normal file
0
tools/firmware-utils/src/zyxbcm.c
Executable file → Normal file
Loading…
Reference in New Issue
Block a user