[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/sysGenUtility.pm b/mcu/tools/sysGenUtility.pm
new file mode 100644
index 0000000..4657646
--- /dev/null
+++ b/mcu/tools/sysGenUtility.pm
@@ -0,0 +1,958 @@
+#!/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:
+#* ---------
+#*   sysGenUtility.pm
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*   This module collects the subroutines for common utility. 
+#*       
+#*
+#* Author:
+#* -------
+#*   Carl Kao (mtk08237)
+#*
+#****************************************************************************/
+
+#****************************************************************************
+# SYSGEN ERROR MESSAGE
+#****************************************************************************
+use FileInfoParser;
+
+package genERR;
+use constant SYSERR_1_1         => "SYSGEN ERROR: [1.1][Feature Option Related]";
+use constant SYSERR_1_2         => "SYSGEN ERROR: [1.2][Memory Expired]";
+use constant SYSERR_1_3         => "SYSGEN ERROR: [1.3][UnSupported/Wrong Configuration]";
+use constant SYSERR_1_4         => "SYSGEN ERROR: [1.4][File/Path doesn't exist]";
+use constant SYSERR_1_5         => "SYSGEN ERROR: [1.5][Other errors]";
+use constant SYSERR_2_0         => "SYSGEN ERROR: [2.0]";
+use constant SYSERR_3_1         => "SYSGEN ERROR: [3.1]";
+use constant SYSERR_3_2         => "SYSGEN ERROR: [3.2]";
+
+package sysUtil;
+use strict;
+use Cwd;
+#use warnings;
+
+#****************************************************************************
+# Constants
+#****************************************************************************
+
+my $SYSGENUTILITY_VERNO     = " LR13_v0.08";
+             # LR13_v0.08 ,     2018/07/30 ,    Frank,      Added support for MT6779
+             # LR13_v0.07 ,     2018/05/04 ,    Tero,       Increased DSP TX size for EL1S
+             # LR13_v0.06 ,     2017/12/17 ,    Tero,       Added support for MT3967
+             # LR13_v0.05 ,     2017/11/01 ,    Tero,       Added support for MT6765
+             # LR13_v0.04 ,     2017/09/27 ,    Tero,       MT6771 Memory map updated
+             # LR13_v0.03 ,     2017/08/22 ,    Tero,       Add support for MT6771
+             # LR13_v0.02 ,     2017/04/21 ,    Tero,       Add support for MT6739
+             # LR13_v0.01 ,     2016/12/22 ,    Tero,       Enable AAPMC for MT6763
+             # LR12_v0.05 ,     2016/02/17 ,    Tero,       Added ELBRUS support for VoLTE_core_query_length
+             # LR12_v0.04 ,     2016/01/31 ,    Tero,       Added ELBRUS support for DSPTXRX_query_length
+             # LR12_v0.03 ,     2016/01/18 ,    Tero,       Temporaly Disable AAPMC for ELBRUS
+             # LR12_v0.02 ,     2015/12/28 ,    Carl,       Support user specifec lds
+             # LR12_v0.01,      2015/12/23,     Carl,       Change GetCacheablePrefix to bank6
+             # u0.21, 2015/07/20,  Carl,   Support ldsGen for MT6797
+             # u0.20, 2015/07/03,  Carl,   Add GetDefaultSharedMemorySize for setting default shared memory size
+             # u0.19, 2015/06/04,  Carl,   Support ldsGen for MT6755
+             # u0.18, 2015/05/11,  Carl,   Support Ramdisk for TK6291
+             # u0.17, 2015/02/06,  disable isSupportedToAdjustLoadView for ESL COSIM
+             # u0.16, 2015/01/06,  lds refinement: 1) auto adjust shared region size, 2) reserve pcore, l1core SWLA space
+             # u0.15, 2014/11/05,  Align start address of shared memory section to 1MB
+             # u0.14, 2014/10/06,  Increase default shared memory size to 48 MB
+             # u0.13, 2014/09/26,  Support GFH + SIG
+             # u0.12, 2014/09/22,  Rename MT6291 to TK6291
+             # u0.11, 2014/09/09,  Revert default shared memory size since there are still shared memory users  
+             # u0.10, 2014/09/05,  Reduce default shared memory size for PCORE ONLY project
+             # ...
+             # m0.32, 2014/01/02, Let aapmc apply on modem only load for load view part 
+             # m0.31, 2013/11/06, Support MT6595
+             # m0.30, 2013/09/11, MT6290=SV5
+             # m0.29, 2013/05/21, Support MT6290_COPRO
+             # m0.28, 2013/03/21, Support GetMD_AlignmentByChip()
+             # m0.27, 2013/02/03, Rename MT7208 to MT6290
+             # m0.26, 2013/01/24, Enable MT6280 to be able to auto-config LoadView part
+             # m0.25, 2013/01/16, Add isSupportedToAdjustLoadView() and isSupportedToAdjustRAMSize()
+             # m0.24, 2013/01/15, Support address prefix query function
+             #                    Remove useless chip
+             # m0.22, 2012/12/28, Add MT7208 into XIP_Shadowing
+             # m0.21, 2012/10/31, Refine Error Message not to meet \w+ for easier function naming in ldsGen
+             # m0.20, 2012/10/02, Support MT7208
+             # m0.17, 2012/09/02, Support ALPS database check-in history 
+             # m0.16, [Reserved for WR8]
+             # m0.15, 2012/08/17, Support Total RAM size in smartphone
+             #                    Support MT6583 MD1/MD2
+             # m0.14, 2012/08/13, Support MT6577
+             # m0.13, 2012/08/07, Move Dec2Hex to CommonUtility.pm and add isDummyScatter()
+             # m0.12, 2012/07/24, Support sysgen common error code/messages.
+             # m0.11, 2012/07/12, Remove booting type query to FileInfoParser.pm
+             # m0.10, 2012/07/02, Remove PrintDependency() to use tools::pack_dep_gen; PrintDependModule();
+             # m0.09, 2012/07/02, Support SwitchToClonedChip
+             # m0.08, 2012/06/28, Support MOLY database check-in history 
+             # m0.07, 2012/05/28, Support path and filename case sensitive on Linux
+             # m0.06, 2012/05/01, Support lds description_file_header
+             # m0.05, 2012/01/20, Support NOR for CR4 
+             # m0.04, 2012/01/13, Support MT6280 BLscatGen
+             # m0.03, 2012/01/13, Remove MT6280 from SmartPhone
+             # m0.02, 2012/01/08, Support MT6280
+             # m0.01 , 2012/05/07, Move DSPTXRX_query_length from scatGenLib.pl to here.
+             # v0.22 , 2012/04/12,  Modify GetIntsramInfo() to enhance 6250 FTE performance
+             # v0.21 , 2012/03/26,  Modify the query method of vivaHelper.pm in query_viva_size()
+             # v0.20 , 2012/03/22,  Add query_viva_size to support VIVA
+             # v0.19 , 2012/03/21,  Support MT6250
+             # v0.18 , 2012/04/17,  Support EWS to print file dependency
+             # v0.17 , 2012/02/14,  Add check_cs1_base() and modify query_cs1_addr() to determine CS1 base address
+             # v0.16 , 2012/01/30,  Support MT6922
+             # v0.15 , 2012/01/28,  Add is_NOR() without supporting smartphone part
+             # v0.14 , 2012/01/08,  Add is_CR4(), GetIntsramHWBoundary() and Support TK6280
+             # v0.13 , 2012/01/08,  Add GetIntsramInfo() to get intsram CODE/DATA's information
+             # v0.12 , 2012/01/08,  Remove has_cache()
+             # v0.11 , 2011/11/04,  Remove phased-out chips and add is_arm7()
+             # v0.10 , 2011/10/29,  modify query_cs1_addr for MT6255 bootloader workaround
+             # v0.09 , 2011/10/28,  To support MT6255
+             # v0.08 , 2011/10/28,  print an error message if the file can't be deleted
+             # v0.07 , 2011/10/10,  Add has_cache()
+             # v0.06 , 2011/09/25,  Move ChangeDefineValue() to auto_adjust_mem.pm and 
+             #                      seperate HasCheckinHistory out from del_noCheckinHistory_file
+             # v0.05 , 2011/09/16,  Add ChangeDefineValue() for common usage 
+             #                      if needed to modify define value in some header files.
+             # v0.04 , 2011/09/15,  Collect common functions which can be reused
+             # v0.02 , 2011/05/24,  Support MT6921 in arm9 family
+             # v0.01 , 2011/03/30,  Initial revision
+
+#****************************************************************************
+# oo >>>  Finished
+#****************************************************************************
+return 1;
+
+#****************************************************************************
+# Subroutine:  sysgenUtility_verno - to query this package's version number
+# Parameters:  x
+# Returns:     version number string
+#****************************************************************************
+sub sysgenUtility_verno
+{
+    return $SYSGENUTILITY_VERNO;
+}
+
+#****************************************************************************
+# Subroutine:  GetIntsramInfo - to query INTSRAM_CODE and INTSRAM_DATA's Base/MaxSize
+# Parameters:  BB chip  (eg. MT6276)
+# Returns:     $strCODEBase, $strCODESize, $strDATABase, $strDATASize
+#****************************************************************************
+sub GetIntsramInfo
+{#unsupported on ldsGen's chip
+    my ($bb) = @_;
+    my ($strCODEBase, $strCODESize, $strDATABase, $strDATASize) = (undef, undef, undef, undef);
+    my %BB_INTSRAM_tbl =
+       (        # $bb => [INTSRAM_CODE_Base, INTSRAM_CODE_Size, INTSRAM_DATA_Base, INTSRAM_DATA_Size]
+                # 'TK6291'  => ["0xBF000000", "0x40000",    "0xBF040000", "0x00040000"],
+       );
+    if(exists $BB_INTSRAM_tbl{$bb})
+    {
+        $strCODEBase = $BB_INTSRAM_tbl{$bb}[0];
+        $strCODESize = $BB_INTSRAM_tbl{$bb}[1];
+        $strDATABase = $BB_INTSRAM_tbl{$bb}[2];
+        $strDATASize = $BB_INTSRAM_tbl{$bb}[3];
+    }
+    return ($strCODEBase, $strCODESize, $strDATABase, $strDATASize);
+}
+#****************************************************************************
+# Subroutine:  GetIntsramHWBoundary - to query INTSRAM_PHYSICAL_BOUNDARY's Base/MaxSize
+# Parameters:  BB chip  (eg. MT6276)
+# Returns:     $strBase, $strSize
+#****************************************************************************
+sub GetIntsramHWBoundary
+{#unsupported on ldsGen's chip
+    my ($bb) = @_;
+    my ($strBase, $strSize) = (undef, undef);
+    my %BB_tbl =
+       (        # $bb => [ Base, Size]
+                #'MT6290'  => ["0xBF040000", "0x00040000"],
+       );
+    if(&is_CR4($bb)==1 and exists $BB_tbl{$bb})
+    {
+        $strBase = $BB_tbl{$bb}[0];
+        $strSize = $BB_tbl{$bb}[1];
+    }
+    return ($strBase, $strSize);
+}
+#****************************************************************************
+# Subroutine:  is_arm7 - Query if it's ARM7 Family
+# Parameters:  BB chip  (eg. MT6276)
+# Returns:     1=belongs arm7 family, undef=not arm7 family
+#****************************************************************************
+sub is_arm7
+{
+    my ($bb) = @_;
+    my %BBtbl_ARM7_Family =
+       (        
+                #'MT6290_COPRO' => 1,
+       );
+    return $BBtbl_ARM7_Family{$bb};
+}
+#****************************************************************************
+# subroutine: is_mpu_capable - Query if it has mpu capability
+# Input:      BB chip  (eg. MT6276)
+# Output:     1=has mpu capability, others=doesn't have mpu capability
+#****************************************************************************
+sub is_mpu_capable
+{
+    my ($bb) = (@_);
+    my $nDefault_MPU_Capability = 1;
+    my %BBtbl_MPU_Capability =
+       (       
+                #'TK6291' => 1,
+                #'MT6755' => 1,
+       );
+    return (exists $BBtbl_MPU_Capability{$bb} ? 
+        $BBtbl_MPU_Capability{$bb} : $nDefault_MPU_Capability);
+}
+
+#****************************************************************************
+# Subroutine:  is_arm9 - Query if it's ARM9 Family
+# Parameters:  BB chip (eg. MT6235)
+# Returns:     1=belongs arm9 family, undef=not arm9 family
+#****************************************************************************
+sub is_arm9
+{
+    my ($bb) = @_;
+    my %BBtbl_ARM9_Family =
+       (        
+            #'MT6589_MD2'  => 1,
+       );
+    return $BBtbl_ARM9_Family{$bb};
+}
+
+
+#****************************************************************************
+# Subroutine:  is_arm11 - Query if it's ARM11 Family
+# Parameters:  BB chip  (eg. MT6276)
+# Returns:     1=belongs arm11 family, undef=not arm11 family
+#****************************************************************************
+sub is_arm11
+{
+    my ($bb) = @_;
+    my %BBtbl_ARM11_Family =
+       (        
+               # 'MT6577'  => 1,
+       );
+    return $BBtbl_ARM11_Family{$bb};
+}
+
+#****************************************************************************
+# Subroutine:  is_CR4 - Query if it's CR4
+# Parameters:  BB chip  (eg. MT6280)
+# Returns:     1=belongs CR4, undef=not CR4
+#****************************************************************************
+sub is_CR4
+{
+    my ($bb) = @_;
+    my $nDefault_CR4_Family = 1;
+    my %BBtbl_CR4_Family =
+       (        
+                #'TK6291'  => 1,
+                #'MT6755'  => 1,
+       );
+    return (exists $BBtbl_CR4_Family{$bb} 
+        ? $BBtbl_CR4_Family{$bb} : $nDefault_CR4_Family);
+}
+
+#****************************************************************************
+# Subroutine:  is_LTE - Query if it's LTE project
+# Parameters:  BB chip  (eg. MT6280)
+# Returns:     1=belongs CR4, undef=not CR4
+#****************************************************************************
+sub is_LTE
+{
+    my ($bb) = @_;
+    my $nDefault_LTE_Family = 1;
+    my %BBtbl_LTE_Family =
+       (        
+                #'TK6291'  => 1,
+                #'MT6755'  => 1,
+       );
+    return (exists $BBtbl_LTE_Family{$bb}
+        ? $BBtbl_LTE_Family{$bb}: $nDefault_LTE_Family);
+}
+
+
+#****************************************************************************
+# subroutine:  Query if it has MMU(arm9, arm11, mtkmmu) or MPU (CR4)
+#              to map the address like 0xf------- 
+# input:       BB chip  (eg. MT6276)
+# Output:      0=non-mmu, 1=it has mmu
+#****************************************************************************
+sub is_mmu
+{
+	my ($bb) = (@_);
+	my $nIsMMU = 0; #0=non-MMU, 1=hasMMU;
+	my %BBtbl_MTKMMU_Family =
+       (        
+                'MT6252'   => 1,
+                'MT6252H'  => 1,
+                'MT6250'   => 1,
+       );
+    #############
+    # WARNING,  return 1 if $bb = CR4
+    #############
+	if(&is_arm9($bb) or &is_arm11($bb) or defined $BBtbl_MTKMMU_Family{$bb} or &is_CR4($bb))
+	{
+		$nIsMMU = 1;
+	}
+	return $nIsMMU;	
+}
+#****************************************************************************
+# subroutine: is_sv5 - Query if it's SV5 Family
+# Input:      BB chip  (eg. MT6276)
+# Output:     1=belongs sv5 family, undef=not sv5 family
+#****************************************************************************
+sub is_sv5
+{
+    my ($bb) = (@_);
+    my $nDefault_SV5_Family = 1;
+    my %BBtbl_SV5_Family =
+       (        
+                #'TK6291'  => 1,
+                #'MT6755'  => 1,
+       );
+    return (exists $BBtbl_SV5_Family{$bb}
+        ? $BBtbl_SV5_Family{$bb}: $nDefault_SV5_Family);
+}
+
+#****************************************************************************
+# subroutine: DSPTXRX_query_length
+# purpose : Exec View :: DSP TX RX :: Size Of TX RX query
+# Input:      1. $bb: e.g. MT6280 
+#             2. $mode: e.g. BASIC, L1S, GSM, GPRS, UMTS
+# Output:     (nTXLength, nRXLength)
+#****************************************************************************
+sub DSPTXRX_query_length
+{
+    my ($bb, $mode) = @_;
+    # --- --- --- 
+    my %BBtbl_l1s_tx =
+       (
+			#'TK6291'  => 0x20000,            # format: '"chip"' -> 'size'
+	         'ELBRUS'  => 0x20000,
+	         'MT6763'  => 0x20000,
+	         'MT6739'  => 0x20000,
+	         'MT6771'  => 0x20000,
+	         'MT6295M'  => 0x20000
+       );
+       #map {print $_, "\n";} keys %BBtbl;
+    my %BBtbl_l1s_rx =
+       (
+	         'ELBRUS'  => 0x20000,
+	         'MT6763'  => 0x20000,
+	         'MT6739'  => 0x20000,
+	         'MT6771'  => 0x20000,
+	         'MT6295M'  => 0x20000
+       );
+       #map {print $_, "\n";} keys %BBtbl;
+    # --- --- --- 
+    
+    my ($nTX, $nRX) = (0x20000, 0x20000); #default on MD
+    
+    if ($mode =~ /L1S/i)
+    {
+        if ((exists $BBtbl_l1s_tx{$bb}) and (exists $BBtbl_l1s_rx{$bb}))
+        {
+            ($nTX, $nRX) = ($BBtbl_l1s_tx{$bb}, $BBtbl_l1s_rx{$bb});
+        }
+    }
+
+    return ($nTX, $nRX)
+}
+
+#****************************************************************************
+# subroutine: VoLTE_core_query_length
+# purpose : for refurn length of SS1 DSP
+# Input:      1. $bb: e.g. MT6763 
+
+# Output:     nVoLTE_len
+#****************************************************************************
+sub VoLTE_core_query_length
+{
+    my ($bb) = @_;
+
+    my %BBtbl_VoLTE_len =
+       (
+	         # format: '"chip"' => 'size'1
+	         'MT6763'  => 0x1000000
+       );
+
+    my $nVoLTE_len = 0;
+    $nVoLTE_len = $BBtbl_VoLTE_len{$bb} if (exists $BBtbl_VoLTE_len{$bb});
+    return $nVoLTE_len;
+}
+
+#****************************************************************************
+# subroutine:  determine CS1 base address
+# input:       BB chip
+# Output:      1 = CS1 base address is 0x08000000, others = CS1 base address is 0x10000000
+#****************************************************************************
+sub check_cs1_base
+{
+    my ($bb) = (@_);
+    my %BBtbl_cs1_base =
+       (
+            #'MT6251'  => 1,
+       );
+    return $BBtbl_cs1_base{$bb};
+
+}
+
+#****************************************************************************
+# subroutine:  SCHEME Configure Routines :: Query :: CS1 base address
+# Note      :  this function doesn't guarantee if the chip needs to remap.
+#              it only returns the address if needing remapping.
+# input:       BB chip, base address(if no input, it's 0 in default), isBootloader(undef or 0= not bootloader)
+# Output:      CS1 default base address
+#****************************************************************************
+sub query_cs1_addr
+{
+    my ($bb, $nBaseAddress, $bisBL) = @_;
+    $nBaseAddress = 0 if(!defined $nBaseAddress);
+    my $nCS1BaseAddress = $nBaseAddress;
+    if (&check_cs1_base($bb) == 1)
+    {
+        $nCS1BaseAddress = $nBaseAddress ^ 0x08000000;
+    }
+    else
+    {
+        $nCS1BaseAddress = $nBaseAddress ^ 0x10000000;
+    }
+    if(defined $bisBL and $bisBL != 0)
+    {
+        if($bb eq "MT6255")
+        {
+            $nCS1BaseAddress = $nBaseAddress;
+        }
+    }
+    return $nCS1BaseAddress;
+}
+#****************************************************************************
+# subroutine:  SCHEME Configure Routines :: Query :: viva header size
+# note:        This function is used to get viva header size if
+#              DCMP support or ZIMAGE support or ALICE support
+# input:       BB chip
+# Output:      viva header size
+#****************************************************************************
+sub query_viva_size
+{
+    require "pcore/tools/vivaHelper.pm";
+    my ($bb) = @_;
+    my $viva_size = &vivaHelper::GetVIVAHeaderSize_NI(&is_sv5($bb));
+    return $viva_size;
+}
+#****************************************************************************
+# subroutine:  is_XIP_Shadowing
+# Note      :  this function is to query which chip needs to do shadowing
+#              due to speeding up on NOR or Serial Flash
+# input:       BB chip
+# Output:      0=unsupported, 1=supported
+#****************************************************************************
+sub is_XIP_Shadowing
+{
+    my ($bb) = @_;
+    my $nDefault_XIP_Family = 1;
+    my %BBtbl_XIP_Family =
+       (        
+            #'TK6291'  => 1,            
+            #'MT6755'  => 1,
+       );
+    return (exists $BBtbl_XIP_Family{$bb}
+        ? $BBtbl_XIP_Family{$bb}: $nDefault_XIP_Family);
+}
+
+#****************************************************************************
+# subroutine:  SwitchToClonedChip
+# Note      :  this function is to get original cloned chip 
+#              otherwises it returns input chip.
+# input:       strBBChip (e.g. MT6280) 
+# Output:      strBBChip (e.g. MT6280)
+#****************************************************************************
+sub SwitchToClonedChip
+{
+    my ($bb) = @_;
+    my %BBtbl_Family =
+       (
+#            "TK6291"  => "MT6290",
+	    "MT6765"  => "MT6771",
+	    "MT3967"  => "MT6295M",
+        "MT6779"  => "MT6295M",
+        "MT6785"  => "MT6295M",
+        "MT6885"  => "MT6297",
+        "MERCURY" => "MT6297",
+        "MT6873"  => "MT6297",
+        "MT6853"  => "MT6297",
+        "MT6833"  => "MT6297",
+        "MT6893"  => "MT6297",
+        "MT6880"  => "MT6297",
+        "MT6890"  => "MT6297",
+        "MT2735"  => "MT6297",
+        "MT6877"  => "MT6297",
+       );
+    $bb = $BBtbl_Family{$bb} if(defined $BBtbl_Family{$bb});
+    return $bb;
+}
+
+#****************************************************************************
+# subroutine:  isSupportedtoAdjustLoadView
+# Note      :  this function is to get if this chip supported AAPMC to adjust rom length and ram base
+# input:       strBBChip (e.g. MT6280) 
+# Output:      0: not supported, 1= supported by default
+#****************************************************************************
+sub isSupportedToAdjustLoadView
+{
+    my ($bb) = @_;
+    my $bSupported = 1; # support to adjust ROM Length and RAM base by default
+    $bb = SwitchToClonedChip($bb);
+    my %BBtbl_Family =
+       (        
+            #"TK6291"  => 1,
+	     "ELBRUS"  => 0,
+	     "MT6763"  => 1,
+	     "MT6739"  => 1,
+	     "MT6771"  => 1,
+	     "MT6295M"  => 1,
+       );
+    $bSupported = $BBtbl_Family{$bb} if(defined $BBtbl_Family{$bb});
+    $bSupported = 1 if(FileInfo::is("ORIGINAL_FLAVOR", "SLT")); #SLT default = md only load
+    $bSupported = 0 if(BuildInfo::exist(BuildOPT::CMPL, "__ESL_COSIM_LTE__"));
+    return $bSupported;
+}
+#****************************************************************************
+# subroutine:  isSupportedToAdjustRAMSize
+# Note      :  this function is to get if this chip supported AAPMC to adjust RAM Length
+# input:       strBBChip (e.g. MT6280) 
+# Output:      0: not supported by default, 1= supported 
+#****************************************************************************
+sub isSupportedToAdjustRAMSize
+{
+    my ($bb) = @_;
+    my $bSupported = 1; # do support to adjust RAM Length by default
+    $bb = SwitchToClonedChip($bb);
+    my %BBtbl_Family =
+       (        
+	     "ELBRUS"  => 0,
+	     "MT6763"  => 1,
+	     "MT6739"  => 1,
+	     "MT6771"  => 1,
+	     "MT6295M"  => 1,
+       );
+    $bSupported = $BBtbl_Family{$bb} if(defined $BBtbl_Family{$bb});
+    $bSupported = 0 if(FileInfo::is("SMART_PHONE_CORE", "MODEM_ONLY"));
+    $bSupported = 1 if(FileInfo::is("ORIGINAL_FLAVOR", "SLT")); #SLT default = md only load
+    return $bSupported;
+}
+
+#****************************************************************************
+# subroutine:  GetDefaultSharedMemorySize
+# Note      :  this function is to get default shared memory size by chip, for 1st linking
+# input:       strBBChip (e.g. MT6280) 
+# Output:      $nAlignment: default =1 
+#****************************************************************************
+sub GetDefaultSharedMemorySize
+{   #remember to check MD total size in GetMDTotolSize (ldsGenLib.pl)
+
+    my ($bb) = @_;
+
+    my %BBtbl_SHMsize =
+    (        
+        'TK6291'  => 0x8000000,     # 128 MB
+        'MT6755'  => 0x5000000,     #  80 MB
+        'MT6797'  => 0x5000000,     #  80 MB
+    );
+  
+    my $SHM_with_ramdisk_default_size = 0x8000000;   # 128 MB
+    my %BBtbl_SHM_with_ramdisk_size = 
+    (   # format: '"chip"' -> 'size'
+    );
+
+    &error_handler("No default shared memory size for this chip $bb", __FILE__, __LINE__)
+        if(! exists $BBtbl_SHMsize{$bb});
+
+    # for ramdisk or MD only load
+    if ( FileInfo::is("FS_RAMDISK", "TRUE")
+        or FileInfo::is("SMART_PHONE_CORE", "MODEM_ONLY") )
+    {
+        return $BBtbl_SHM_with_ramdisk_size{$bb} if (exists $BBtbl_SHM_with_ramdisk_size{$bb});
+        return $SHM_with_ramdisk_default_size;
+    }
+
+    # return default size
+    return $BBtbl_SHMsize{$bb};
+}
+
+#****************************************************************************
+# subroutine:  GetMD_AlignmentByChip
+# Note      :  this function is to get MD Ram Alignment by chip
+# input:       strBBChip (e.g. MT6280) 
+# Output:      $nAlignment: default =1 
+#****************************************************************************
+sub GetMD_AlignmentByChip
+{
+    my ($bb) = @_;
+    my $nAlignment = 1; #1MB aligned
+    my %BBtbl_Alignment =
+    (        
+            #'MT6582'  => 2,
+    );
+    if(exists $BBtbl_Alignment{$bb})
+    {
+        $nAlignment = $BBtbl_Alignment{$bb};
+    }
+    return $nAlignment;
+}
+
+#****************************************************************************
+# subroutine:  GetMD_AlignmentByChip
+# Note      :  this function is to get MD Ram Alignment by chip
+# input:       strBBChip (e.g. MT6280) 
+# Output:      $nAlignment: default =1 
+#****************************************************************************
+sub GetCopro_KBAlignment
+{
+    my ($strCopro) = @_;
+    my $nAlignment = 1024; # 1MB aligned
+    my %BBtbl_Alignment =
+    (        
+ #           'L1CORE'  => 4,
+    );
+    if(exists $BBtbl_Alignment{$strCopro})
+    {
+        $nAlignment = $BBtbl_Alignment{$strCopro};
+    }
+    return $nAlignment;
+}
+
+
+#****************************************************************************
+# Subroutine:   GetNonCacheablePrefix
+# Parameters:   strBBChip (e.g. MT6280) 
+# Returns:      an bank adress for OR
+#               default: 0x0
+#****************************************************************************
+sub GetNonCacheablePrefix
+{
+    my ($bb) = @_;
+    my %BBtbl_Family =
+       (        
+            
+       );
+    my $prefix = 0;
+    $prefix = $BBtbl_Family{$bb} if(defined $BBtbl_Family{$bb});
+    return $prefix;
+}
+#****************************************************************************
+# Subroutine:   GetCacheablePrefix
+# Parameters:   strBBChip (e.g. MT6280) 
+# Returns:      an bank adress for OR
+#               default: 0xF0000000
+#****************************************************************************
+sub GetCacheablePrefix
+{
+    my ($bb) = @_;
+    my %BBtbl_Family =
+       (
+            
+       );
+    my $prefix = 0x60000000;
+    $prefix = $BBtbl_Family{$bb} if(defined $BBtbl_Family{$bb});
+    return $prefix;
+
+}
+#****************************************************************************
+# Subroutine:   del_noCheckinHistory_file
+# Parameters:   one file path
+# Returns:      N/A
+#****************************************************************************
+sub del_noCheckinHistory_file
+{
+    my ($filepath) = @_;
+    return unless (-e $filepath);
+
+    my $nHas = &HasCheckinHistory($filepath);
+    if($nHas == 1)
+    {
+        print "$filepath: Check-in message is found. No need to update.\n";
+    }
+    elsif($nHas == 0)
+    {
+        unlink $filepath;
+        print "delete $filepath since no manual check-in pattern!\n" if(!-f $filepath);
+        print "$filepath can't be deleted properly!\n" if(-f $filepath);
+    }
+    return;
+}
+#****************************************************************************
+# Subroutine:   HasCheckinHistory
+# Parameters:   one file path
+# Returns:      undef=not exists, 0=no history, 1=has history
+#****************************************************************************
+sub HasCheckinHistory
+{
+    my ($filepath) = @_;
+    return undef unless (-e $filepath);
+    my $nReturn = 0; # Empty=not exists, 0=no history, 1=has history
+
+    ## Now check if the $target file check-in or auto-gen
+    open SRC_FILE_R , "<$filepath" or &error_handler("$filepath: file error!", __FILE__, __LINE__);
+    my $reading;
+    {
+		local $/;
+		$reading = <SRC_FILE_R>; 
+	}    
+    close SRC_FILE_R;
+
+    ## Look for check-in pattern ##
+    if (($reading =~ /\[MAUI_\d{8}\]|\[MOLY\d{8}\]|\[ALPS\d{8}\]/) or ($reading =~ /MANUAL-CHECKIN/i))
+    {
+        return 1;
+    }   
+    return 0;
+}
+
+#****************************************************************************
+# subroutine:  CopyFileWithReplacement
+# input:       $SrcPath - source file path
+#              $DestPath - destination path
+#              $Array_ref : An array of strings to be replaced to empty string
+# output:     N/A
+# Description: 1. if the file name doesn't contain .template, replace sysgen1 verno on it
+#              2. replace the string in $Array_ref to empty string
+#****************************************************************************
+sub CopyFileWithReplacement
+{
+    my ($SrcPath, $DestPath, $Array_ref, $StrVersion) = @_;
+    my $content;
+    open FILE, "<$SrcPath" or &sysUtil::sysgen_die("$SrcPath: open file error!", __FILE__, __LINE__);
+    {
+        local $/;
+        $content = <FILE>;
+    }
+    close FILE;
+
+    if($SrcPath !~ /\.template$/)
+    {
+        #Add sysgen1.pl's verno to the file
+        $content =~ s/system\s*auto\s*generator(.*)//;    
+        $content =~ s/Author\s*:\s+(.*)\s+(.*)/Author:\n $1\n $2    $StrVersion /;
+    }
+
+    #replace the string in $Array_ref to empty string
+    map {$content =~ s/$_//ig} @$Array_ref;
+        
+    open FILE, ">$DestPath" or &sysUtil::sysgen_die("$DestPath: open file error!", __FILE__, __LINE__);
+    print FILE $content;
+    close FILE;
+}
+
+#****************************************************************************
+# Subroutine:   isDummyScatter
+# Parameters:   $bINSIDE_MTK = 0 or 1, $strDUMMY_SCATTER_FORCE = TRUE or FALSE
+# Returns:      0=not dummy , 1=is dummy
+#****************************************************************************
+sub isDummyScatter
+{
+    my ($bINSIDE_MTK, $strDUMMY_SCATTER_FORCE) = @_;
+    my $bIsDummy = 0; #not dummy by default
+    if (1 == &FileInfo::is_NOR())
+    {
+        if(&FileInfo::is('dummy_scatter_enable', "TRUE"))
+        {
+            $bIsDummy = 1 if($bINSIDE_MTK == 1);
+        }
+    }
+    $bIsDummy = 1 if($strDUMMY_SCATTER_FORCE eq 'TRUE');
+    return $bIsDummy;
+}
+
+sub GetSigSize
+{
+	return 256;
+}
+
+
+
+
+#****************************************************************************
+# 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;
+}
+
+sub sysgen_die
+{
+    my ($error_msg, $file, $line_no) = @_;
+    &error_handler($error_msg, $file, $line_no, 'SYSGEN');
+}
+sub sysUtil_die
+{
+    my ($error_msg, $file, $line_no) = @_;
+    &error_handler($error_msg, $file, $line_no, 'SYSGENUTILITY');
+}
+
+#****************************************************************************
+# subroutine:  description_file_header
+# return:      file header -- description 
+# input:       $filename:     filename
+# input:       $description:  one line description
+# input:       $author:       optional
+# input:       $strComment:   optional
+# input:       $bAutoGen      optional: 1=AutoGen, 0 or undef = not AutoGen
+#****************************************************************************
+sub description_file_header
+{
+    my ($filename, $description, $author, $strComment, $bAutoGen) = @_;
+    $filename =~ s/.*\///;
+    my $strAutoGeneratedDate = " *\n";
+    my $strWarning;
+    if($bAutoGen == 1)
+    {
+        my ($day, $month, $year) = (localtime)[3,4,5]; $month++; $year+=1900;
+        $strAutoGeneratedDate = <<"__TEMPLATE";
+ *
+ * Auto Generated Date:
+ * -------
+ *   $year/$month/$day
+ *
+__TEMPLATE
+        $strWarning = <<"__TEMPLATE";
+ * This file is auto-generated and please DO NOT change the content at will
+ *=========================================================================
+__TEMPLATE
+        $strComment = $strWarning.$strComment;
+    }
+    my $template = <<"__TEMPLATE";
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ *   $filename
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   $description
+ *
+ * Author:
+ * -------
+ *   $author
+$strAutoGeneratedDate
+ *============================================================================
+ *             HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * \$Revision\$
+ * \$Modtime\$
+ * \$Log\$
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+$strComment
+ ****************************************************************************/
+
+__TEMPLATE
+
+   return $template;
+}
+
+#****************************************************************************
+# subroutine:  copyright_file_header
+# return:      file header -- copyright
+#****************************************************************************
+sub copyright_file_header
+{
+    my $template = <<"__TEMPLATE";
+/*****************************************************************************
+*  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).
+*
+*****************************************************************************/
+
+__TEMPLATE
+
+   return $template;
+}