drivers/atm/fore200e_mkfirm.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following functions.
  1. usage
  2. main

/*
  $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)
/* [<][>][^][v][top][bottom][index][help] */
{
    fprintf(stderr,
            "%s: [-v] [-k] [-b basename ] [-i firmware.bin] [-o firmware.c]\n",
            progname);
    exit(-1);
}


int main(int argc, char** argv)
/* [<][>][^][v][top][bottom][index][help] */
{
    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);
}

/* [<][>][^][v][top][bottom][index][help] */