/* $Id: fore200e_mkfirm.c,v 1.1 2000/02/21 16:04:32 davem Exp $ mkfirm.c: generates a C readable file from a binary firmware image Christophe Lizzi (lizzi@{csti.fr, cnam.fr}), June 1999. This software may be used and distributed according to the terms of the GNU General Public License, incorporated herein by reference. */ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <time.h> char* default_basename = "pca200e"; /* was initially written for the PCA-200E firmware */ char* default_infname = "<stdin>"; char* default_outfname = "<stdout>"; char* progname; int verbose = 0; int inkernel = 0; void usage(void) { fprintf(stderr, "%s: [-v] [-k] [-b basename ] [-i firmware.bin] [-o firmware.c]\n", progname); exit(-1); } int main(int argc, char** argv) { time_t now; char* infname = NULL; char* outfname = NULL; char* basename = NULL; FILE* infile; FILE* outfile; unsigned firmsize; int c; progname = *(argv++); while (argc > 1) { if ((*argv)[0] == '-') { switch ((*argv)[1]) { case 'i': if (argc-- < 3) usage(); infname = *(++argv); break; case 'o': if (argc-- < 3) usage(); outfname = *(++argv); break; case 'b': if (argc-- < 3) usage(); basename = *(++argv); break; case 'v': verbose = 1; break; case 'k': inkernel = 1; break; default: usage(); } } else { usage(); } argc--; argv++; } if (infname != NULL) { infile = fopen(infname, "r"); if (infile == NULL) { fprintf(stderr, "%s: can't open %s for reading\n", progname, infname); exit(-2); } } else { infile = stdin; infname = default_infname; } if (outfname) { outfile = fopen(outfname, "w"); if (outfile == NULL) { fprintf(stderr, "%s: can't open %s for writing\n", progname, outfname); exit(-3); } } else { outfile = stdout; outfname = default_outfname; } if (basename == NULL) basename = default_basename; if (verbose) { fprintf(stderr, "%s: input file = %s\n", progname, infname ); fprintf(stderr, "%s: output file = %s\n", progname, outfname ); fprintf(stderr, "%s: firmware basename = %s\n", progname, basename ); } time(&now); fprintf(outfile, "/*\n generated by %s from %s on %s" " DO NOT EDIT!\n*/\n\n", progname, infname, ctime(&now)); if (inkernel) fprintf(outfile, "#include <linux/init.h>\n\n" ); /* XXX force 32 bit alignment? */ fprintf(outfile, "const unsigned char%s %s_data[] = {\n", inkernel ? " __initdata" : "", basename ); c = getc(infile); fprintf(outfile,"\t0x%02x", c); firmsize = 1; while ((c = getc(infile)) >= 0) { if (firmsize++ % 8) fprintf(outfile,", 0x%02x", c); else fprintf(outfile,",\n\t0x%02x", c); } fprintf(outfile, "\n};\n\n"); fprintf(outfile, "const unsigned int%s %s_size = %u;\n", inkernel ? " __initdata" : "", basename, firmsize ); if (infile != stdin) fclose(infile); if (outfile != stdout) fclose(outfile); if(verbose) fprintf(stderr, "%s: firmware size = %u\n", progname, firmsize); exit(0); }