--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rombuild/addextension.pl Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,125 @@
+#
+# Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Concatenate an extension ROM onto the core ROM.
+# Works for ROMBUILD XIP ROMs and ROFSBUILD non-XIP ROMs
+#
+
+use strict;
+
+if (@ARGV<2 || @ARGV>3)
+ {
+#........1.........2.........3.........4.........5.........6.........7.....
+ print <<USAGE_EOF;
+
+Usage:
+ addextension <kernelRom> <extensionRom> [<outputfile>]
+
+If <extensionRom> doesn\'t exist, addextension will try concatenating
+the <kernelrom> and <extensionrom> names.
+If no <outputfile> is specified, the default is sys\$rom.bin
+
+USAGE_EOF
+ exit(1);
+ }
+
+my $kernelROM = @ARGV[0];
+my $extensionROM = @ARGV[1];
+my $outputfile = "sys\$rom.bin";
+$outputfile = @ARGV[2] if (@ARGV==3);
+
+open KERNEL, "<$kernelROM" or die "Cannot open $kernelROM";
+binmode KERNEL;
+
+if (!open EXTENSION, "<$extensionROM")
+ {
+ open EXTENSION , "<$kernelROM$extensionROM" or
+ die "Cannot open $extensionROM or $kernelROM$extensionROM";
+ $extensionROM = $kernelROM.$extensionROM;
+ }
+binmode EXTENSION;
+
+open RESULT, ">$outputfile" or die "Cannot open $outputfile for output";
+binmode RESULT;
+
+print "Writing $kernelROM + $extensionROM to $outputfile\n";
+
+my $reproheader = "";
+read KERNEL, $reproheader, 256;
+if ($reproheader !~ /^EPOC....ROM/)
+ {
+ seek KERNEL, 0, 0; # No REPRO header, rewind back to the start
+ $reproheader = "";
+ }
+
+my $kerneldata;
+read KERNEL, $kerneldata, 4096;
+
+my $kernelsize;
+my $imagesize;
+if ($kerneldata =~ /^ROFS/)
+ {
+ $imagesize = unpack "V", substr($kerneldata, 0x24, 4);
+ $kernelsize = unpack "V", substr($kerneldata, 0x2c, 4);
+ printf "ROFS size: 0x%08x ", ($imagesize);
+ }
+else
+ {
+ $kernelsize = unpack "V", substr($kerneldata, 0x90, 4);
+ }
+printf "\nCore ROM maximium size: 0x%08x", $kernelsize;
+
+
+if ($reproheader ne "")
+ {
+ # Add REPRO header to output, but update image size
+ my $tmp;
+ read(EXTENSION, $tmp, 128);
+ seek EXTENSION, 0, 0;
+
+ my $extensionsize = unpack "V", substr($tmp, 0x10, 4);
+ substr($reproheader, 0x18, 4) = pack "V", $extensionsize+$kernelsize;
+
+ syswrite RESULT, $reproheader;
+ }
+
+$kernelsize -= syswrite RESULT, $kerneldata;
+while (read(KERNEL, $kerneldata, 4096))
+ {
+ $kernelsize -= syswrite RESULT, $kerneldata, $kernelsize;
+ }
+close KERNEL;
+
+# Pad the data to the full size of the kernel ROM image
+
+$kerneldata = "\377\377\377\377"; # 4
+$kerneldata = $kerneldata.$kerneldata.$kerneldata.$kerneldata; # 16
+$kerneldata = $kerneldata.$kerneldata.$kerneldata.$kerneldata; # 64
+$kerneldata = $kerneldata.$kerneldata.$kerneldata.$kerneldata; # 256
+$kerneldata = $kerneldata.$kerneldata.$kerneldata.$kerneldata; # 1024
+$kerneldata = $kerneldata.$kerneldata.$kerneldata.$kerneldata; # 4096
+
+while ($kernelsize > 0)
+ {
+ $kernelsize -= syswrite RESULT, $kerneldata, $kernelsize;
+ }
+
+# Stick the extension ROM on the end
+
+my $extensiondata;
+while (read(EXTENSION, $extensiondata, 4096))
+ {
+ syswrite RESULT, $extensiondata;
+ }
+close RESULT;