add support for gcc-4.5.1
[openwrt/openwrt.git] / scripts / slugimage.pl
index da98c999e67f2167b9de91d74de508444278975b..deac6ac6dd33f66e2d9bb3520363136a15cd8c33 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/usr/bin/env perl
 # 
 # SlugImage : Manipulate NSLU2 firmware images
 #             Dwayne Fontenot (jacques)
@@ -391,10 +391,9 @@ sub readInFirmware {
     my($filename, $partitions_ref) = @_;
 
     my($firmware_buf);
-    my($total_length)   = 0x800000;
 
     open FILE,$filename or die "Can't find firmware image \"$filename\": $!\n";
-    read FILE,$firmware_buf,$total_length or die "Can't read $total_length bytes from \"$filename\": $!\n";
+    read FILE,$firmware_buf,$flash_len or die "Can't read $flash_len bytes from \"$filename\": $!\n";
     close FILE or die "Can't close \"$filename\": $!\n";
 
     $debug and printf("Read 0x%08X bytes from \"%s\"\n", length($firmware_buf), $filename);
@@ -921,7 +920,7 @@ sub defaultPartitions {
             'offset'=>0x007f8000,        'size'=>0x00004000,
             'variable'=>0, 'header'=>0,  'pseudo'=>1, 'data'=>undef, 'byteswap'=>0},
            {'name'=>'Microcode',         'file'=>'NPE-B',
-            'offset'=>0x007fc000,        'size'=>0x00003000,
+            'offset'=>0x007fc000,        'size'=>0x00003fe0,
             'variable'=>0, 'header'=>16, 'pseudo'=>1, 'data'=>undef, 'byteswap'=>0},
            {'name'=>'Trailer',           'file'=>'Trailer',
             'offset'=>0x007ffff0,        'size'=>0x00000010,
@@ -930,7 +929,7 @@ sub defaultPartitions {
 
 # Main routine starts here ...
 
-my($unpack, $pack, $little, $input, $output, $redboot);
+my($unpack, $pack, $little, $fatflash, $input, $output, $redboot);
 my($kernel, $sysconf, $ramdisk, $fisdir);
 my($microcode, $trailer, $ethaddr, $loader);
 
@@ -946,6 +945,7 @@ if (!GetOptions("d|debug"       => \$debug,
                "u|unpack"      => \$unpack,
                "p|pack"        => \$pack,
                "l|little"      => \$little,
+               "F|fatflash"    => \$fatflash,
                "i|input=s"     => \$input,
                "o|output=s"    => \$output,
                "b|redboot=s"   => \$redboot,
@@ -965,6 +965,7 @@ if (!GetOptions("d|debug"       => \$debug,
     print "  [-u|--unpack]                     Unpack a firmware image\n";
     print "  [-p|--pack]                       Pack a firmware image\n";
     print "  [-l|--little]                     Convert Kernel and Ramdisk to little-endian\n";
+    print "  [-F|--fatflash]                   Generate an image for 16MB flash\n";
     print "  [-i|--input]     <file>           Input firmware image filename\n";
     print "  [-o|--output]    <file>           Output firmware image filename\n";
     print "  [-b|--redboot]   <file>           Input/Output RedBoot filename\n";
@@ -1047,6 +1048,18 @@ if (defined $little)  {
     } @partitions;
 }
 
+if (defined $fatflash)  {
+    $flash_len = 0x01000000;
+    map {
+       if (($_->{'name'} eq 'FIS directory') or
+           ($_->{'name'} eq 'Loader config') or
+           ($_->{'name'} eq 'Microcode') or
+           ($_->{'name'} eq 'Trailer')) {
+           $_->{'offset'} += 0x00800000;
+       }
+    } @partitions;
+}
+
 if (defined $ethaddr) {
     map {
        if ($_->{'name'} eq 'EthAddr') {