Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2   $Id: fore200e_mkfirm.c,v 1.1 2000/02/21 16:04:32 davem Exp $
  3 
  4   mkfirm.c: generates a C readable file from a binary firmware image
  5 
  6   Christophe Lizzi (lizzi@{csti.fr, cnam.fr}), June 1999.
  7   
  8   This software may be used and distributed according to the terms
  9   of the GNU General Public License, incorporated herein by reference.
 10 */
 11 
 12 #include <stdio.h>
 13 #include <stdlib.h>
 14 #include <sys/types.h>
 15 #include <time.h>
 16 
 17 char* default_basename = "pca200e"; /* was initially written for the PCA-200E firmware */
 18 char* default_infname  = "<stdin>";
 19 char* default_outfname = "<stdout>";
 20 
 21 char* progname;
 22 int   verbose  = 0;
 23 int   inkernel = 0;
 24 
 25 
 26 void usage(void)
 27 {
 28     fprintf(stderr,
 29             "%s: [-v] [-k] [-b basename ] [-i firmware.bin] [-o firmware.c]\n",
 30             progname);
 31     exit(-1);
 32 }
 33 
 34 
 35 int main(int argc, char** argv)
 36 {
 37     time_t   now;
 38     char*    infname  = NULL;
 39     char*    outfname = NULL;
 40     char*    basename = NULL;
 41     FILE*    infile;
 42     FILE*    outfile;
 43     unsigned firmsize;
 44     int      c;
 45 
 46     progname = *(argv++);
 47     
 48     while (argc > 1) {
 49         if ((*argv)[0] == '-') {
 50             switch ((*argv)[1]) {
 51             case 'i':
 52                 if (argc-- < 3)
 53                     usage();
 54                 infname = *(++argv);
 55                 break;
 56             case 'o':
 57                 if (argc-- < 3)
 58                     usage();
 59                 outfname = *(++argv);
 60                 break;
 61             case 'b':
 62                 if (argc-- < 3)
 63                     usage();
 64                 basename = *(++argv);
 65                 break;
 66             case 'v':
 67                 verbose = 1;
 68                 break;
 69             case 'k':
 70                 inkernel = 1;
 71                 break;
 72             default:
 73                 usage();
 74             }
 75         }
 76         else {
 77             usage();
 78         }
 79         argc--;
 80         argv++;
 81     }
 82     
 83     if (infname != NULL) {
 84         infile = fopen(infname, "r");
 85         if (infile == NULL) {
 86             fprintf(stderr, "%s: can't open %s for reading\n",
 87                     progname, infname);
 88             exit(-2);
 89         }
 90     }
 91     else {
 92         infile = stdin;
 93         infname = default_infname;
 94     }
 95 
 96     if (outfname) {
 97         outfile = fopen(outfname, "w");
 98         if (outfile == NULL) {
 99             fprintf(stderr, "%s: can't open %s for writing\n",
100                     progname, outfname);
101             exit(-3);
102         }
103     }
104     else {
105         outfile = stdout;
106         outfname = default_outfname;
107     }
108 
109     if (basename == NULL)
110         basename = default_basename;
111 
112     if (verbose) {
113         fprintf(stderr, "%s: input file = %s\n", progname, infname );
114         fprintf(stderr, "%s: output file = %s\n", progname, outfname );
115         fprintf(stderr, "%s: firmware basename = %s\n", progname, basename );
116     }
117 
118     time(&now);
119     fprintf(outfile, "/*\n  generated by %s from %s on %s"
120             "  DO NOT EDIT!\n*/\n\n",
121             progname, infname, ctime(&now));
122 
123     if (inkernel)
124         fprintf(outfile, "#include <linux/init.h>\n\n" );
125     
126     /* XXX force 32 bit alignment? */
127     fprintf(outfile, "const unsigned char%s %s_data[] = {\n", 
128             inkernel ? " __initdata" : "", basename );
129     
130     c = getc(infile);
131     fprintf(outfile,"\t0x%02x", c);
132     firmsize = 1;
133     
134     while ((c = getc(infile)) >= 0) {
135         
136         if (firmsize++ % 8)
137             fprintf(outfile,", 0x%02x", c);
138         else
139             fprintf(outfile,",\n\t0x%02x", c);
140     }
141 
142     fprintf(outfile, "\n};\n\n");
143 
144     fprintf(outfile, "const unsigned int%s %s_size = %u;\n",
145             inkernel ? " __initdata" : "", basename, firmsize );
146 
147     if (infile != stdin)
148         fclose(infile);
149     if (outfile != stdout)
150         fclose(outfile);
151 
152     if(verbose)
153         fprintf(stderr, "%s: firmware size = %u\n", progname, firmsize);
154 
155     exit(0);
156 }
157 
  This page was automatically generated by the LXR engine.