[Feature][Modem]Update MTK MODEM V1.6 baseline version: MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6

MTK modem version: MT2735_IVT_MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.tar.gz
RF  modem version: NA

Change-Id: I45a4c2752fa9d1a618beacd5d40737fb39ab64fb
diff --git a/mcu/tools/CommonUtility.pm b/mcu/tools/CommonUtility.pm
new file mode 100644
index 0000000..83322ee
--- /dev/null
+++ b/mcu/tools/CommonUtility.pm
@@ -0,0 +1,293 @@
+#!/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) 2006
+#
+#  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:
+#* ---------
+#*   CommonUtility.pm
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*   This script is to provide common utility
+#*
+#* Author:
+#* -------
+#*   Carl Kao (mtk08237)
+#*
+#****************************************************************************/
+#****************************************************************************
+# Included Modules
+#****************************************************************************
+use strict;
+BEGIN { push @INC, './pcore/tools/' }  # add additional library path
+package CommonUtil;
+use POSIX qw(floor ceil);
+#****************************************************************************
+# oo >>>  Finished
+#****************************************************************************
+return 1;
+
+#****************************************************************************
+# CommonUtility Version
+#****************************************************************************
+sub CommonUtil_verno
+{
+    return " u0.03";
+           # u0.03,  2016/09/06,  Tero,   Add leading zeros to Dec2Hex
+           # u0.02_UMOLY,  2015/01/26,  Carl,   Refine GetMPUAligned for adding debug log
+           # u0.01_UMOLY = v0.08
+           # v0.08 , 20141105 by carl, add GetMPUAligned
+           # v0.07 , 20131215 by mei, Support space before = in HashStringParser()
+           # v0.06 , 20130625 by mei, Support HashStringGenerator() and HashStringParser()
+           # v0.05 , 20130115 by mei, Add WriteFileContent()
+           # v0.04 , 20120625 by mei, Change chomp by replacing \r\n directly
+           # v0.03 , 20120528 by mei, Support path and filename case sensitive on Linux
+           # v0.02 , 20120512 by mei, strengthen funcationality for ParseCSV()
+           # v0.01 , 20120504 by mei, initial version
+}
+
+
+#****************************************************************************
+# subroutine:  error_handler
+# input:       $error_msg:     error message
+#****************************************************************************
+sub error_handler
+{
+    my ($error_msg, $file, $line_no, $strTitle) = @_;
+       
+    my $final_error_msg = "$strTitle ERROR: $error_msg at $file line $line_no : $!\n";
+    print $final_error_msg;
+    die $final_error_msg;
+}
+
+
+#****************************************************************************
+# subroutine:  Dec2Hex: translate dec number to hex string
+# input:       Number in dec
+# output:      hex in string 
+#****************************************************************************
+#Hex2Dex() : hex string to dec number = hex()
+sub Dec2Hex
+{
+    my ($num) = @_;
+    return sprintf("0x%.08x", $num);
+}
+
+#****************************************************************************
+# subroutine:  GetFileContent
+# input:   strFilePath
+# output:  strFileContent after chomp
+#****************************************************************************
+sub GetFileContent
+{
+    my ($strFilePath) = @_;
+    my $content;
+    my ($pack_name, $file, $line_no) = caller;
+    open FILE, "<$strFilePath" or &error_handler("$strFilePath: open file error!", $file, $line_no, 'CommonUtil::GetFileContent');
+    {
+        local $/;
+        $content = <FILE>;
+    }
+    close FILE;
+    chomp($content);
+    return $content;
+}
+
+#****************************************************************************
+# subroutine:  WriteFileContent
+# input:   $strFilePath, $$strFileContent, 
+#          $bAppend: 0 or undef= not append in the file, 1=need to append
+# output:  x
+#****************************************************************************
+sub WriteFileContent
+{
+    my ($strFilePath, $strContent, $bAppend) = @_;
+    my $strAppend = "";
+    $strAppend = ">" if($bAppend);
+    open FILE, ">$strAppend$strFilePath" or &error_handler("$strFilePath: open file error!", __FILE__, __LINE__, 'CommonUtil::WriteFileContent');
+    print FILE $strContent;    
+    close FILE;
+}
+
+#****************************************************************************
+# subroutine:  ParseCSV
+# input:   1. strFilePath
+#          2. $bSkipFirstLine: 1=skip, 0 or undef=not to skip
+# output:  1. \@ContentList: array reference [[column, column, column...], [column, column, column...], ...]
+#          2. \@LineMeaning: if $bSkipFirstLine==1, return undef; if not, return FirstLine in [colume, colume,...]
+#****************************************************************************
+sub ParseCSV
+{
+    my ($strFilePath, $bSkipFirstLine) = @_;
+    my @ContentList;
+    my @LineMeaning;
+    my %IndexByName;
+    open FILE, "<$strFilePath" or &error_handler("$strFilePath: open file error!", __FILE__, __LINE__, 'CommonUtil::ParseCSV');
+    if(1 != $bSkipFirstLine)
+    {
+        my $FirstLine = <FILE>;
+        $FirstLine =~ s/\r|\n//g;
+        @LineMeaning = split(/,/, $FirstLine, -1);
+        for(my $i=0; $i<=$#LineMeaning ; $i++)
+        {
+            $IndexByName{$LineMeaning[$i]} = $i;
+        }
+    }
+    while(<FILE>)
+    {
+        $_ =~ s/\r|\n//g;
+        my @entry = split(/,/, $_, -1);
+        for(my $i= (scalar(@LineMeaning)- scalar(@entry)); (($i>0) && (1 != $bSkipFirstLine)); $i--)
+        {
+            push @entry, "";
+        }
+        my @Removed_Empty; # to replace "  " by ""  
+        foreach my $item(@entry)
+        {
+            my $orgitem = $item;
+            $item =~ s/\s//g;
+            push (@Removed_Empty, ($item eq "") ? "" : $orgitem );
+        }
+        push @ContentList, \@Removed_Empty;
+    }
+    close FILE;
+    return (\@ContentList, \%IndexByName);
+}
+
+#****************************************************************************
+# subroutine:  ConnetString
+# input:   1. \@token
+#          2. string to conect
+#          3. $bConnectEmptyString: 1=support emptystring connect, 0 or undef=not support it
+# output:  string
+#****************************************************************************
+sub ConnetString
+{
+    my ($token_ref, $strConnector, $bConnectEmptyString) = @_;
+    my $strResult;
+    if($bConnectEmptyString)
+    {
+        $strResult = join($strConnector, @$token_ref);
+    }
+    else
+    {
+        foreach my $i (@$token_ref)
+        {
+            my $temp = $i;
+            $temp =~ s/\s//g;
+            if($strResult eq "" and $temp ne "")
+            {
+                $strResult = $i;
+            }
+            else
+            {
+                $strResult = join($strConnector, $strResult, $i) if($i ne "");
+            }
+        }
+    }
+    return $strResult;
+}
+#****************************************************************************
+# subroutine:  HashStringGenerator
+# input:   1. \%Hash
+# output:  string
+#****************************************************************************
+sub HashStringGenerator
+{
+    my ($href) = @_;
+    my $strOutput;
+    map { $strOutput .= "$_=".$href->{$_}."\n";} sort keys %$href;
+    return $strOutput;
+}
+
+#****************************************************************************
+# subroutine:  HashStringParser
+# input:   1.HashStringGenerator's content 2. output:\%Hash
+# output:  N/A
+#****************************************************************************
+sub HashStringParser
+{
+    my ($strHash, $Output_href)= @_;
+    my @items = split(/\n/, $strHash);
+    foreach my $item (@items)
+    {
+        my @KeyValue = split(/\=/, $item);
+        my $key = $KeyValue[0];
+        my $value = $KeyValue[1];
+        $key =~ s/\s//;
+        $value =~ s/\s//;
+        $Output_href->{$key} = $value;
+        $Output_href->{uc($key)} = $value;
+    }
+}
+
+sub GetMBAligned
+{
+    my ($nSize, $nMBAligned) = @_;
+    return ceil($nSize/($nMBAligned*1024*1024)) *$nMBAligned*1024*1024;
+}
+
+sub GetKBAligned
+{
+    my ($nSize, $nKBAligned) = @_;
+    return ceil($nSize/($nKBAligned*1024)) *$nKBAligned*1024;
+}
+
+
+# ask by MPU owner
+sub GetMPUAligned
+{
+    my ($nOriAddr, $strTarget) = @_;
+    
+    my $nAlignSize = 2**(ceil(log($nOriAddr)/log(2))-13);    
+    my $nAlignAddr = CommonUtil::GetKBAligned($nOriAddr, $nAlignSize);
+    
+    if($strTarget ne "") {
+        my ($strOriAddr, $strAlignAddr) = (CommonUtil::Dec2Hex($nOriAddr), CommonUtil::Dec2Hex($nAlignAddr));
+
+        if($nAlignSize<1024) {
+            print "$strTarget $nAlignSize KB MPU Alignment: $strOriAddr -> new:$strAlignAddr\n";
+        } else {
+            print "$strTarget ".($nAlignSize/1024)." MB MPU Alignment: $strOriAddr -> new:$strAlignAddr\n" ;
+        }
+    }
+    return $nAlignAddr;
+}
+
+