[Feature]Upload Modem source code

Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/tools/MemoryUtility/systemInfo.pm b/mcu/tools/MemoryUtility/systemInfo.pm
new file mode 100644
index 0000000..be06e4d
--- /dev/null
+++ b/mcu/tools/MemoryUtility/systemInfo.pm
@@ -0,0 +1,749 @@
+#!/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:
+#* ---------
+#*   SystemInfo.pm
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#*   This module collects the subroutines for system information. 
+#*       
+#*
+#* Author:
+#* -------
+#*   Carl Kao (mtk08237)
+#*
+#****************************************************************************/
+
+BEGIN { push @INC, '../', './tools/', './tools/MemoryUtility/' }
+package sysInfo;
+use sysInfoProcessScat; #this module is applied to RVCT compiler
+use sysInfoProcessLds;  #this module is applied to GCC compiler
+use FileInfoParser;
+use strict;
+
+#****************************************************************************
+# Constants
+#****************************************************************************
+my $SYSINFO_VERNO     = " u0.02";
+             # u0.02 , 2015/01/23,  Add TX/RX section to FilterOutSharedRegion
+             # u0.01 , 2015/01/14,  Memory Utility Refinement
+             # m0.05 , 2013/10/20,  Support FilterOutSecureRegion()
+             # m0.04 , 2013/06/25,  Support FilterOutCoproReservedRegion()
+             # m0.03 , 2012/08/03,  Modify the comment of GetTCMmargin()
+             # m0.02 , 2012/08/03,  Modify module name and push additional library path
+             # m0.01 , 2012/07/05,  Initial revision
+
+#****************************************************************************
+# Global variable
+#****************************************************************************
+my $DebugPrint = 0;
+
+#****************************************************************************
+# oo >>>  Finished
+#****************************************************************************
+return 1;
+
+#****************************************************************************
+# Subroutine:  systemInfo_verno - to query this package's version number
+# Parameters:  x
+# Returns:     version number string
+#****************************************************************************
+sub systemInfo_verno
+{
+    return $SYSINFO_VERNO;
+}
+
+#****************************************************************************
+# Subroutine:  GetChipInsideRAMregion - to query all Chip inside RAM regions
+# Parameters:  $strFilePath = the path of file (scatter file or lds file)
+#              $INTSRAMregion_href = a Hash reference to store ChipInsideRAM infomation
+#              $INTSRAMregion_href->{regionName} = []
+#              $MAKEFILE_ref = a Hash to contain MAKEFILE information
+# Returns:     $nINTSRAMnum = the number of ChipInsideRAM regions
+#****************************************************************************
+sub GetChipInsideRAMregion
+{
+    my ($strFilePath, $INTSRAMregion_href, $MAKEFILE_ref) = (@_);
+    print "file path = $strFilePath\n" if($DebugPrint == 1);
+    my $strCompiler = &FileInfo::GetCompiler($MAKEFILE_ref);
+
+    my $nINTSRAMnum = 0;
+    if($strCompiler eq "RVCT")
+    {
+        $nINTSRAMnum = &sysInfoProcScat::GetChipInsideRAMregion($strFilePath, $INTSRAMregion_href);
+    }
+    elsif($strCompiler eq "GCC")
+    {
+        $nINTSRAMnum = &sysInfoProcLds::GetChipInsideRAMregion($strFilePath, $INTSRAMregion_href);  
+    }
+    return ($nINTSRAMnum);
+}
+
+#****************************************************************************
+# Subroutine:  GetChipInsideRAMsize - to query ChipInsideRAM size
+# Parameters:  $strFilePath = the path of file (scatter file or lds file)
+#              $INTSRAMinfo_href = a Hash reference to store ChipInsideRAM infomation
+#              ($INTSRAMinfo_href -> {ChipInsideRAM type} = MaxSize)
+#              $MAKEFILE_ref = a Hash to contain MAKEFILE information
+# Returns:     $nINTSRAMnum = the number of ChipInsideRAM types
+#****************************************************************************
+sub GetChipInsideRAMsize
+{
+    my ($strFilePath, $INTSRAMinfo_href, $MAKEFILE_ref) = (@_);
+    print "file path = $strFilePath\n" if($DebugPrint == 1);
+    my $strCompiler = &FileInfo::GetCompiler($MAKEFILE_ref);
+    
+    my $nINTSRAMnum = 0;
+    if($strCompiler eq "RVCT")
+    {
+        $nINTSRAMnum = &sysInfoProcScat::GetChipInsideRAMsize($strFilePath, $INTSRAMinfo_href);
+    }
+    elsif($strCompiler eq "GCC")
+    {
+        $nINTSRAMnum = &sysInfoProcLds::GetChipInsideRAMsize($strFilePath, $INTSRAMinfo_href);
+    }
+    return ($nINTSRAMnum);
+}
+
+#****************************************************************************
+# Subroutine:  GetTCMmargin - to query TCM margin
+# Parameters:  $strFilePath = the path of file (scatter file or lds file)
+#              $TCMregion_href = a Hash reference to store TCM infomation
+#              $TCMregion_href->{'regionName'} = size
+#              $MAKEFILE_ref = a Hash to contain MAKEFILE information
+# Returns:     $TCMmargin_href = a Hash reference to store TCM information
+#              $TCMmargin_href->{ITCM}->[0] = ITCM physical size, $TCMmargin_href->{ITCM}->[1] = ITCM margin
+#              $TCMmargin_href->{DTCM}->[0] = DTCM physical size, $TCMmargin_href->{DTCM}->[1] = DTCM margin
+#              $TCMmargin_href->{TCM}->[0]  = TCM physical size , $TCMmargin_href->{TCM}->[1]  = TCM margin
+#****************************************************************************
+sub GetTCMmargin
+{
+    my ($strFilePath, $TCMregion_href, $MAKEFILE_ref) = (@_);
+    print "file path = $strFilePath\n" if($DebugPrint == 1);
+    my $strCompiler = &FileInfo::GetCompiler($MAKEFILE_ref);
+
+    my $TCMmargin_href = undef;
+    if($strCompiler eq "RVCT")
+    {
+        $TCMmargin_href = &sysInfoProcScat::GetTCMmargin($strFilePath, $TCMregion_href);
+    }
+    elsif($strCompiler eq "GCC")
+    {
+        $TCMmargin_href = &sysInfoProcLds::GetTCMmargin($strFilePath, $TCMregion_href);
+    }
+    return ($TCMmargin_href);
+}
+
+#****************************************************************************
+# Subroutine:  GetphysicalRAMsize - to query physical RAM size
+# Parameters:  $BB_PATH = the path of BB folder
+#              $MAKEFILE_ref = a Hash to contain MAKEFILE information
+# Returns:     $nRAMsize = the physical RAM size
+#****************************************************************************
+sub GetphysicalRAMsize
+{
+    my ($BB_PATH, $MAKEFILE_ref) = (@_);
+    my $nRAMsize = undef;
+    my $strCompiler = &FileInfo::GetCompiler($MAKEFILE_ref);
+
+    if($strCompiler eq "RVCT")
+    {
+        $nRAMsize = &sysInfoProcScat::GetphysicalRAMsize($BB_PATH);
+    }
+    elsif($strCompiler eq "GCC")
+    {
+        $nRAMsize = &sysInfoProcLds::GetphysicalRAMsize($BB_PATH);
+    }
+    return $nRAMsize;
+}
+
+#****************************************************************************
+# Subroutine:  GetAvailableRAMsize - to query available RAM size
+# Parameters:  $BB_PATH = the path of BB folder
+#              $MAKEFILE_ref = a Hash to contain MAKEFILE information
+# Returns:     $nRAMsize = the available RAM size
+#****************************************************************************
+sub GetAvailableRAMsize
+{
+    my ($BB_PATH, $MAKEFILE_ref) = (@_);
+    my $nRAMsize = undef;
+    my $strCompiler = &FileInfo::GetCompiler($MAKEFILE_ref);
+
+    if($strCompiler eq "RVCT")
+    {
+        $nRAMsize = &sysInfoProcScat::GetAvailableRAMsize($BB_PATH);
+    }
+    elsif($strCompiler eq "GCC")
+    {
+        $nRAMsize = &sysInfoProcLds::GetAvailableRAMsize($BB_PATH);
+    }
+    return $nRAMsize;
+}
+
+#****************************************************************************
+# Subroutine:  GetRAMregion - to query all regions placed in RAM
+# Parameters:  $BB_PATH
+#              $strFilePath = the path of file (scatter file or lds file)
+#              $RAMregion_aref = a Array reference to store RAM regions 
+#              $RAMregion_href->{regionName} = []
+#              $MAKEFILE_ref = a Hash to contain MAKEFILE information
+# Returns:     $nRAMnum = the number of RAM regions
+#****************************************************************************
+sub GetRAMregion
+{
+    my ($BB_PATH, $strFilePath, $RAMregion_aref, $MAKEFILE_ref) = @_;
+    print "file path = $strFilePath\n" if($DebugPrint == 1);
+    my $strCompiler = &FileInfo::GetCompiler($MAKEFILE_ref);
+    
+    my $nRAMnum = 0;
+    if($strCompiler eq "RVCT")
+    {
+        $nRAMnum = &sysInfoProcScat::GetRAMregion($BB_PATH, $strFilePath, $RAMregion_aref, $MAKEFILE_ref);
+    }
+    elsif($strCompiler eq "GCC")
+    {
+        $nRAMnum = &sysInfoProcLds::GetRAMregion($BB_PATH, $strFilePath, $RAMregion_aref, $MAKEFILE_ref);  
+    }
+    return ($nRAMnum);
+}
+
+#****************************************************************************
+# Subroutine:  GetRAMBoundaryregion - to query the boundary regions in RAM
+#              this function can be used to calculate RAM margin
+# Parameters:  $strFilePath  = the path of file (scatter file or lds file)
+#              $MAKEFILE_ref = a Hash to contain MAKEFILE information
+# Returns:     $LAST_CACHED_REGION  = the last cached region in RAM
+#              $DUMMY_END   = the dummy_end region in RAM
+#****************************************************************************
+sub GetRAMBoundaryregion
+{
+    my ($strFilePath, $MAKEFILE_ref) = (@_);
+    print "file path = $strFilePath\n" if($DebugPrint == 1);
+    my $strCompiler = &FileInfo::GetCompiler($MAKEFILE_ref);
+
+    my ($LAST_CACHED_REGION, $DUMMY_END)= (undef, undef);
+    if($strCompiler eq "RVCT")
+    {   
+        ($LAST_CACHED_REGION, $DUMMY_END) = &sysInfoProcScat::GetRAMBoundaryregion($strFilePath, $MAKEFILE_ref);
+    }
+    elsif($strCompiler eq "GCC")
+    {
+        ($LAST_CACHED_REGION, $DUMMY_END) = &sysInfoProcLds::GetRAMBoundaryregion($strFilePath, $MAKEFILE_ref);  
+    }
+    return ($LAST_CACHED_REGION, $DUMMY_END);
+}
+
+#****************************************************************************
+# Subroutine:  GetphysicalROMsize - to query physical ROM size
+# Parameters:  $BB_PATH = the path of BB folder
+#              $MAKEFILE_ref = a Hash to contain MAKEFILE information
+# Returns:     $nROMsize = the physical ROM size
+#****************************************************************************
+sub GetphysicalROMsize
+{
+    my ($BB_PATH, $MAKEFILE_ref) = (@_);
+    my $nROMsize = undef;
+    my $strCompiler = &FileInfo::GetCompiler($MAKEFILE_ref);
+
+    if($strCompiler eq "RVCT")
+    {
+        $nROMsize = &sysInfoProcScat::GetphysicalROMsize($BB_PATH);
+    }
+    elsif($strCompiler eq "GCC")
+    {
+        $nROMsize = &sysInfoProcLds::GetphysicalROMsize($BB_PATH);
+    }
+    return $nROMsize;
+}
+
+#****************************************************************************
+# Subroutine:  GetAvailableROMsize - to query available ROM size
+# Parameters:  $BB_PATH = the path of BB folder
+#              $MAKEFILE_ref = a Hash to contain MAKEFILE information
+# Returns:     $nROMsize = the available ROM size
+#****************************************************************************
+sub GetAvailableROMsize
+{
+    my ($BB_PATH, $MAKEFILE_ref) = (@_);
+    my $nROMsize = undef;
+    my $strCompiler = &FileInfo::GetCompiler($MAKEFILE_ref);
+
+    if($strCompiler eq "RVCT")
+    {
+        $nROMsize = &sysInfoProcScat::GetAvailableROMsize($BB_PATH);
+    }
+    elsif($strCompiler eq "GCC")
+    {
+        $nROMsize = &sysInfoProcLds::GetAvailableROMsize($BB_PATH);
+    }
+    return $nROMsize;
+}
+
+#****************************************************************************
+# Subroutine:  GetROMregion - to query all regions placed in ROM
+# Parameters:  $BB_PATH
+#              $strFilePath = the path of file (scatter file or lds file)
+#              $ROMregion_href = a Hash reference to store ROM regions
+#              $ROMregion_href->{regionName} = []
+#              $MAKEFILE_ref = a Hash to contain MAKEFILE information
+# Returns:     $nROMnum = the number of ROM regions
+#****************************************************************************
+sub GetROMregion
+{
+    my ($BB_PATH, $strFilePath, $ROMregion_href, $MAKEFILE_ref) = (@_);
+    print "file path = $strFilePath\n" if($DebugPrint == 1);
+    my $strCompiler = &FileInfo::GetCompiler($MAKEFILE_ref);
+
+    my $nROMnum = 0;
+    if($strCompiler eq "RVCT")
+    {
+        $nROMnum = &sysInfoProcScat::GetROMregion($BB_PATH, $strFilePath, $ROMregion_href, $MAKEFILE_ref);
+    }
+    elsif($strCompiler eq "GCC")
+    {
+        $nROMnum = &sysInfoProcLds::GetROMregion($BB_PATH, $strFilePath, $ROMregion_href, $MAKEFILE_ref);  
+    }
+    return ($nROMnum);
+}
+
+sub FilterOutRegionInRAM
+{
+    my ($prvER_aref, $MAKEFILE_ref) = @_;
+    my @ERInRAM;
+    my $strCompiler = &FileInfo::GetCompiler($MAKEFILE_ref);
+    if($strCompiler eq "GCC")
+    {
+        &sysInfoProcLds::FilterOutRegionInRAM($prvER_aref, \@ERInRAM);
+    }
+    return \@ERInRAM;
+}
+sub FilterOutFixedRegion
+{
+    my ($prvER_aref, $MAKEFILE_ref) = @_;
+    my @ERInRAM;
+    my $strCompiler = &FileInfo::GetCompiler($MAKEFILE_ref);
+    if($strCompiler eq "GCC")
+    {
+        &sysInfoProcLds::FilterOutFixedRegion($prvER_aref, \@ERInRAM);
+    }
+    return \@ERInRAM;
+}
+
+sub FilterOutCoproReservedRegion
+{
+    my ($prvER_aref) = @_;
+    my @ERs;
+    my @ReversePrvER = reverse @$prvER_aref;
+    my $bTrim = 0;
+    foreach my $item (@ReversePrvER)
+    {
+        #######################
+        # add L1CORE_LV and L1CORE_RWZI to list
+        #######################
+        if($item !~/copro|L1CORE_LV|L1CORE_RWZI/i)
+        {
+           push (@ERs , $item);   
+        }
+        else
+        {
+           # print "[FilterOutCoproReservedRegion]Skip $item\n";    
+        }
+    }
+    @ERs = reverse @ERs;
+    return \@ERs;
+}
+
+sub FilterOutSecureRegion
+{
+    my ($prvER_aref) = @_;
+    my @ERs;
+    my @ReversePrvER = reverse @$prvER_aref;
+    my $bTrim = 0;
+    foreach my $item (@ReversePrvER)
+    {
+        if($item !~/SECURE_RO|SIGNATURE/i)
+        {
+           push (@ERs , $item);   
+        }
+        else
+        {
+           # print "[FilterOutCoproReservedRegion]Skip $item\n";    
+        }
+    }
+    @ERs = reverse @ERs;
+    return \@ERs;
+}
+
+sub FilterOutSharedRegion
+{
+    my ($prvER_aref) = @_;
+    my @ERs;
+    my @ReversePrvER = reverse @$prvER_aref;
+    my $bTrim = 0;
+    foreach my $item (@ReversePrvER)
+    {
+        if($item !~/SHARED|TX|RX/i)
+        {
+           push (@ERs , $item);   
+        }
+        else
+        {
+           # print "[FilterOutCoproReservedRegion]Skip $item\n";    
+        }
+    }
+    @ERs = reverse @ERs;
+    return \@ERs;
+}
+
+sub GetRegionInfo
+{
+    my ($ER, $nOption, $strFilePath, $MAKEFILE_ref) = @_;
+    my $strCompiler = &FileInfo::GetCompiler($MAKEFILE_ref);
+    my $Info;
+    if($strCompiler eq "GCC")
+    {
+        $Info = &sysInfoProcLds::GetRegionInfoFromLDS($ER, $nOption, $strFilePath);
+    }
+    return $Info;
+}
+
+sub GetMemoryInfo
+{
+    my ($strName, $nOption, $strFilePath, $MAKEFILE_ref) = @_;
+    my $strCompiler = &FileInfo::GetCompiler($MAKEFILE_ref);
+    my $strInfo;
+    if($strCompiler eq "GCC")
+    {
+        $strInfo = &sysInfoProcLds::GetMemoryInfoFromLDS($strName, $nOption, $strFilePath);
+    }
+    return $strInfo;
+}
+
+__END__
+
+=head1 NAME
+
+systemInfo.pm - Perl module to get system Infomation
+
+=head1 SYNOPSIS
+
+    use systemInfo;
+
+=head2 Table of Contents
+
+systemInfo consists of a collection of modules whose details 
+are too big to fit in one document.  This POD explains the
+top-level APIs and general topics.  For detailed implementation
+, please see the PODs below:
+
+  Name			        Description
+  --------------------------------------------------------
+  sysInfoProcessGCC         Process module for GCC compiler
+  sysInfoProcessRVCT        Process module for RVCT compiler
+  --------------------------------------------------------
+
+=head1 DESCRIPTION
+
+The module provides the interfaces to get the system information under GCC/RVCT build environment
+
+=head1 EXAMPLES
+
+Here are some code samples showing a possible usage of systemInfo:
+
+1. Get all ChipInside-RAM regions
+
+    use systemInfo;
+    use FileInfoParser;
+
+    my $makeFile = "/proj/[usrID]/[path]/MT6280_R7R8_HSPA(FULL_VERSION).mak";
+    my $file = "/proj/[usrID]/[path]/ldsMT6280_R7R8.txt";
+    my %MAKEFILE_OPTIONS;
+    my %ChipInsideRam_region;
+    my $nChipInsideRAMnum = 0;
+    
+    &FileInfo::Parse_MAKEFILE($makeFile, \%MAKEFILE_OPTIONS); #Must run this subroutine first for other activities
+
+    $nChipInsideRAMnum =  &sysInfo::GetChipInsideRAMregion($file, \%ChipInsideRam_region, \%MAKEFILE_OPTIONS);
+    
+    print "nChipInsideRAMnum = $nChipInsideRAMnum\n";
+    foreach my $strRegionName (keys %ChipInsideRam_region)
+    {
+        print "ChipInsideRAMregion = $strINTSRAMname\n";
+    }
+
+    <OUTPUT>
+    
+    nChipInsideRAMnum = 5
+    ChipInsideRAMregion = INTSRAM_PHYSICAL_BOUNDARY
+    ChipInsideRAMregion = INTSRAM_DATA
+    ChipInsideRAMregion = EMIINIT_CODE
+    ChipInsideRAMregion = INTSRAM_DATA_PREINIT_ZI
+    ChipInsideRAMregion = INTSRAM_CODE
+
+2. Get the size of all ChipInside RAM
+
+    use systemInfo;
+    use FileInfoParser;
+
+    my $makeFile = "/proj/[usrID]/[path]/MT6280_R7R8_HSPA(FULL_VERSION).mak";
+    my $file = "/proj/[usrID]/[path]/ldsMT6280_R7R8.txt";
+    my %MAKEFILE_OPTIONS;
+    my %ChipInsideRAMInfo;
+    my $nChipInsideRAMnum = 0;
+    
+    &FileInfo::Parse_MAKEFILE($makeFile, \%MAKEFILE_OPTIONS); #Must run this subroutine first for other activities
+    $nChipInsideRAMnum =  &sysInfo::GetINTSRAMsize($file, \%ChipInsideRAMInfo, \%MAKEFILE_OPTIONS);
+    
+    print "nChipInsideRAMnum = $nChipInsideRAMnum\n";
+    foreach my $strRegionName (keys %ChipInsideRAMInfo)
+    {
+        print "$strRegionName size = ".%ChipInsideRAMInfo->{$strRegionName}."\n";
+    }
+
+    <OUTPUT>
+    
+    nChipInsideRAMnum = 1
+    TCM size = 229376
+    
+3. Get TCM margin (TCM or DTCM/ITCM)
+
+   to use this API, the following steps are listed:
+   
+   [step1]
+       Get all ChipInside RAM regions - run GetChipInsideRAMregion() subroutine in systemInf.pm
+   
+   [step2]
+       Get the usage of each ChipInside RAM region - run GetTotalSizeByExeRegion() subroutine in LinkerOutputParser.pm
+       Store these information in a hash - please refer to the example below
+       ([size] need to replace to the real size get from LinkerOutputParser.pm)
+       my %ChipInsideRAMinfo= (
+            INTSRAM_PHYSICAL_BOUNDARY => [size],
+            INTSRAM_DATA => [size],
+            EMIINIT_CODE => [size],
+            INTSRAM_DATA_PREINIT_ZI => [size],
+            INTSRAM_CODE => [size],
+            );
+   [step3]
+       run this script to get TCM margin
+       (%ChipInsideRAMinfo is created in step2)
+    
+        my $makeFile = "/proj/[usrID]/[path]/MT6280_R7R8_HSPA(FULL_VERSION).mak";
+        my $file = "/proj/[usrID]/[path]/ldsMT6280_R7R8.txt";
+        my %MAKEFILE_OPTIONS;
+        my $TCMmargin_href = undef;
+    
+        &FileInfo::Parse_MAKEFILE($makeFile, \%MAKEFILE_OPTIONS); #Must run this subroutine first for other activities   
+        $TCMmargin_href =  &sysInfo::GetTCMmargin($file, \%ChipInsideRAMinfo, \%MAKEFILE_OPTIONS);
+
+        foreach my $strRegionname (keys %$TCMmargin_href)
+        {
+            print "$strRegionname margin = ". $TCMmargin_href->{$strRegionname}."\n";
+        }
+
+    <OUTPUT>
+
+    TCM margin = 228926
+
+4. Get physical RAM size
+    
+    use systemInfo;
+    use FileInfoParser;
+
+    my $makeFile = "/proj/[usrID]/[path]/MT6280_R7R8_HSPA(FULL_VERSION).mak";
+    my $BB_PATH  = "/proj/[usrID]/[path]/mcu/build/[project]/[flavor]/custom/system";;
+    my %MAKEFILE_OPTIONS;
+    
+    &FileInfo::Parse_MAKEFILE($makeFile, \%MAKEFILE_OPTIONS); #Must run this subroutine first for other activities    
+    my $nPhyRAMsize = 0;
+    $nPhyRAMsize = &sysInfo::GetphysicalRAMsize($BB_PATH, \%MAKEFILE_OPTIONS);
+    print "nPhyRAMsize = $phyRAMsize\n";
+    
+    <OUTPUT>
+
+    nPhyRAMsize = 8388608
+    
+5. Get available RAM size
+
+    use systemInfo;
+    use FileInfoParser;
+
+    my $makeFile = "/proj/[usrID]/[path]/MT6280_R7R8_HSPA(FULL_VERSION).mak";
+    my $BB_PATH  = "/proj/[usrID]/[path]/mcu/build/[project]/[flavor]/custom/system";;
+    my %MAKEFILE_OPTIONS;
+    
+    &FileInfo::Parse_MAKEFILE($makeFile, \%MAKEFILE_OPTIONS); #Must run this subroutine first for other activities
+    my $nPhyRAMsize = 0;
+    $nPhyRAMsize = &sysInfo::GetphysicalRAMsize($BB_PATH, \%MAKEFILE_OPTIONS);
+    print "nPhyRAMsize = $phyRAMsize\n";
+    
+    <OUTPUT>
+
+    nPhyRAMsize = 8388608
+
+6. Get RAM regions
+
+    use systemInfo;
+    use FileInfoParser;
+
+    my $makeFile = "/proj/[usrID]/[path]/MT6280_R7R8_HSPA(FULL_VERSION).mak";
+    my $BB_PATH  = "/proj/[usrID]/[path]/mcu/build/[project]/[flavor]/custom/system";
+    my $file = "/proj/[usrID]/[path]/ldsMT6280_R7R8.txt";    
+    my %MAKEFILE_OPTIONS;
+    my %RAM_region;
+    my $nRAMnum = 0;
+
+    &FileInfo::Parse_MAKEFILE($makeFile, \%MAKEFILE_OPTIONS); #Must run this subroutine first for other activities
+    $nRAMnum =  &sysInfo::GetRAMregion($BB_PATH, $file, \%RAM_region, \%MAKEFILE_OPTIONS);
+
+    print "nRAMnum = $nRAMnum\n";
+    foreach my $strRAMname (keys %RAM_region)
+    {
+        print "RAMregion = $strRAMname\n";
+    }
+
+    <OUTPUT>
+    
+    nRAMnum = 15
+    RAMregion = ROM0
+    RAMregion = DYNAMIC_CACHEABLE_EXTSRAM_DEFAULT_NONCACHEABLE_RW
+    RAMregion = DYNAMIC_CACHEABLE_EXTSRAM_DEFAULT_NONCACHEABLE_ZI_MMIPOOL
+    RAMregion = ROMHEAD
+    RAMregion = DYNAMIC_CACHEABLE_EXTSRAM_DEFAULT_CACHEABLE_ZI_MMIPOOL
+    RAMregion = CACHED_EXTSRAM
+    RAMregion = EXTSRAM
+    RAMregion = CACHED_EXTSRAM_NVRAM_LTABLE
+    RAMregion = ROM
+    RAMregion = ROM1
+    RAMregion = EXTSRAM_DSP_TX
+    RAMregion = DYNAMIC_CACHEABLE_EXTSRAM_DEFAULT_CACHEABLE_ZI
+    RAMregion = DYNAMIC_CACHEABLE_EXTSRAM_DEFAULT_NONCACHEABLE_ZI
+    RAMregion = EXTSRAM_DSP_RX
+    RAMregion = DYNAMIC_CACHEABLE_EXTSRAM_DEFAULT_CACHEABLE_RW
+    
+    NOTE: This function can not be applied to 11B branch
+
+7. Get RAM boundary regions
+
+    my $makeFile = "/proj/[usrID]/[path]/MT6280_R7R8_HSPA(FULL_VERSION).mak";
+    my $file = "/proj/[usrID]/[path]/ldsMT6280_R7R8.txt";
+    my %MAKEFILE_OPTIONS;
+
+    &FileInfo::Parse_MAKEFILE($makeFile, \%MAKEFILE_OPTIONS); #Must run this subroutine first for other activities
+    my($LastRegionBeforeDUMMYEND, $DUMMY_END) =  &sysInfo::GetRAMBoundaryregion($file,\%MAKEFILE_OPTIONS);
+
+    print "Last Region Before DUMMY_END = $LastRegionBeforeDUMMYEND\nDUMMY_END = $DUMMY_END\n";
+    
+    <OUTPUT>
+    
+    Last Region Before DUMMY_END = DYNAMIC_CACHEABLE_EXTSRAM_DEFAULT_CACHEABLE_ZI
+    DUMMY_END = CACHED_DUMMY_END
+    
+    Note: This API can be used to get RAM margin
+          RAM margin = DUMMY_END_base - (LastRegionBeforeDUMMYEND_base + LastRegionBeforeDUMMYEND_size);
+    
+8. Get physical ROM size
+    
+    use systemInfo;
+    use FileInfoParser;
+
+    my $makeFile = "/proj/[usrID]/[path]/MT6280_R7R8_HSPA(FULL_VERSION).mak";
+    my $BB_PATH  = "/proj/[usrID]/[path]/mcu/build/[project]/[flavor]/custom/system";;
+    my %MAKEFILE_OPTIONS;
+    
+    &FileInfo::Parse_MAKEFILE($makeFile, \%MAKEFILE_OPTIONS); #Must run this subroutine first for other activities    
+    my $nPhyROMsize = 0;
+    $nPhyROMsize = &sysInfo::GetphysicalROMsize($BB_PATH, \%MAKEFILE_OPTIONS);
+    print "nPhyROMsize = $phyROMsize\n";
+
+    <OUTPUT>
+
+    nPhyROMsize = 268435456
+
+9. Get available ROM size
+
+    use systemInfo;
+    use FileInfoParser;
+
+    my $makeFile = "/proj/[usrID]/[path]/MT6280_R7R8_HSPA(FULL_VERSION).mak";
+    my $BB_PATH  = "/proj/[usrID]/[path]/mcu/build/[project]/[flavor]/custom/system";;
+    my %MAKEFILE_OPTIONS;
+    
+    &FileInfo::Parse_MAKEFILE($makeFile, \%MAKEFILE_OPTIONS); #Must run this subroutine first for other activities
+    my $nPhyROMsize = 0;
+    $nPhyROMsize = &sysInfo::GetphysicalROMsize($BB_PATH, \%MAKEFILE_OPTIONS);
+    print "nPhyRAMsize = $phyRAMsize\n";
+    
+    <OUTPUT>
+
+    nPhyROMsize = 0
+
+10. Get ROM regions
+
+    use systemInfo;
+    use FileInfoParser;
+
+    my $makeFile = "/proj/[usrID]/[path]/MT6280_R7R8_HSPA(FULL_VERSION).mak";
+    my $BB_PATH  = "/proj/[usrID]/[path]/mcu/build/[project]/[flavor]/custom/system";
+    my $file = "/proj/[usrID]/[path]/ldsMT6280_R7R8.txt";
+    my %MAKEFILE_OPTIONS;
+    my %ROM_region;
+    my $nROMnum = 0;
+
+    &FileInfo::Parse_MAKEFILE($makeFile, \%MAKEFILE_OPTIONS); #Must run this subroutine first for other activities
+    $nROMnum =  &sysInfo::GetROMregion($BB_PATH, $file, \%ROM_region, \%MAKEFILE_OPTIONS);
+
+    print "nROMnum = $nROMnum\n";
+    foreach my $strROMname (keys %ROM_region)
+    {
+        print "ROMregion = $strROMname\n";
+    }
+
+    <OUTPUT>
+    
+    nROMnum = 0
+    
+    NOTE: This function can not be applied to 11B branch.
+          for MOLY, all regions will be moved to RAM.
+
+=cut
+
+