]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
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 | } |