fore200e_mkfirm.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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