14 int flag_print_version;
18 uint16_t sa2100_magic = 0x2100;
19 uint16_t sa3349_magic = 0x3349;
20 uint32_t default_date = 0x00000000; //A long time ago in a galaxy far far away....
21 uint32_t default_load_address = 0x80010000; //The default load_address for the firmware image
23 static void print_help ( const char* ename )
25 printf ( "Firmware image packer and calculator for broadcom-based modems.\n" );
26 printf ( "Part of bcm-utils package.\n" );
27 printf ( "(c) 2009 Necromant (http://necromant.ath.cx). Thanks to Luke-jr for his initial work.\n" );
28 printf ( "usage: %s [options]\n", ename );
29 printf ( "Valid options are:\n" );
30 printf ( "--magic_bytes=value \t- specify magic bytes at the beginning of the image. default - 3349\n" );
31 printf ( "\t\t\t these can be sa2100 (for DPC2100 modem),\n\t\t\t sa3349 (haxorware guys use this one for some reason),\n\t\t\t or a custom hex value e.g. 0xFFFF\n" );
32 printf ( "--compress \t\t - Make use of LZMA (weird!) compression (Doesn't work yet).\n" );
33 printf ( "--rev_maj=value\t\t - major revision number. default 0\n" );
34 printf ( "--rev_min=value\t\t - minor revision number default 0\n" );
35 printf ( "--filename=value\t - use this filename in header instead of default (input filename)\n" );
36 printf ( "--ldaddress=value\t - hex value of the target load address. defaults to 0x80010000\n" );
37 printf ( "--input_file=value\t - What file are we packing?\n" );
38 printf ( "--output_file=value\t - What file shall we write? (default: image.bin)\n" );
40 printf ( "--credz\t - Give some credz!\n" );
46 int main ( int argc, char** argv )
50 print_help ( argv[0] );
53 static struct option long_options[] =
55 {"magic_bytes", required_argument, 0, 'm'},
56 {"rev_maj", required_argument, 0, 'j'},
57 {"rev_min", required_argument, 0, 'n'},
58 {"ldaddress", required_argument, 0, 'l'},
59 {"filename", required_argument, 0, 'f'},
60 {"input_file", required_argument, 0, 'i'},
61 {"output_file", required_argument, 0, 'o'},
62 {"compress", no_argument, &flag_compress, 'c'},
63 {"version", no_argument, &flag_print_version, 'v'},
64 {"help", no_argument, &flag_print_help, 'h'},
77 while ( opt_result>=0 )
79 opt_result = getopt_long ( argc, argv, "m:j:n:f:i:o:vh", long_options, &option_index );
86 print_help ( argv[0] );
113 printf ( "Telepaths are still on holidays. I guess you should tell me what file should I process.\n\n" );
116 if ( access ( input,R_OK ) !=0 )
118 printf ( "I cannot access the file %s. Is it there? Am I allowed?\n\n", input );
121 uint32_t magicnum=sa2100_magic;
125 if ( strcmp ( magic,"sa2100" ) ==0 ) magicnum=sa2100_magic; else
126 if ( strcmp ( magic,"sa3349" ) ==0 ) magicnum=sa3349_magic; else
128 sscanf ( magic, "0x%04X", &magicnum );
131 unsigned int majrev=0;
134 sscanf ( major, "%d", &majrev );
136 unsigned int minrev=0;
139 sscanf ( minor, "%d", &minrev );
141 uint32_t ldaddress = default_load_address;
144 sscanf ( ldaddr, "0x%08X", &ldaddress );
146 char* dupe = strdup(input);
147 char* fname = basename ( dupe );
153 gettimeofday ( &tm,NULL );
156 ldr_header_t* head = construct_header ( magicnum, (uint16_t) majrev, (uint16_t) minrev, ( uint32_t ) tm.tv_sec, ( uint32_t ) buf.st_size, ldaddress, fname, get_file_crc ( input ) );
158 //uint32_t magic, uint16_t rev_maj,uint16_t rev_min, uint32_t build_date, uint32_t filelen, uint32_t ldaddress, const char* filename, uint32_t crc
159 //FILE* fd = fopen ("/tftpboot/haxorware11rev32.bin","r");
160 //fread(head,sizeof(ldr_header_t),1,fd);
161 char* filebuffer = malloc ( buf.st_size+10 );
162 FILE* fd = fopen ( input,"r" );
163 fread ( filebuffer, 1, buf.st_size,fd );
166 output = malloc(strlen(input+5));
167 strcpy(output,input);
168 strcat(output,".bin");
170 dump_header ( head );
171 FILE* fd_out = fopen ( output,"w+" );
174 fprintf(stderr, "Failed to open output file: %s\n", output);
177 fwrite ( head,1,sizeof ( ldr_header_t ),fd_out );
178 fwrite ( filebuffer,1,buf.st_size,fd_out );
179 printf("Firmware image %s is ready\n", output);