[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;