patch-2.3.48 linux/drivers/atm/fore200e_mkfirm.c

Next file: linux/drivers/atm/iphase.c
Previous file: linux/drivers/atm/fore200e_firmware_copyright
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.3.47/linux/drivers/atm/fore200e_mkfirm.c linux/drivers/atm/fore200e_mkfirm.c
@@ -0,0 +1,155 @@
+/*
+  $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 <sys/types.h>
+#include <sys/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);
+}

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)