/*
  $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);
}
