fore200e_mkfirm.c 3.1 KB

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