diff options
Diffstat (limited to 'utils/mktccboot/main.c')
-rw-r--r-- | utils/mktccboot/main.c | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/utils/mktccboot/main.c b/utils/mktccboot/main.c new file mode 100644 index 0000000000..4dd5d0c6c4 --- /dev/null +++ b/utils/mktccboot/main.c @@ -0,0 +1,133 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2007 by Dave Chapman + * + * Based on mkboot, Copyright (C) 2005 by Linus Nielsen Feltzing + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <inttypes.h> +#include "mktccboot.h" +#include "telechips.h" + +static void usage(void) +{ + printf("Usage: mktccboot <firmware file> <boot file> <output file>\n"); + + exit(1); +} + +int main(int argc, char *argv[]) +{ + char *infile, *bootfile, *outfile; + int fdout = -1; + int n, of_size, boot_size, patched_size; + unsigned char *of_buf; + unsigned char *boot_buf = NULL; + unsigned char* image = NULL; + int ret = 0; + + if(argc < 3) { + usage(); + } + + infile = argv[1]; + bootfile = argv[2]; + outfile = argv[3]; + + /* Read OF and boot files */ + of_buf = file_read(infile, &of_size); + if (!of_buf) + { + ret = 1; + goto error_exit; + } + + /* Validate input file */ + if (test_firmware_tcc(of_buf, of_size)) + { + printf("[ERR] Unknown OF file used, aborting\n"); + ret = 2; + goto error_exit; + } + + boot_buf = file_read(bootfile, &boot_size); + if (!boot_buf) + { + ret = 3; + goto error_exit; + } + + /* Allocate buffer for patched firmware */ + image = malloc(of_size + boot_size); + if (image == NULL) + { + printf("[ERR] Could not allocate memory, aborting\n"); + ret = 4; + goto error_exit; + } + + /* Create the patched firmware */ + image = patch_firmware_tcc(of_buf, of_size, boot_buf, boot_size, + &patched_size); + if (!image) + { + printf("[ERR] Error creating patched firmware, aborting\n"); + ret = 5; + goto error_exit; + } + + fdout = open(outfile, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); + if (fdout < 0) + { + perror(outfile); + ret = 6; + goto error_exit; + } + + n = write(fdout, image, patched_size); + if (n != patched_size) + { + printf("[ERR] Could not write output file %s\n",outfile); + ret = 7; + goto error_exit; + } + +error_exit: + + if (fdout >= 0) + close(fdout); + + if (of_buf) + free(of_buf); + + if (boot_buf) + free(boot_buf); + + if (image) + free(image); + + return ret; +} + |