[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/tools/zImageProcess.pm b/mcu/tools/zImageProcess.pm
new file mode 100644
index 0000000..85e3b68
--- /dev/null
+++ b/mcu/tools/zImageProcess.pm
@@ -0,0 +1,362 @@
+#!/usr/bin/perl
+#
+# Copyright Statement:
+# --------------------
+# This software is protected by Copyright and the information contained
+# herein is confidential. The software may not be copied and the information
+# contained herein may not be used or disclosed except with the written
+# permission of MediaTek Inc. (C) 2005
+#
+# BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+# NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+# SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+# BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+# LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+# THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+# WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+# LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+# RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+# THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#* zImageProcess.pl
+#*
+#* Project:
+#* --------
+#* Maui_Software
+#*
+#* Description:
+#* ------------
+#* This file implemented the ZIMAGE post build process.
+#*
+#*
+#* Author:
+#* -------
+#* Ke-Ting Chen (mtk03141)
+#*
+#*****************************************************************************
+package zImageProcess;
+#****************************************************************************
+# Included Modules
+#****************************************************************************
+use strict;
+use warnings;
+BEGIN { push @INC, '.\\pcore\\tools\\' } # add additional library path
+use vivaHelper;
+use File::Copy;
+
+#****************************************************************************
+# Constants
+#****************************************************************************
+my $DEBUG = 1;
+my $compressTool = "pcore\\tools\\7lzma.exe";
+my $zImageBinaryName = "ZIMAGE_ER";
+my $zImageBinaryBackupName = "ZIMAGE_ER.bin";
+my %zImageInfo = ("name" => "ZIMAGE",
+ "binary_name" => $zImageBinaryName,
+ "struct_name" => "zimage",
+ "entry_function" => \&ZImageProcess);
+my %defaultPartitionInfo = ("MT6250" => [{"ratio" => 0.75, "type" => 2},
+ {"ratio" => 0.25, "type" => 1}]);
+my $minSplitableSize = 8 * 1024;
+
+#****************************************************************************
+# subroutine: Process
+# description: Perform the ZIMAGE post build process.
+# input: Binary folder, available start address,
+# original start address ref, original size ref
+# output: Actual start address, new binary size
+#****************************************************************************
+sub ZImageProcess
+{
+ my $binaryFolder = shift;
+ my $availableStartAddress = shift;
+ my $startAddressRef = shift;
+ my $sizeRef = shift;
+
+ my $binary = "$binaryFolder\\$zImageBinaryName";
+ my $binaryBackup = "$binaryFolder\\$zImageBinaryBackupName";
+
+ my $zimageEnabled = &vivaHelper::GetMakefileOption("ZIMAGE_SUPPORT");
+ unless (defined $zimageEnabled and
+ $zimageEnabled eq "TRUE" and
+ -e $binary)
+ {
+ return 0;
+ }
+
+ # Using default partition setting
+ CompressByPartition($binary, $binaryBackup, $$startAddressRef);
+
+ # Update start address and binary size
+ # Need 4 byte align
+ $$startAddressRef = &vivaHelper::RoundUpToAlignment($availableStartAddress, 4);
+ $$sizeRef = -s $binary;
+
+ #debugLog("Base Address: $$startAddressRef");
+ #debugLog("Length: $$sizeRef");
+
+ return 1;
+}
+
+#****************************************************************************
+# subroutine: GetInfo
+# description: Get the basic information of processing
+# input: None
+# output: Info ref
+#****************************************************************************
+sub GetZImageInfo
+{
+ return \%zImageInfo;
+}
+
+#****************************************************************************
+# Constants
+#****************************************************************************
+my $bootZImageBinaryName = "BOOT_ZIMAGE_ER";
+my $bootZImageBinaryBackupName = "BOOT_ZIMAGE_ER.bin";
+my %bootZImageInfo = ("name" => "BOOT_ZIMAGE",
+ "binary_name" => $bootZImageBinaryName,
+ "struct_name" => "boot_zimage",
+ "entry_function" => \&BootZImageProcess);
+
+#****************************************************************************
+# subroutine: Process
+# description: Perform the ZIMAGE post build process.
+# input: Binary folder, available start address,
+# original start address ref, original size ref
+# output: Actual start address, new binary size
+#****************************************************************************
+sub BootZImageProcess
+{
+ my $binaryFolder = shift;
+ my $availableStartAddress = shift;
+ my $startAddressRef = shift;
+ my $sizeRef = shift;
+
+ my $binary = "$binaryFolder\\$bootZImageBinaryName";
+ my $binaryBackup = "$binaryFolder\\$bootZImageBinaryBackupName";
+
+ my %zImage2partitionInfo = ("MT6250" => [{"ratio" => 1, "type" => 2}]);
+
+ my $zimage2Enabled = &vivaHelper::GetMakefileOption("BOOT_ZIMAGE_SUPPORT");
+ unless (defined $zimage2Enabled and
+ $zimage2Enabled eq "TRUE" and
+ -e $binary)
+ {
+ return 0;
+ }
+
+ CompressByPartition($binary, $binaryBackup, $$startAddressRef, $zImage2partitionInfo{&vivaHelper::GetMakefileOption("PLATFORM")});
+
+ # Update start address and binary size
+ # Need 4 byte align
+ $$startAddressRef = &vivaHelper::RoundUpToAlignment($availableStartAddress, 4);
+ $$sizeRef = -s $binary;
+
+ #debugLog("Base Address: $$startAddressRef");
+ #debugLog("Length: $$sizeRef");
+
+ return 1;
+}
+
+#****************************************************************************
+# subroutine: GetInfo
+# description: Get the basic information of processing
+# input: None
+# output: Info ref
+#****************************************************************************
+sub GetBootZImageInfo
+{
+ return \%bootZImageInfo;
+}
+
+
+
+sub CompressByPartition
+{
+ my $binary = shift;
+ my $binaryBackup = shift;
+ my $decompressStartAddress = shift;
+ my $partitions = shift;
+
+ # The parition decompress start address should be cache line aligned
+ my $alignment = 32;
+ my $alignShift = $alignment - $decompressStartAddress % $alignment;
+
+ # Use default setting if the argument is omitted
+ $partitions = $defaultPartitionInfo{&vivaHelper::GetMakefileOption("PLATFORM")} unless defined $partitions;
+
+ # Backup the original binary
+ printLog("Backup binary...");
+ copy($binary, $binaryBackup) or
+ &vivaHelper::ErrorHandler("Cannot backup binary $binary: $!", __FILE__, __LINE__);
+
+ # Compress the binary
+ {
+ my $binarySize = -s $binary or
+ &vivaHelper::ErrorHandler("Cannot get file size $binary: $!", __FILE__, __LINE__);
+
+ my $splitPartitionNumber;
+ my @partitionSize;
+ my @partitionName;
+ my @partitionCompressedSize;
+
+ # Use default partition settings if not defined or the size is too small
+ if (not defined $partitions)
+ {
+ $partitions = [{"ratio" => [1], "type" => 1}];
+ }
+
+ # Split the binary
+ printLog("Splitting binaries...");
+ {
+ debugLog("Original Size: $binarySize");
+ my $temp;
+ my $subTotalSize = 0;
+ my $i;
+
+ for ($i = 0; $i < @$partitions; ++$i)
+ {
+ $temp = &vivaHelper::RoundUpToAlignment(int($partitions->[$i]{"ratio"} * $binarySize + 0.99), $alignment) + $alignShift;
+ $subTotalSize += $temp;
+
+ push @partitionSize, $temp;
+ push @partitionName, "~zimagePartition_$i.tmp";
+ }
+
+ # Add or subtract the rest size to the final partition
+ $partitionSize[$i - 1] += $binarySize - $subTotalSize;
+
+ for ($i = 0; $i < @partitionSize; ++$i)
+ {
+ debugLog("$partitionName[$i]\t$partitionSize[$i]");
+ }
+
+ # Split
+ $splitPartitionNumber = &vivaHelper::SplitBinaryBySize($binary, \@partitionSize, \@partitionName);
+ }
+
+ # Compress
+ printLog("Compressing binaries...");
+ {
+ for (my $i = 0; $i < $splitPartitionNumber; ++$i)
+ {
+ if (0 != system("$compressTool e $partitionName[$i] $partitionName[$i]_comp"))
+ {
+ &vivaHelper::ErrorHandler("Cannot compress ZIMAGE binary $partitionName[$i]: $!", __FILE__, __LINE__);
+ }
+ else
+ {
+ my $temp = -s $partitionName[$i]."_comp";
+ push @partitionCompressedSize, $temp or
+ &vivaHelper::ErrorHandler("Cannot get file size $partitionName[$i]_comp: $!", __FILE__, __LINE__);
+
+ # Pad the binary after getting the size
+ &vivaHelper::PaddingBinaryToAlignment($partitionName[$i]."_comp", 4);
+ debugLog("$partitionName[$i]_comp\t$temp");
+ }
+ }
+ }
+
+ # Making the header
+ printLog("Making header...");
+ {
+ # Write partition number
+ my $buffer;
+ my $sourceAddress;
+ my $destinationAddress;
+
+ open my $output, ">~zimageHeader.tmp" or
+ &vivaHelper::ErrorHandler("Cannot open output file ~zimageHeader.tmp: $!", __FILE__, __LINE__);
+ binmode $output;
+
+ # Write partition number
+ debugLog("Partition number: $splitPartitionNumber");
+ $buffer = pack("L", $splitPartitionNumber);
+ print $output $buffer;
+
+ # Write partition info
+ $sourceAddress = 4 + 20 * ($splitPartitionNumber);
+ $destinationAddress = 0;
+
+ for (my $i = 0; $i < $splitPartitionNumber; ++$i)
+ {
+ my $type = $partitions->[$i]{"type"};
+ my $sourceSize = $partitionCompressedSize[$i];
+ my $destinationSize = $partitionSize[$i];
+
+ debugLog("Partition[$i]: $type, $sourceAddress, $sourceSize, $destinationAddress, $destinationSize");
+ $buffer = pack("LLLLL", $type, $sourceAddress, $sourceSize, $destinationAddress, $destinationSize);
+ print $output $buffer;
+
+ $sourceAddress += &vivaHelper::RoundUpToAlignment($sourceSize, 4);
+ $destinationAddress += $destinationSize;
+ }
+
+ close $output;
+ }
+
+ # Concatenate all the compressed binaries and the header
+ printLog("Concatenating binaries...");
+ {
+ my @concatenateList = ("~zimageHeader.tmp");
+ for (my $i = 0; $i < $splitPartitionNumber; ++$i)
+ {
+ push @concatenateList, $partitionName[$i]."_comp";
+ }
+
+ open my $output, ">$binary" or
+ &vivaHelper::ErrorHandler("Cannot open output file $binary: $!", __FILE__, __LINE__);
+ binmode $output;
+
+ &vivaHelper::ConcatenateBinary($output, \@concatenateList);
+
+ close $output;
+ }
+
+ # Delete all temp files
+ printLog("Deleting temp files...");
+ {
+ unlink("~zimageHeader.tmp") or &vivaHelper::ErrorHandler("Cannot delete file ~zimageHeader.tmp: $!", __FILE__, __LINE__);
+ for (my $i = 0; $i < $splitPartitionNumber; ++$i)
+ {
+ unlink($partitionName[$i]) or &vivaHelper::ErrorHandler("Cannot delete file $partitionName[$i]: $!", __FILE__, __LINE__);
+ unlink($partitionName[$i]."_comp") or &vivaHelper::ErrorHandler("Cannot delete file $partitionName[$i]_comp: $!", __FILE__, __LINE__);
+ }
+ }
+ }
+}
+
+sub printLog
+{
+ print "[ZIMAGE] $_[0]\n";
+}
+
+sub debugLog
+{
+ if ($DEBUG)
+ {
+ printLog("[DEBUG] $_[0]");
+ }
+}
+
+1;