blob: 520e14b488ffedfefee122629e1c23af6c7d0f2a [file] [log] [blame]
/*
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);
}