[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/tools/CMMAutoGen.pl b/mcu/tools/CMMAutoGen.pl
new file mode 100644
index 0000000..c5bba24
--- /dev/null
+++ b/mcu/tools/CMMAutoGen.pl
@@ -0,0 +1,539 @@
+#!/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:
+#* ---------
+#* CMMAutoGen.pl
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#* This script generates the CMM files for debugging
+#*
+#* Author:
+#* -------
+#* Qmei Yang (mtk03726)
+#*
+#****************************************************************************/
+
+#****************************************************************************
+# Included Modules
+#****************************************************************************
+use strict;
+BEGIN { push @INC , './tools/' } # add additional library path
+use sysGenUtility; #pm file name without case sensitivity
+use FileInfoParser;
+use LISInfo;
+use File::Copy;
+use File::Path;
+use File::Copy::Recursive qw(fcopy rcopy dircopy fmove rmove dirmove);
+use File::Basename;
+use CommonUtility;
+#****************************************************************************
+# Constants
+#****************************************************************************
+my $CMMGEN_VERNO = " UMOLYA_u1.04";
+ # u1.04 , support to copy coretracer osa
+ # u1.03 , support coretracer path
+ # u1.02 , Modify bbreg path
+ # u1.01 , Support for core spesific regions
+ # u1.00 , initial version for mips support
+my $CMMGEN_AUTHOR = "Qmei Yang";
+
+#****************************************************************************
+# Input Parameters and Global Variables
+#****************************************************************************
+my $ACTION = $ARGV[0]; # 0: MAUI nocode.cmm; 1: HQ_Only.cmm;
+my $CMMFILE = $ARGV[1];
+my $ELFFILE = $ARGV[2];
+my $MAKEFILE = $ARGV[3];
+my $MAUI_BIN = $ARGV[4];
+my $LISFILE = $ARGV[5]; #PCORE
+my $L1CORE_LISFILE = $ARGV[6];
+my $CC_CMD = $ARGV[7];
+my $VIA_CMD = $ARGV[8];
+my $OPTION_TMP = $ARGV[9];
+my $TMP_FOLDER = $ARGV[10];
+my $INFOMAKE_PATH = $ARGV[11];
+my $TMPFILE_PATH = $ARGV[12];
+my $MD_GENERATION = $ARGV[13];
+
+
+my $DebugPrint = 0;
+my $CMMDIR = dirname($CMMFILE);
+my $BUILDDIR = dirname($ELFFILE);
+my $g_strCOMPILER = undef;
+my $g_strDSPBinName = "";
+print "ACTION: $ACTION,\nCMMFILE: $CMMFILE,\nCMMDIR: $CMMDIR,\n
+ELFFILE: $ELFFILE, \nMAKEFILE: $MAKEFILE,\n
+MAUI_BIN: $MAUI_BIN, \nLISFILE: $LISFILE, \n
+L1CORE_LISFILE: $L1CORE_LISFILE\n
+CC_CMD: $CC_CMD, \nVIA_CMD: $VIA_CMD, \nOPTION_TMP: $OPTION_TMP\n
+TMP_FOLDER: $TMP_FOLDER\nINFOMAKE_PATH: $INFOMAKE_PATH\n
+TMPFILE_PATH: $TMPFILE_PATH\n";
+
+#****************************************************************************
+# 1 >>> Parse makefile
+#****************************************************************************
+my %MAKEFILE_OPTIONS;
+my %CmplOption;
+my %RelOption;
+FileInfo::PreProcess($MAKEFILE, \%MAKEFILE_OPTIONS, $INFOMAKE_PATH, \%CmplOption, \%RelOption, 1);
+my $PLATFORM = &FileInfo::GetChip();
+$PLATFORM = &sysUtil::SwitchToClonedChip($PLATFORM);
+$PLATFORM =~ s/\_COPRO// if($PLATFORM =~ /\_COPRO/); # temporarily workaround
+$g_strCOMPILER = &FileInfo::GetCompiler();
+
+
+#****************************************************************************
+# 2 >>> Parse reg_base.h
+#****************************************************************************
+my $REG_BASE_TMP_AFTER_TRANSFORM = "$TMP_FOLDER/~reg_base_after_transform.h";
+my $REG_BASE_TMP_AFTER_PRECOMPILE = "$TMP_FOLDER/~reg_base_after_precompile.h";
+my $REG_BASE_H = "./interface/driver/regbase/".$MD_GENERATION."/";
+my %REG_BASE_DEFS;
+
+### Determine reg_base.h by platform
+my $platform_lc = lc($PLATFORM);
+my $reg_base_h_file = "reg_base_" . $platform_lc . "\.h";
+if (-e $REG_BASE_H.$reg_base_h_file) {
+ $REG_BASE_H .= $reg_base_h_file;
+} else {
+ my $platform_uc = uc($PLATFORM);
+ $reg_base_h_file = "reg_base_" . $platform_uc . "\.h";
+ $REG_BASE_H .= $reg_base_h_file;
+}
+
+if (!(-e $REG_BASE_H)) {
+ my $platform_uc = uc($PLATFORM);
+ $REG_BASE_H = "./interface/driver/regbase/".$MD_GENERATION."/";
+ $REG_BASE_H .= "reg_base_" . $platform_uc . "_FPGA\.h";
+}
+copy ($REG_BASE_H, "$TMP_FOLDER/$reg_base_h_file") if -e $REG_BASE_H or die "Missing $REG_BASE_H\n";
+
+### Change reg_base definitions to data structure for pre-compile
+®_base_define_to_struct($TMP_FOLDER, $reg_base_h_file, $REG_BASE_TMP_AFTER_TRANSFORM);
+
+### Pre-compile reg_base.h to get the correct register base addresses
+my $status = system("$CC_CMD $VIA_CMD $OPTION_TMP -E $REG_BASE_TMP_AFTER_TRANSFORM > $REG_BASE_TMP_AFTER_PRECOMPILE") if($g_strCOMPILER eq "RVCT");
+my $status = system("$CC_CMD $VIA_CMD$OPTION_TMP -E $REG_BASE_TMP_AFTER_TRANSFORM > $REG_BASE_TMP_AFTER_PRECOMPILE") if($g_strCOMPILER eq "GCC");
+&error_handler("tools/CMMAutoGen.pl: pre-compile $REG_BASE_TMP_AFTER_TRANSFORM error!", __FILE__, __LINE__) if ($status != 0);
+
+### Parse pre-compiled results and get the correct base address for each address
+&parse_reg_base($REG_BASE_TMP_AFTER_PRECOMPILE, \%REG_BASE_DEFS);
+if ($DebugPrint == 1)
+{
+ foreach (keys %REG_BASE_DEFS)
+ {
+ my $key = $_;
+ my $value = $REG_BASE_DEFS{$_};
+ print "#define $key $value\n";
+ }
+}
+#****************************************************************************
+# 2.5 >>> Parse dsp bin path
+#****************************************************************************
+if(-f $TMPFILE_PATH)
+{
+ my %TMP;
+ my $strTMPFILE = CommonUtil::GetFileContent($TMPFILE_PATH);
+ CommonUtil::HashStringParser($strTMPFILE, \%TMP);
+ $g_strDSPBinName = basename($TMP{DSPMOLY_BIN});
+}
+#****************************************************************************
+# 3 >>> Generate utility cmm files
+#****************************************************************************
+if ($ACTION == 0)
+{
+ ### Parse LIS file first (do not parse LIS file outside to prevent unnecessary errors when LIS does not exist)
+ &LISInfo::Parse($LISFILE);
+
+ ### Generate BuildInfo.cmm
+ {
+ my $BuildInfoCMM = "$CMMDIR/BuildInfo.cmm";
+ my $TemplateFolder = "./tools/DebuggingSuite/Misc/";
+ my $template = &CommonUtil::GetFileContent($TemplateFolder."BuildInfoTemplate.cmm");
+ $template = &Gen_Info_CMMContent($PLATFORM, $template, $ELFFILE, $MAUI_BIN, "../../../../");
+ my $bbreg = &Gen_bb_reg_content(\%REG_BASE_DEFS);
+ $template =~ s/\[CMMAUTOGEN_BBREG\]/$bbreg/g;
+ open (OUTPUT_FILE, ">$BuildInfoCMM") or &error_handler("Unable to open $BuildInfoCMM!\n", __FILE__, __LINE__);
+ print OUTPUT_FILE $template;
+ close OUTPUT_FILE;
+ print "Generate $BuildInfoCMM from ./tools/DebuggingSuite/Misc/BuildInfoTemplate.cmm\n";
+ }
+}
+#****************************************************************************
+# 3.1 >>> Generate load_elf.py
+#****************************************************************************
+if ($ACTION == 0)
+{
+ ### Generate load_elf.py
+ {
+ my $LOAD_ELF_PY = "$CMMDIR/codescape_simulator_load_elf.py";
+ my $TemplateFolder = "./tools/DebuggingSuite/Misc/";
+ my $ELF_PATH_TEMPLATE = $TemplateFolder."codescape_simulator_load_elf_template.py";
+ if( -e $ELF_PATH_TEMPLATE)
+ {
+ my $template = &CommonUtil::GetFileContent($ELF_PATH_TEMPLATE);
+ $template =~ s/\[CMMAUTOGEN_ELFPath\]/$ELFFILE/g;
+ open (OUTPUT_FILE, ">$LOAD_ELF_PY") or &error_handler("Unable to open $LOAD_ELF_PY!\n", __FILE__, __LINE__);
+ print OUTPUT_FILE $template;
+ close OUTPUT_FILE;
+ print "Generate $LOAD_ELF_PY from ./tools/DebuggingSuite/Misc/codescape_simulator_load_elf_template.py\n";
+ }
+ }
+}
+
+#****************************************************************************
+# 4 >>> Generate OnTargetMemoryDump.cmm
+#****************************************************************************
+if ($ACTION == 1)
+{
+ ### Parse LIS file first (do not parse LIS file outside to prevent unnecessary errors when LIS does not exist)
+ &LISInfo::Parse($LISFILE);
+
+ # [note]must be running gen_dump_address_size_template()
+ # after generating hqonly.cmm for ClassifyRegionType()
+ ### Generate OnTargetMemoryDump.cmm
+ {
+ my $DumpCMM = "$CMMDIR/OnTargetMemoryDump.cmm";
+ if(-e $DumpCMM)
+ {
+ my @dump_regions = (["CMMAUTOGEN_DUMP_UC_COMMON_REGIONS",MemType::CommonUnCached],
+ ["CMMAUTOGEN_DUMP_UC_CORE_REGIONS",MemType::CoreUnCached],
+ ["CMMAUTOGEN_DUMP_C_COMMON_REGIONS",MemType::CommonCached],
+ ["CMMAUTOGEN_DUMP_CORE0_C_REGIONS",MemType::Core0Cached],
+ ["CMMAUTOGEN_DUMP_CORE1_C_REGIONS",MemType::Core1Cached],
+ ["CMMAUTOGEN_DUMP_CORE2_C_REGIONS",MemType::Core2Cached],
+ ["CMMAUTOGEN_DUMP_CORE3_C_REGIONS",MemType::Core3Cached]);
+ my $template = &CommonUtil::GetFileContent($DumpCMM);
+ foreach my $dump (@dump_regions)
+ {
+ my $regions = &gen_dump_address_size_template($$dump[1]);
+ $template =~ s/\[$$dump[0]\]/$regions/g;
+ }
+ open (OUTPUT_FILE, ">$DumpCMM") or &error_handler("Unable to open $DumpCMM!\n", __FILE__, __LINE__);
+ print OUTPUT_FILE $template;
+ close OUTPUT_FILE;
+ print "Generate $DumpCMM\n";
+ }
+ }
+}
+#****************************************************************************
+# 5 >>> Replace coretracer config path
+#****************************************************************************
+if ($ACTION == 0)
+{
+ my $elf_path_from_ct_view = "../../".$ELFFILE;
+ my $ct_config_folder = $CMMDIR."/coretracer/config";
+ if (-e $ct_config_folder)
+ {
+ opendir( my $DIR, $ct_config_folder) || &error_handler("Can't open $ct_config_folder!", __FILE__, __LINE__);
+ my @ConfigFile = grep { /\.launch/ && -f "$ct_config_folder/$_" } readdir( $DIR );
+ closedir $DIR;
+ print "Replace coretracer config path:\n";
+ foreach my $launchfile (@ConfigFile)
+ {
+ my $launchpath = $ct_config_folder."/".$launchfile;
+ my $template = &CommonUtil::GetFileContent($launchpath);
+ chmod 0755, $launchpath;
+ $template = &Gen_Info_CMMContent($PLATFORM, $template, $elf_path_from_ct_view, $MAUI_BIN, "../../../../../../");
+ open (OUTPUT_FILE, ">$launchpath") or &error_handler("Unable to open $launchpath!\n", __FILE__, __LINE__);
+ print OUTPUT_FILE $template;
+ close OUTPUT_FILE;
+ print "replace elfpath in ".$launchfile."\n";
+ }
+ }
+}
+#****************************************************************************
+# 5 >>> Copy OSA for coretracer
+#****************************************************************************
+if ($ACTION == 0)
+{
+ my $dest_ct_osa_folder = $CMMDIR."/coretracer";
+ my $org_ct_osa_folder = "./tools/DebuggingSuite/Misc/coretracer";
+ if (-e $org_ct_osa_folder)
+ {
+ if(!-e $dest_ct_osa_folder)
+ {
+ mkpath($dest_ct_osa_folder);
+ }
+ dircopy($org_ct_osa_folder, $dest_ct_osa_folder);
+ }
+}
+
+exit;
+
+sub gen_dump_address_size_template
+{
+ my ($memtype) = @_;
+ my $bb = $PLATFORM;
+ my $template;
+ print "------------On Target Dump Region Info--------------\n";
+ my $DumpRegion_aref = LISInfo::GetCMMDumpRegionInfo($bb,$memtype);
+ foreach my $item (@$DumpRegion_aref)
+ {
+ my $strBase = $item->[1];
+ my $strEnd;
+ if (hex($item->[2]) != 0) {
+ $strEnd = CommonUtil::Dec2Hex(hex($item->[1])+hex($item->[2])-0x1);
+ } else {
+ $strEnd = CommonUtil::Dec2Hex(hex($item->[1])+hex($item->[2]));
+ }
+ print $item->[0].":".$item->[1].",".$item->[2].", $strEnd\n";
+ $template .= "print \"Dumping [$item->[0]]sys_mem_$strBase.bin\"\n";
+ #$template .= "DATA.SAVE.BINARY \"\&store_folder\\sys_mem_$strBase.bin\" $strBase--$strEnd\n";
+ $template .= "DATA.SAVE.BINARY \&store_folder\\sys_mem_$strBase.bin $strBase--$strEnd\n"; #coretracer unsupported now
+ }
+ print "----------------------------------------------\n";
+
+ return $template;
+}
+
+
+#****************************************************************************
+# subroutine: reg_base_define_to_struct
+# input: $strInputFileFolder : folder of input reg_base.h
+# $strInputFile: reg_base.h
+# $strOutputFilePath: path of output file for definitions of reg_base
+#****************************************************************************
+sub reg_base_define_to_struct
+{
+ my ($strInputFileFolder, $strInputFile, $strOutputFilePath) = @_;
+
+ open (INPUT_FILE, "<$strInputFileFolder/$strInputFile") or &error_handler("$strInputFileFolder/$strInputFile: Unable to open $strInputFile!\n", __FILE__, __LINE__);
+ open (OUTPUT_FILE, ">$strOutputFilePath") or &error_handler("$strOutputFilePath: Unable to open $strOutputFilePath!\n", __FILE__, __LINE__);
+
+ print OUTPUT_FILE "\#include \"$strInputFile\"\n\n";
+ print OUTPUT_FILE "typedef struct dummy_reg\n{\n";
+ while (<INPUT_FILE>)
+ {
+ my ($reg);
+
+ if (/^#define\s+(\w+)\s+\(*\w+\)*/)
+ {
+ $reg = $1;
+ print OUTPUT_FILE "\tint $reg\_decl = $reg;\n";
+ }
+ }
+ print OUTPUT_FILE "}\n";
+
+ close INPUT_FILE;
+ close OUTPUT_FILE;
+
+ return;
+}
+
+#****************************************************************************
+# subroutine: parse_reg_base
+# input: $strInputFilePath: pre-compiled reg_base.h
+# $hrefRegBase: hash reference to reg_base
+#****************************************************************************
+sub parse_reg_base
+{
+ my ($strInputFilePath, $hrefRegBase) = @_;
+
+ open (INPUT_FILE, "<$strInputFilePath") or &error_handler("$strInputFilePath: Unable to open $strInputFilePath!\n", __FILE__, __LINE__);
+
+ while (<INPUT_FILE>)
+ {
+ if (/\s*int\s+(\w+)\_decl\s+\=\s+\((.*)\);/)
+ {
+ my $reg = uc($1);
+ my $nDecl = eval($2);
+ $hrefRegBase->{$reg} = CommonUtil::Dec2Hex($nDecl);
+ }
+ }
+
+ close INPUT_FILE;
+
+ return;
+}
+
+#****************************************************************************
+# subroutine: get_cpu_type
+# input: $bb: platform
+# output: CPU type string
+#****************************************************************************
+sub get_cpu_type
+{
+ my ($bb) = @_;
+
+ ### Determine CPU type
+ my $strCPUType;
+ if (&sysUtil::is_arm7($bb))
+ {
+ $strCPUType = "ARM7EJS";
+ }
+ elsif (&sysUtil::is_arm9($bb))
+ {
+ $strCPUType = "ARM926EJ";
+ }
+ elsif (&sysUtil::is_arm11($bb))
+ {
+ $strCPUType = "ARM1176JZ";
+ }
+ elsif (&sysUtil::is_CR4($bb))
+ {
+ $strCPUType = "CortexR4";
+ }
+ else
+ {
+ &error_handler("$MAKEFILE: Unsupported platform $bb!\n", __FILE__, __LINE__);
+ }
+
+ return $strCPUType;
+}
+
+sub FindBBRelatedFile
+{
+ my ($Folder, $bb, $FileExtension) = @_;
+ opendir( my $DIR, $Folder) || &sysUtil::sysgen_die("Can't open $Folder!", __FILE__, __LINE__);
+ my @Files = grep { /$bb/i and /$FileExtension/i} readdir( $DIR );
+ closedir $DIR;
+ return \@Files;
+}
+
+sub Gen_Info_CMMContent #called by gen_info_cmm_from_template
+{
+ my ($org_bb, $template, $strELFPath, $strBinName, $root) = @_;
+ my $strBinPath = dirname($strELFPath)."/".$strBinName;
+
+ $template =~ s/\[CMMAUTOGEN_ELFPath\]/$strELFPath/g;
+ $template =~ s/\[CMMAUTOGEN_BINPath\]/$strBinPath/g;
+ my $cmmgen_verno = &template_verno();
+ $template =~ s/\[CMMAUTOGEN_VERNO\]/$cmmgen_verno/g;
+ $template =~ s/\[CMMAUTOGEN_ROOT\]/$root/g;
+
+ return $template;
+}
+
+sub Gen_bb_reg_content
+{
+ my ($reg_base_href) = @_;
+ my $template;
+ foreach my $key (keys %$reg_base_href)
+ {
+ my $value = $reg_base_href->{$key};
+ $template .= "GLOBAL &$key\n&$key=($value)\n";
+ }
+ return $template;
+}
+
+
+
+
+#****************************************************************************
+# subroutine: template_copyright_file_header
+# (this template will be used by MAUI nocode.cmm, BL nocode.cmm, EXT_BL nocode.cmm, and FOTA nocode.cmm)
+# output: template of copyright file header
+#****************************************************************************
+sub template_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) 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).
+
+__TEMPLATE
+
+ return $template;
+}
+
+#****************************************************************************
+# subroutine: template_verno
+# (this template will be used by MAUI nocode.cmm, BL nocode.cmm, EXT_BL nocode.cmm, and FOTA nocode.cmm)
+# output: template of verno and author information
+#****************************************************************************
+sub template_verno
+{
+ my $template = <<"__TEMPLATE";
+; CMMAutoGen$CMMGEN_VERNO by $CMMGEN_AUTHOR
+
+__TEMPLATE
+
+ return $template;
+}
+
+
+
+
+
+
+
+#****************************************************************************
+# subroutine: error_handler
+# input: $error_msg: error message
+#****************************************************************************
+sub error_handler
+{
+ my ($strErrorMsg, $strFile, $strLine) = @_;
+
+ my $strFinalErrorMsg = "CMMGEN ERROR: $strErrorMsg at $strFile line $strLine\n";
+ print $strFinalErrorMsg;
+ die $strFinalErrorMsg;
+}