fore200e_mkfirm.c 3.2 KB

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