imgtools/romtools/rombuild/addextension.pl
changeset 0 044383f39525
--- /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;