diff options
Diffstat (limited to 'tools/sign-nand-image.c')
-rw-r--r-- | tools/sign-nand-image.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/tools/sign-nand-image.c b/tools/sign-nand-image.c new file mode 100644 index 00000000000..324ae227e4a --- /dev/null +++ b/tools/sign-nand-image.c @@ -0,0 +1,80 @@ +/* + * signGP.c + * Read the x-load.bin file and write out the x-load.bin.ift file. + * The signed image is the original pre-pended with the size of the image + * and the load address. If not entered on command line, file name is + * assumed to be x-load.bin in current directory and load address is + * 0x40200800. */ + +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <sys/stat.h> +#include <string.h> +#include <malloc.h> + +#define SIGNATURE (('S' << 24) | ('g' << 16) | ('n' << 8) | 'P') + +int main(int argc, char *argv[]) +{ + int i; + size_t ret; + char ifname[FILENAME_MAX], ofname[FILENAME_MAX], ch; + FILE *ifile, *ofile; + unsigned long loadaddr, len; + struct stat sinfo; + unsigned long signature = SIGNATURE; + + /* Default to x-load.bin and 0x40200800. */ + strcpy(ifname, "x-load.bin"); + loadaddr = 0x40200800; + + if ((argc == 2) || (argc == 3)) + strcpy(ifname, argv[1]); + + if (argc == 3) + loadaddr = strtoul(argv[2], NULL, 16); + + /* Form the output file name. */ + strcpy(ofname, ifname); + strcat(ofname, ".ift"); + + /* Open the input file. */ + ifile = fopen(ifname, "rb"); + if (ifile == NULL) { + printf("Cannot open %s\n", ifname); + exit(0); + } + /* Get file length. */ + stat(ifname, &sinfo); + len = sinfo.st_size; + + /* Open the output file and write it. */ + ofile = fopen(ofname, "wb"); + if (ofile == NULL) { + printf("Cannot open %s\n", ofname); + fclose(ifile); + exit(0); + } + /* Pad 1 sector of zeroes. + * ch = 0x00; + * for (i=0; i<0x200; i++) + * fwrite(&ch, 1, 1, ofile); */ + + fwrite(&signature, 1, 4, ofile); + fwrite(&len, 1, 4, ofile); + fwrite(&loadaddr, 1, 4, ofile); + for (i = 0; i < len; i++) { + ret = fread(&ch, 1, 1, ifile); + if (ret != 1) { + fprintf(stderr, "fread didn't return 1!\n"); + exit(-1); + } + fwrite(&ch, 1, 1, ofile); + } + + fclose(ifile); + fclose(ofile); + + return 0; +} |