[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/SLT/MT6290_LTE_PCB01_MT6290_S00.MOLY_W13_34.bin b/mcu/tools/SLT/MT6290_LTE_PCB01_MT6290_S00.MOLY_W13_34.bin
new file mode 100644
index 0000000..9f100e2
--- /dev/null
+++ b/mcu/tools/SLT/MT6290_LTE_PCB01_MT6290_S00.MOLY_W13_34.bin
Binary files differ
diff --git a/mcu/tools/SLT/config_6290 b/mcu/tools/SLT/config_6290
new file mode 100644
index 0000000..ed456c1
--- /dev/null
+++ b/mcu/tools/SLT/config_6290
@@ -0,0 +1,52 @@
+#
+# Compile Option Define
+#
+MOLY_ATEST_LIB_PATH=/project/moly_usr/MOLY.W13.44.LTE.p2
+PROJECT_LOADER=MT6290E2_EVB(LFWG).mak
+PROJECT_ATEST=MT6290E2_EVB(LFWG).mak
+PROJECT_SDIO=MT6290E2_EVB(LFWG).mak
+PROJECT_FDD=MT6290E2_EVB(LFWG).mak
+PROJECT_TDD=MT6290E2_EVB(LWG).mak
+NANDFLASH=S34ML02G1
+#NANDFLASH=MT29F2G08ABBEA
+
+#
+# Define 6290 SLT Test Load Location
+# ex.SLT_xxx_LOAD=$BINPATH/MT6290E2_EVB_PCB01_MT6290_S01.*.bin
+#
+SLT_HVT_MD_LOAD=slt_6290_md.elf.bin.6290_md
+SLT_HVT_AP_LOAD=slt_6290_ap.elf.bin.6290_ap
+SLT_ATEST_LOAD=../BinFile/MT6290E2_ATEST/MT6290E2_EVB_PCB01_MT6290_S01.MOLY_*.bin
+SLT_SDIO_LOAD=../BinFile/MT6290E2_SDIO/MT6290E2_EVB_PCB01_MT6290_S01.MOLY_*.bin
+SLT_MSDC1_LOAD=msdc.elf.bin.6290_ap
+SLT_FDD_LOAD=../BinFile/MT6290E2_FDD/MT6290E2_EVB_PCB01_MT6290_S01.MOLY_*.bin
+SLT_TDD_LOAD=../BinFile/MT6290E2_FDD/MT6290E2_EVB_PCB01_MT6290_S01.MOLY_*.bin
+SLT_CFG_FILE=../BinFile/MT6290E2_FDD/MT6290E2_EVB.cfg
+SLT_BL_FILE=$BINPATH/MT6290E2_EVB_BOOTLOADER_V005_MT6290_MOLY_*.bin
+
+#
+# Config Test Load Attribute
+# ex.LOAD=filename[,MD/AP][,HVT/MOLY]
+#
+SLT_TEST_LOAD_0=SLT_HVT_MD_LOAD,MD,HVT
+SLT_TEST_LOAD_1=SLT_HVT_AP_LOAD,AP,HVT
+SLT_TEST_LOAD_2=SLT_ATEST_LOAD,MD,MOLY
+SLT_TEST_LOAD_3=
+SLT_TEST_LOAD_4=
+SLT_TEST_LOAD_5=
+SLT_TEST_LOAD_6=SLT_TDD_LOAD,MD,MOLY
+PRIMARY_MAUI=SLT_FDD_LOAD,MD,MOLY
+
+#
+# Set Test Load Sequence
+# ex.SLT_SQ_ADD=MdRstCnt,ApRstCnt,MdLoad,ApLoad,ApMcuType,ErrIdx
+#    MdLoad / ApLoad = [SLT_TEST_LOAD_0 ~ SLT_TEST_LOAD_6, PRIMARY_MAUI]
+#    ApMcuType = [SLT_APMCU_LOAD / SLT_APMCU_KEEP / SLT_APMCU_PDN]
+#    ErrIdx = [0~2] // Report error index to PC
+#
+SLT_SQ_ADD=0,0,SLT_TEST_LOAD_0,SLT_TEST_LOAD_1,SLT_APMCU_LOAD,0
+SLT_SQ_ADD=1,0,SLT_TEST_LOAD_0,SLT_TEST_LOAD_1,SLT_APMCU_KEEP,0
+SLT_SQ_ADD=0,1,SLT_TEST_LOAD_0,SLT_TEST_LOAD_1,SLT_APMCU_LOAD,0
+SLT_SQ_ADD=1,1,SLT_TEST_LOAD_2,NULL,SLT_APMCU_PDN,0
+SLT_SQ_ADD=2,1,NULL,NULL,SLT_APMCU_PDN,0
+
diff --git a/mcu/tools/SLT/config_6290m b/mcu/tools/SLT/config_6290m
new file mode 100644
index 0000000..a0c91be
--- /dev/null
+++ b/mcu/tools/SLT/config_6290m
@@ -0,0 +1,51 @@
+#
+# Compile Option Define
+#
+MOLY_ATEST_LIB_PATH=/project/moly_usr/MOLY.W13.44.LTE.p2
+PROJECT_LOADER=MT6290ME2_EVB(LFWG).mak
+PROJECT_ATEST=MT6290ME2_EVB(LFWG).mak
+PROJECT_SDIO=MT6290ME2_EVB(LFWG).mak
+PROJECT_FDD=MT6290ME2_EVB(LFWG).mak
+PROJECT_TDD=MT6290ME2_EVB(LWG).mak
+NANDFLASH=S34ML02G1
+
+#
+# Define 6290m SLT Test Load Location
+# ex.SLT_xxx_LOAD=$BINPATH/MT6290E2_EVB_PCB01_MT6290_S01.*.bin
+#
+SLT_HVT_MD_LOAD=slt_6290m_md.elf.bin.6290m_md
+SLT_HVT_AP_LOAD=slt_6290m_ap.elf.bin.6290m_ap
+SLT_ATEST_LOAD=../BinFile/MT6290ME2_ATEST/MT6290ME2_EVB_PCB01_MT6290_S01.MOLY_*.bin
+SLT_SDIO_LOAD=../BinFile/MT6290ME2_SDIO/MT6290ME2_EVB_PCB01_MT6290_S01.MOLY_*.bin
+SLT_FDD_LOAD=../BinFile/MT6290ME2_FDD/MT6290ME2_EVB_PCB01_MT6290_S01.MOLY_*.bin
+SLT_TDD_LOAD=../BinFile/MT6290ME2_TDD/MT6290ME2_EVB_PCB01_MT6290_S01.MOLY_*.bin
+SLT_CFG_FILE=../BinFile/MT6290ME2_ATEST/MT6290ME2_EVB.cfg
+SLT_BL_FILE=$BINPATH/MT6290ME2_EVB_BOOTLOADER_V005_MT6290_MOLY_*.bin
+
+#
+# Config Test Load Attribute
+# ex.LOAD=filename[,MD/AP][,HVT/MOLY]
+#
+SLT_TEST_LOAD_0=SLT_HVT_MD_LOAD,MD,HVT
+SLT_TEST_LOAD_1=SLT_HVT_AP_LOAD,AP,HVT
+SLT_TEST_LOAD_2=SLT_ATEST_LOAD,MD,MOLY
+SLT_TEST_LOAD_3=SLT_SDIO_LOAD,MD,MOLY
+SLT_TEST_LOAD_4=
+SLT_TEST_LOAD_5=
+SLT_TEST_LOAD_6=SLT_FDD_LOAD,MD,MOLY
+PRIMARY_MAUI=SLT_TDD_LOAD,MD,MOLY
+
+#
+# Set Test Load Sequence
+# ex.SLT_SQ_ADD=MdRstCnt,ApRstCnt,MdLoad,ApLoad,ApMcuType,ErrIdx
+#    MdLoad / ApLoad = [SLT_TEST_LOAD_0 ~ SLT_TEST_LOAD_6, PRIMARY_MAUI]
+#    ApMcuType = [SLT_APMCU_LOAD / SLT_APMCU_KEEP / SLT_APMCU_PDN]
+#    ErrIdx = [0~2] // Report error index to PC
+#
+SLT_SQ_ADD=0,0,SLT_TEST_LOAD_0,SLT_TEST_LOAD_1,SLT_APMCU_LOAD,0
+SLT_SQ_ADD=1,0,SLT_TEST_LOAD_0,SLT_TEST_LOAD_1,SLT_APMCU_KEEP,0
+SLT_SQ_ADD=0,1,SLT_TEST_LOAD_0,SLT_TEST_LOAD_1,SLT_APMCU_LOAD,0
+SLT_SQ_ADD=1,1,SLT_TEST_LOAD_2,NULL,SLT_APMCU_PDN,0
+SLT_SQ_ADD=2,1,PRIMARY_MAUI,NULL,SLT_APMCU_PDN,1
+SLT_SQ_ADD=3,1,NULL,NULL,SLT_APMCU_PDN,0
+SLT_CHECK_EFUSE=CHIP_TYPE_P
diff --git a/mcu/tools/SLT/config_6290m_c b/mcu/tools/SLT/config_6290m_c
new file mode 100755
index 0000000..412de42
--- /dev/null
+++ b/mcu/tools/SLT/config_6290m_c
@@ -0,0 +1,51 @@
+#
+# Compile Option Define
+#
+MOLY_ATEST_LIB_PATH=/project/moly_usr/MOLY.W13.44.LTE.p2
+PROJECT_LOADER=MT6290ME2_EVB(LFWG).mak
+PROJECT_ATEST=MT6290ME2_EVB(LFWG).mak
+PROJECT_SDIO=MT6290ME2_EVB(LFWG).mak
+PROJECT_FDD=MT6290ME2_EVB(LFWG).mak
+PROJECT_TDD=MT6290ME2_EVB(LWG).mak
+NANDFLASH=S34ML02G1
+
+#
+# Define 6290m SLT Test Load Location
+# ex.SLT_xxx_LOAD=$BINPATH/MT6290E2_EVB_PCB01_MT6290_S01.*.bin
+#
+SLT_HVT_MD_LOAD=slt_6290m_md.elf.bin.6290m_md
+SLT_HVT_AP_LOAD=slt_6290m_ap.elf.bin.6290m_ap
+SLT_ATEST_LOAD=../BinFile/MT6290ME2_ATEST/MT6290ME2_EVB_PCB01_MT6290_S01.MOLY_*.bin
+SLT_SDIO_LOAD=../BinFile/MT6290ME2_SDIO/MT6290ME2_EVB_PCB01_MT6290_S01.MOLY_*.bin
+SLT_FDD_LOAD=../BinFile/MT6290ME2_FDD/MT6290ME2_EVB_PCB01_MT6290_S01.MOLY_*.bin
+SLT_TDD_LOAD=../BinFile/MT6290ME2_TDD/MT6290ME2_EVB_PCB01_MT6290_S01.MOLY_*.bin
+SLT_CFG_FILE=../BinFile/MT6290ME2_ATEST/MT6290ME2_EVB.cfg
+SLT_BL_FILE=$BINPATH/MT6290ME2_EVB_BOOTLOADER_V005_MT6290_MOLY_*.bin
+
+#
+# Config Test Load Attribute
+# ex.LOAD=filename[,MD/AP][,HVT/MOLY]
+#
+SLT_TEST_LOAD_0=SLT_HVT_MD_LOAD,MD,HVT
+SLT_TEST_LOAD_1=SLT_HVT_AP_LOAD,AP,HVT
+SLT_TEST_LOAD_2=SLT_ATEST_LOAD,MD,MOLY
+SLT_TEST_LOAD_3=SLT_SDIO_LOAD,MD,MOLY
+SLT_TEST_LOAD_4=
+SLT_TEST_LOAD_5=
+SLT_TEST_LOAD_6=
+PRIMARY_MAUI=SLT_TDD_LOAD,MD,MOLY
+
+#
+# Set Test Load Sequence
+# ex.SLT_SQ_ADD=MdRstCnt,ApRstCnt,MdLoad,ApLoad,ApMcuType,ErrIdx
+#    MdLoad / ApLoad = [SLT_TEST_LOAD_0 ~ SLT_TEST_LOAD_6, PRIMARY_MAUI]
+#    ApMcuType = [SLT_APMCU_LOAD / SLT_APMCU_KEEP / SLT_APMCU_PDN]
+#    ErrIdx = [0~2] // Report error index to PC
+#
+SLT_SQ_ADD=0,0,SLT_TEST_LOAD_0,SLT_TEST_LOAD_1,SLT_APMCU_LOAD,0
+SLT_SQ_ADD=1,0,SLT_TEST_LOAD_0,SLT_TEST_LOAD_1,SLT_APMCU_KEEP,0
+SLT_SQ_ADD=0,1,SLT_TEST_LOAD_0,SLT_TEST_LOAD_1,SLT_APMCU_LOAD,0
+SLT_SQ_ADD=1,1,SLT_TEST_LOAD_2,NULL,SLT_APMCU_PDN,0
+SLT_SQ_ADD=2,1,PRIMARY_MAUI,NULL,SLT_APMCU_PDN,1
+SLT_SQ_ADD=3,1,NULL,NULL,SLT_APMCU_PDN,0
+SLT_CHECK_EFUSE=CHIP_TYPE_C
diff --git a/mcu/tools/SLT/config_6290m_f b/mcu/tools/SLT/config_6290m_f
new file mode 100755
index 0000000..f7ba43e
--- /dev/null
+++ b/mcu/tools/SLT/config_6290m_f
@@ -0,0 +1,51 @@
+#
+# Compile Option Define
+#
+MOLY_ATEST_LIB_PATH=/project/moly_usr/MOLY.W13.44.LTE.p2
+PROJECT_LOADER=MT6290ME2_EVB(LFWG).mak
+PROJECT_ATEST=MT6290ME2_EVB(LFWG).mak
+PROJECT_SDIO=MT6290ME2_EVB(LFWG).mak
+PROJECT_FDD=MT6290ME2_EVB(LFWG).mak
+PROJECT_TDD=MT6290ME2_EVB(LWG).mak
+NANDFLASH=S34ML02G1
+
+#
+# Define 6290m SLT Test Load Location
+# ex.SLT_xxx_LOAD=$BINPATH/MT6290E2_EVB_PCB01_MT6290_S01.*.bin
+#
+SLT_HVT_MD_LOAD=slt_6290m_md.elf.bin.6290m_md
+SLT_HVT_AP_LOAD=slt_6290m_ap.elf.bin.6290m_ap
+SLT_ATEST_LOAD=../BinFile/MT6290ME2_ATEST/MT6290ME2_EVB_PCB01_MT6290_S01.MOLY_*.bin
+SLT_SDIO_LOAD=../BinFile/MT6290ME2_SDIO/MT6290ME2_EVB_PCB01_MT6290_S01.MOLY_*.bin
+SLT_FDD_LOAD=../BinFile/MT6290ME2_FDD/MT6290ME2_EVB_PCB01_MT6290_S01.MOLY_*.bin
+SLT_TDD_LOAD=../BinFile/MT6290ME2_TDD/MT6290ME2_EVB_PCB01_MT6290_S01.MOLY_*.bin
+SLT_CFG_FILE=../BinFile/MT6290ME2_ATEST/MT6290ME2_EVB.cfg
+SLT_BL_FILE=$BINPATH/MT6290ME2_EVB_BOOTLOADER_V005_MT6290_MOLY_*.bin
+
+#
+# Config Test Load Attribute
+# ex.LOAD=filename[,MD/AP][,HVT/MOLY]
+#
+SLT_TEST_LOAD_0=SLT_HVT_MD_LOAD,MD,HVT
+SLT_TEST_LOAD_1=SLT_HVT_AP_LOAD,AP,HVT
+SLT_TEST_LOAD_2=SLT_ATEST_LOAD,MD,MOLY
+SLT_TEST_LOAD_3=SLT_SDIO_LOAD,MD,MOLY
+SLT_TEST_LOAD_4=
+SLT_TEST_LOAD_5=
+SLT_TEST_LOAD_6=
+PRIMARY_MAUI=SLT_FDD_LOAD,MD,MOLY
+
+#
+# Set Test Load Sequence
+# ex.SLT_SQ_ADD=MdRstCnt,ApRstCnt,MdLoad,ApLoad,ApMcuType,ErrIdx
+#    MdLoad / ApLoad = [SLT_TEST_LOAD_0 ~ SLT_TEST_LOAD_6, PRIMARY_MAUI]
+#    ApMcuType = [SLT_APMCU_LOAD / SLT_APMCU_KEEP / SLT_APMCU_PDN]
+#    ErrIdx = [0~2] // Report error index to PC
+#
+SLT_SQ_ADD=0,0,SLT_TEST_LOAD_0,SLT_TEST_LOAD_1,SLT_APMCU_LOAD,0
+SLT_SQ_ADD=1,0,SLT_TEST_LOAD_0,SLT_TEST_LOAD_1,SLT_APMCU_KEEP,0
+SLT_SQ_ADD=0,1,SLT_TEST_LOAD_0,SLT_TEST_LOAD_1,SLT_APMCU_LOAD,0
+SLT_SQ_ADD=1,1,SLT_TEST_LOAD_2,NULL,SLT_APMCU_PDN,0
+SLT_SQ_ADD=2,1,PRIMARY_MAUI,NULL,SLT_APMCU_PDN,1
+SLT_SQ_ADD=3,1,NULL,NULL,SLT_APMCU_PDN,0
+SLT_CHECK_EFUSE=CHIP_TYPE_F
diff --git a/mcu/tools/SLT/fileinfo.conf b/mcu/tools/SLT/fileinfo.conf
new file mode 100644
index 0000000..401468d
--- /dev/null
+++ b/mcu/tools/SLT/fileinfo.conf
@@ -0,0 +1,24 @@
+FILE_VER:0x01

+  # Description:

+  #   File version

+  

+FILE_TYPE:SLT_TEST_LOAD_1
+  # Description:

+  #   Specify the file type of image

+  # Option Value:

+  #   LTE_DSP_ROM: The file type is LTE DSP ROM

+  

+FLASH_DEV:_NAND_FLASH_BOOTING_

+  # Description:

+  #   Choose the SPI or NAND flash for DSP image download

+  # Option Value:

+  #   __SERIAL_FLASH_EN__: Download DSP image into SPI flash

+  #   _NAND_FLASH_BOOTING_: Download DSP image into NAND flash

+

+LOAD_ADDR:0x10000000
+  

+MAX_SIZE:0xFFFFFFFF

+  # Description:

+  #   The reserved size in flash for DSP image, please keep this value

+  

+ATTRIBUTE:0x10000000
\ No newline at end of file
diff --git a/mcu/tools/SLT/modify_slt_gfh_file_info.pl b/mcu/tools/SLT/modify_slt_gfh_file_info.pl
new file mode 100644
index 0000000..99a919c
--- /dev/null
+++ b/mcu/tools/SLT/modify_slt_gfh_file_info.pl
@@ -0,0 +1,349 @@
+#!/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) 2013

+#

+#  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:

+#* ---------

+#*   prepend_gfh.pl

+#*

+#* Project:

+#* --------

+#*   MOLY

+#*

+#* Description:

+#* ------------

+#*   Add GFH header for the binary without GFH

+#*

+#* Author:

+#* -------

+#*   Chin-Chieh Hung (mtk03404)

+#*

+#****************************************************************************

+use strict;

+

+

+#****************************************************************************

+# Included Modules

+#****************************************************************************

+BEGIN { push @INC, "pcore/" , './pcore/tools/' }  # add additional library path

+use File::Basename;

+use File::Copy;

+#use CommonUtility;

+#use tools::pack_dep_gen;

+#PrintDependModule();

+

+#****************************************************************************

+# Constants

+#****************************************************************************

+my $PREPEND_GFH_VERNO = " m0.01";

+# v0.01 by mtk03404, initial version

+

+#Usage: modify_gfh_file_info.pl SRC_BINFILE_PATH(filename) DST_BINFILE_PATH(filename) file_info.conf

+

+#****************************************************************************

+# Global Variables

+#****************************************************************************

+my @GFH_Buffer;

+my $gfh_fileinfo_type = 1;

+my %GFH_FILE_TYPE;

+my %GFH_FLASH_DEV;

+my %GFH_SIG_TYPE;

+

+#****************************************************************************

+# GFH FileInfo Related Enum Definition

+#****************************************************************************

+$GFH_FILE_TYPE{ "SLT_TEST_LOAD_0" } = chr(0x00).chr(0x80); #Big Endian

+$GFH_FILE_TYPE{ "SLT_TEST_LOAD_1" } = chr(0x01).chr(0x80); #Big Endian

+$GFH_FILE_TYPE{ "SLT_TEST_LOAD_2" } = chr(0x02).chr(0x80); #Big Endian

+$GFH_FILE_TYPE{ "SLT_TEST_LOAD_3" } = chr(0x03).chr(0x80); #Big Endian

+$GFH_FILE_TYPE{ "SLT_TEST_LOAD_4" } = chr(0x04).chr(0x80); #Big Endian

+$GFH_FILE_TYPE{ "SLT_TEST_LOAD_5" } = chr(0x05).chr(0x80); #Big Endian

+$GFH_FILE_TYPE{ "SLT_TEST_LOAD_6" } = chr(0x06).chr(0x80); #Big Endian

+$GFH_FILE_TYPE{ "PRIMARY_MAUI" } = chr(0x00).chr(0x01); #Big Endian

+

+$GFH_FLASH_DEV{ "FLASH_DEV_NONE"     } = chr(0x00);

+$GFH_FLASH_DEV{ "F_NOR"              } = chr(0x01);

+$GFH_FLASH_DEV{ "F_NAND_SEQUENTIAL"  } = chr(0x02);

+$GFH_FLASH_DEV{ "F_NAND_TTBL"        } = chr(0x03);

+$GFH_FLASH_DEV{ "F_NAND_FDM50"       } = chr(0x04);

+$GFH_FLASH_DEV{ "F_EMMC_BOOT_REGION" } = chr(0x05);

+$GFH_FLASH_DEV{ "F_EMMC_DATA_REGION" } = chr(0x06);

+$GFH_FLASH_DEV{ "F_SF"               } = chr(0x07);

+$GFH_FLASH_DEV{ "F_XBOOT"            } = chr(0x08);

+$GFH_FLASH_DEV{ "FLASH_DEV_END"      } = chr(0xFF);

+

+$GFH_SIG_TYPE{ "SIG_NONE"             } = chr(0x00);

+$GFH_SIG_TYPE{ "SIG_PHASH"            } = chr(0x01);

+$GFH_SIG_TYPE{ "SIG_SINGLE"           } = chr(0x02);

+$GFH_SIG_TYPE{ "SIG_SINGLE_AND_PHASE" } = chr(0x03);

+$GFH_SIG_TYPE{ "SIG_MULTI"            } = chr(0x04);

+$GFH_SIG_TYPE{ "SIG_TYPE_NUM"         } = chr(0x05);

+$GFH_SIG_TYPE{ "SIG_TYPE_END"         } = chr(0xFF);

+

+#****************************************************************************

+# Input Parameters

+#****************************************************************************

+my ($src_bin_file)   = $ARGV[0];

+my ($dst_bin_file)   = $ARGV[1];

+my ($file_info_cfg)  = $ARGV[2];

+

+#****************************************************************************

+# Parameter Check

+#****************************************************************************

+die "source binary file $src_bin_file doesn't exist" if not -e $src_bin_file;

+die "config file $file_info_cfg doesn't exist" if not -e $file_info_cfg;

+

+

+#****************************************************************************

+# Functions

+#****************************************************************************

+if (!&IsGFH($src_bin_file))

+{

+    print "The $dst_bin_file has not GFH header, can not modify the GFH header for $dst_bin_file";

+    exit 0;

+}

+

+

+{

+    my $b;

+    my $sum;

+    my $src_bin_file_size;

+    my $nIndex = 0;

+    open (SRC_FILE_HANDLE, "<$src_bin_file")  or &error_handler("$src_bin_file: open file error!");

+    binmode(SRC_FILE_HANDLE);

+    for (0..0x37)

+    {

+        read(SRC_FILE_HANDLE, $b, 1);

+        $GFH_Buffer[$nIndex++] = $b;

+    }

+    while (read(SRC_FILE_HANDLE, $b, 1))

+    {

+        $sum .= $b;

+    }

+    close SRC_FILE_HANDLE;

+

+    open (FILE_HANDLE, ">$dst_bin_file") or &error_handler("$dst_bin_file: open file error!");

+    $src_bin_file_size = (-s $src_bin_file);

+    &GFH_FileInfo_Mod($file_info_cfg, $src_bin_file_size);

+    binmode(FILE_HANDLE);

+    print FILE_HANDLE @GFH_Buffer;

+    print FILE_HANDLE $sum;

+    close FILE_HANDLE;

+

+

+

+#copy($src_bin_file, $dst_bin_file) or die "$!";

+}

+

+# GFH_FILE_INFO_v1

+# [  3:  0] GFH_Header.m_magic_ver

+# [  5:  3] GFH_Header.m_size, = size of GFH_FILE_INFO_v1 structure

+# [  7:  6] GFH_Header.m_type, = GFH_FILE_INFO_v1

+# [ 19:  8] identifier, = GFH_FILE_INFO_ID = "FILE_INFO"

+# [ 23: 20] m_file_ver

+# [ 25: 24] m_file_type, = PRI_ROM, DSP_ROM, ...

+# [   : 26] m_flash_dev

+# [   : 27] m_sig_type

+# [ 31: 28] m_load_addr

+# [ 35: 32] m_file_len

+# [ 39: 36] m_max_size

+# [ 43: 40] m_content_offset

+# [ 47: 44] m_sig_len

+# [ 51: 48] m_jump_offset

+# [ 55: 52] m_attr

+sub GFH_FileInfo_Mod

+{

+    my ($config_file, $input_file_len) = @_;

+    my ($CONFIG_FILE_VER, $CONFIG_FILE_TYPE, $FLASH_DEV, $MAX_SIZE, $ATTR) = &GetFileInfoConfig($config_file);

+    my $nIndex;

+    

+#m_file_type

+    $nIndex = 0x18;

+    ($GFH_Buffer[$nIndex++], $GFH_Buffer[$nIndex++]) = $GFH_FILE_TYPE{ $CONFIG_FILE_TYPE };

+

+#m_max_siz

+    $nIndex = 0x24;

+    ($GFH_Buffer[$nIndex++], $GFH_Buffer[$nIndex++], $GFH_Buffer[$nIndex++], $GFH_Buffer[$nIndex++]) = &Dec2ASCIIString($MAX_SIZE);

+

+#m_attr, no XIP in MT6290, default value is 0

+    $nIndex = 0x34;

+    ($GFH_Buffer[$nIndex++], $GFH_Buffer[$nIndex++], $GFH_Buffer[$nIndex++], $GFH_Buffer[$nIndex++]) = &Dec2ASCIIString($ATTR);

+}

+

+#****************************************************************************

+# subroutine:  Get file config

+# input:       config file

+# output:      File Info config setting

+#****************************************************************************

+sub GetFileInfoConfig

+{

+    my $fileContent = &GetFileContent(@_);

+    my $parse_file_ver;

+    my $parse_file_ver_str;

+    my $parse_file_type;

+    my $parse_flash_dev;

+    my $parse_max_size;

+    my $parse_attr;

+

+    $fileContent =~ s/(.*)#(.*)/$1/g;

+

+    $fileContent =~ /FILE_VER:[\f\t]*(\w*)[\f\t]*/;

+    $parse_file_ver = hex($1);

+    $parse_file_ver_str = &Dec2ASCIIString($parse_file_ver);

+

+    $fileContent =~ /FILE_TYPE:[\f\t]*(\w*)[\f\t]*/;

+    $parse_file_type = $1;

+

+    $fileContent =~ /FLASH_DEV:[\f\t]*(\w*)[\f\t]*/;

+    $parse_flash_dev = $1;

+

+    $fileContent =~ /MAX_SIZE:[\f\t]*(\w*)[\f\t]*/;

+    $parse_max_size = hex($1);

+

+    $fileContent =~ /ATTRIBUTE:[\f\t]*(\w*)[\f\t]*/;

+    $parse_attr = hex($1);

+    

+    return ($parse_file_ver_str, $parse_file_type, $parse_flash_dev, $parse_max_size, $parse_attr);

+}

+

+#****************************************************************************

+# subroutine:  GetFileContent

+# input:   strFilePath

+# output:  strFileContent after chomp

+#****************************************************************************

+sub GetFileContent

+{

+    my ($strFilePath) = @_;

+    my $content;

+    open FILE, "<$strFilePath" or &error_handler("$strFilePath: open file error!", __FILE__, __LINE__, 'GetFileContent');

+    {

+        local $/;

+        $content = <FILE>;

+    }

+    close FILE;

+    chomp($content);

+    return $content;

+}

+

+#****************************************************************************

+# subroutine:  Dec2HexASCII, without "0x" for prefix, big endian

+# input:       Integer value

+# output:      Hex ASCII without "0x"

+#****************************************************************************

+sub Dec2ASCIIString

+{

+    my ($dec) = @_;

+    my $str = "";

+    if ($dec > 0x00FF0000)

+    {

+        $str .= chr(($dec >> 0) & 0xFF);

+        $str .= chr(($dec >> 8) & 0xFF);

+        $str .= chr(($dec >> 16) & 0xFF);

+        $str .= chr(($dec >> 24) & 0xFF);

+    }

+    elsif($dec > 0x0000FF00)

+    {

+        $str .= chr($dec & 0xFF);

+        $str .= chr(($dec >> 8) & 0xFF);

+        $str .= chr(($dec >> 16) & 0xFF);

+        $str .= chr(0x00);

+    }

+    elsif($dec > 0x000000FF)

+    {

+        $str .= chr($dec & 0xFF);

+        $str .= chr(($dec >> 8) & 0xFF);

+        $str .= chr(0x00);

+        $str .= chr(0x00);

+    }

+    else

+    {

+        $str .= chr($dec & 0xFF);

+        $str .= chr(0x00);

+        $str .= chr(0x00);

+        $str .= chr(0x00);

+    }

+}

+

+#****************************************************************************

+# subroutine:  Check GFH Header, (0-2: 4D 4D 4D, 8-16: FILE_INFO)

+# input:       File Name

+# output:      True/False

+#****************************************************************************

+sub IsGFH

+{

+    my ($strFilePath) = @_;

+    my $bIsGFH = 0;

+

+    if (-e $strFilePath)

+{

+# Get 17bytes (0-2: 4D 4D 4D, 8-16: FILE_INFO

+open (FILE_HANDLE, "<$strFilePath") or &error_handler("$strFilePath: open file error!");

+#binmode(FILE_HANDLE);

+    my ($nIndex, $data) = (0, undef);

+    my @Buffer;

+    while (read(FILE_HANDLE, $data, 1))

+    {

+        $Buffer[$nIndex++] = $data;

+        last if ($nIndex > 16);

+    }

+    close FILE_HANDLE;

+    my ($strFILE_INFO, $nMatchMMM) = (undef, 0);

+    for (0..2)

+    {

+        $nMatchMMM++ if (ord($Buffer[$_]) == 0x4D);

+    }

+    for (8..16)

+    {

+        $strFILE_INFO .= $Buffer[$_];

+    }

+    $bIsGFH = 1 if ($nMatchMMM == 3 and $strFILE_INFO eq "FILE_INFO");

+}

+return $bIsGFH;

+}

+

+#****************************************************************************

+# subroutine:  error_handler

+# input:       $error_msg:     error message

+#              $file:          filename

+#              $line_no:       line number

+#****************************************************************************

+sub error_handler

+{

+    my ($error_msg) = @_;

+    my ($pack_name, $file, $line_no) = caller;

+    my $final_error_msg = "MODIFY_GFH_FILE_INFO ERROR: $error_msg at $file line $line_no\n";

+    die $final_error_msg;

+}

diff --git a/mcu/tools/SLT/prepend_slt_gfh_file_info.pl b/mcu/tools/SLT/prepend_slt_gfh_file_info.pl
new file mode 100644
index 0000000..aaac836
--- /dev/null
+++ b/mcu/tools/SLT/prepend_slt_gfh_file_info.pl
@@ -0,0 +1,420 @@
+#!/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) 2013

+#

+#  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:

+#* ---------

+#*   prepend_gfh.pl

+#*

+#* Project:

+#* --------

+#*   MOLY

+#*

+#* Description:

+#* ------------

+#*   Add GFH header for the binary without GFH

+#*

+#* Author:

+#* -------

+#*   Chin-Chieh Hung (mtk03404)

+#*

+#****************************************************************************

+use strict;

+

+

+#****************************************************************************

+# Included Modules

+#****************************************************************************

+BEGIN { push @INC, "pcore/" , './pcore/tools/' }  # add additional library path

+use File::Basename;

+use File::Copy;

+#use CommonUtility;

+#use tools::pack_dep_gen;

+#PrintDependModule();

+

+#****************************************************************************

+# Constants

+#****************************************************************************

+my $PREPEND_GFH_VERNO = " m0.01";

+# v0.01 by mtk03404, initial version

+

+#Usage: prepend_gfh.pl SRC_BINFILE_PATH(filename) DST_BINFILE_PATH(filename) file_info.conf 

+

+#****************************************************************************

+# Global Variables

+#****************************************************************************

+my @GFH_Buffer;

+my $gfh_fileinfo_type = 1;

+my %GFH_FILE_TYPE;

+my %GFH_FLASH_DEV;

+my %GFH_SIG_TYPE;

+

+#****************************************************************************

+# GFH FileInfo Related Enum Definition

+#****************************************************************************

+$GFH_FILE_TYPE{ "SLT_TEST_LOAD_0" } = chr(0x00).chr(0x80); #Big Endian

+$GFH_FILE_TYPE{ "SLT_TEST_LOAD_1" } = chr(0x01).chr(0x80); #Big Endian

+$GFH_FILE_TYPE{ "SLT_TEST_LOAD_2" } = chr(0x02).chr(0x80); #Big Endian

+$GFH_FILE_TYPE{ "SLT_TEST_LOAD_3" } = chr(0x03).chr(0x80); #Big Endian

+$GFH_FILE_TYPE{ "SLT_TEST_LOAD_4" } = chr(0x04).chr(0x80); #Big Endian

+$GFH_FILE_TYPE{ "SLT_TEST_LOAD_5" } = chr(0x05).chr(0x80); #Big Endian

+$GFH_FILE_TYPE{ "SLT_TEST_LOAD_6" } = chr(0x06).chr(0x80); #Big Endian

+

+$GFH_FLASH_DEV{ "FLASH_DEV_NONE"     } = chr(0x00);

+$GFH_FLASH_DEV{ "F_NOR"              } = chr(0x01);

+$GFH_FLASH_DEV{ "F_NAND_SEQUENTIAL"  } = chr(0x02);

+$GFH_FLASH_DEV{ "F_NAND_TTBL"        } = chr(0x03);

+$GFH_FLASH_DEV{ "F_NAND_FDM50"       } = chr(0x04);

+$GFH_FLASH_DEV{ "F_EMMC_BOOT_REGION" } = chr(0x05);

+$GFH_FLASH_DEV{ "F_EMMC_DATA_REGION" } = chr(0x06);

+$GFH_FLASH_DEV{ "F_SF"               } = chr(0x07);

+$GFH_FLASH_DEV{ "F_XBOOT"            } = chr(0x08);

+$GFH_FLASH_DEV{ "FLASH_DEV_END"      } = chr(0xFF);

+

+$GFH_SIG_TYPE{ "SIG_NONE"             } = chr(0x00);

+$GFH_SIG_TYPE{ "SIG_PHASH"            } = chr(0x01);

+$GFH_SIG_TYPE{ "SIG_SINGLE"           } = chr(0x02);

+$GFH_SIG_TYPE{ "SIG_SINGLE_AND_PHASE" } = chr(0x03);

+$GFH_SIG_TYPE{ "SIG_MULTI"            } = chr(0x04);

+$GFH_SIG_TYPE{ "SIG_TYPE_NUM"         } = chr(0x05);

+$GFH_SIG_TYPE{ "SIG_TYPE_END"         } = chr(0xFF);

+

+#****************************************************************************

+# Input Parameters

+#****************************************************************************

+my ($src_bin_file)   = $ARGV[0];

+my ($dst_bin_file)   = $ARGV[1];

+my ($file_info_cfg)  = $ARGV[2];

+

+#****************************************************************************

+# Parameter Check

+#****************************************************************************

+die "source binary file $src_bin_file doesn't exist" if not -e $src_bin_file;

+die "config file $file_info_cfg doesn't exist" if not -e $file_info_cfg;

+

+

+#****************************************************************************

+# Functions

+#****************************************************************************

+if (&IsGFH($src_bin_file))

+{

+    print "The $dst_bin_file has the GFH header, does not prepend the GFH header for $dst_bin_file";

+    exit 0;

+}

+else

+{

+    my $b;

+    my $sum;

+    my $src_bin_file_size;

+    open (SRC_FILE_HANDLE, "<$src_bin_file")  or &error_handler("$src_bin_file: open file error!");

+    binmode(SRC_FILE_HANDLE);

+    while (read(SRC_FILE_HANDLE, $b, 1))

+    {

+        $sum .= $b;

+    }

+    close SRC_FILE_HANDLE;

+

+    open (FILE_HANDLE, ">$dst_bin_file") or &error_handler("$dst_bin_file: open file error!");

+    $src_bin_file_size = (-s $src_bin_file) + 0x1000;

+    &GFH_FileInfo_Gen($file_info_cfg, $src_bin_file_size);

+    binmode(FILE_HANDLE);

+    print FILE_HANDLE @GFH_Buffer;

+    print FILE_HANDLE $sum;

+    close FILE_HANDLE;

+

+

+

+#copy($src_bin_file, $dst_bin_file) or die "$!";

+}

+

+# GFH_FILE_INFO_v1

+# [  3:  0] GFH_Header.m_magic_ver

+# [  5:  3] GFH_Header.m_size, = size of GFH_FILE_INFO_v1 structure

+# [  7:  6] GFH_Header.m_type, = GFH_FILE_INFO_v1

+# [ 19:  8] identifier, = GFH_FILE_INFO_ID = "FILE_INFO"

+# [ 23: 20] m_file_ver

+# [ 25: 24] m_file_type, = PRI_ROM, DSP_ROM, ...

+# [   : 26] m_flash_dev

+# [   : 27] m_sig_type

+# [ 31: 28] m_load_addr

+# [ 35: 32] m_file_len

+# [ 39: 36] m_max_size

+# [ 43: 40] m_content_offset

+# [ 47: 44] m_sig_len

+# [ 51: 48] m_jump_offset

+# [ 55: 52] m_attr

+sub GFH_FileInfo_Gen

+{

+    my ($config_file, $input_file_len) = @_;

+    my ($nIndex, $data) = (0, undef);

+    my ($CONFIG_FILE_VER, $CONFIG_FILE_TYPE, $FLASH_DEV, $LOAD_ADDR, $MAX_SIZE, $ATTR) = &GetFileInfoConfig($config_file);

+

+#GFH_Header.m_magic_ver

+    $GFH_Buffer[$nIndex++] = 'MMM'; #'M'

+    $GFH_Buffer[$nIndex++] = chr(0x01);

+printf("1: %d\n", $nIndex);

+#GFH_Header.m_size

+    $GFH_Buffer[$nIndex++] = chr(0x00);

+    $GFH_Buffer[$nIndex++] = chr(0x10);

+

+#GFH_Header.m_type

+    $GFH_Buffer[$nIndex++] = chr(0x00);

+    $GFH_Buffer[$nIndex++] = chr(0x00);

+

+#identifier

+    $GFH_Buffer[$nIndex++] = 'FILE_INFO';

+    $GFH_Buffer[$nIndex++] = chr(0x00);

+    $GFH_Buffer[$nIndex++] = chr(0x00);

+    $GFH_Buffer[$nIndex++] = chr(0x00);

+

+#m_file_ver

+    $GFH_Buffer[$nIndex++] = $CONFIG_FILE_VER;

+

+#m_file_type

+    $GFH_Buffer[$nIndex++] = $GFH_FILE_TYPE{ $CONFIG_FILE_TYPE };

+

+#m_flash_dev

+    if($FLASH_DEV =~ /_NAND_FLASH_BOOTING_/)

+    {

+        $GFH_Buffer[$nIndex++] = $GFH_FLASH_DEV{ "F_NAND_FDM50" };

+    }

+    elsif($FLASH_DEV =~ /__EMMC_BOOTING__/)

+    {

+        $GFH_Buffer[$nIndex++] = $GFH_FLASH_DEV{ "F_EMMC_DATA_REGION" };

+    }

+    elsif($FLASH_DEV =~ /__X_BOOTING__/)

+    {

+        $GFH_Buffer[$nIndex++] = $GFH_FLASH_DEV{ "F_XBOOT" };

+    }

+    elsif($FLASH_DEV =~ /__SERIAL_FLASH_EN__/)

+    {

+        $GFH_Buffer[$nIndex++] = $GFH_FLASH_DEV{ "F_SF" };

+    }

+    else

+    {

+        $GFH_Buffer[$nIndex++] = $GFH_FLASH_DEV{ "F_NOR" };

+    }

+#m_sig_type

+    $GFH_Buffer[$nIndex++] = $GFH_SIG_TYPE{ "SIG_NONE" };

+

+#m_load_addr

+    $GFH_Buffer[$nIndex++] = &Dec2ASCIIString($LOAD_ADDR);

+

+#m_file_len

+    $GFH_Buffer[$nIndex++] = &Dec2ASCIIString($input_file_len);

+

+#m_max_size

+    $GFH_Buffer[$nIndex++] = &Dec2ASCIIString($MAX_SIZE);

+

+#m_content_offset

+    $GFH_Buffer[$nIndex++] = chr(0x00);

+    $GFH_Buffer[$nIndex++] = chr(0x10);

+    $GFH_Buffer[$nIndex++] = chr(0x00);

+    $GFH_Buffer[$nIndex++] = chr(0x00);

+

+#m_sig_len

+    $GFH_Buffer[$nIndex++] = chr(0x00);

+    $GFH_Buffer[$nIndex++] = chr(0x00);

+    $GFH_Buffer[$nIndex++] = chr(0x00);

+    $GFH_Buffer[$nIndex++] = chr(0x00);

+

+#m_jump_offset

+    $GFH_Buffer[$nIndex++] = chr(0x00);

+    $GFH_Buffer[$nIndex++] = chr(0x00);

+    $GFH_Buffer[$nIndex++] = chr(0x00);

+    $GFH_Buffer[$nIndex++] = chr(0x00);

+

+#m_attr, no XIP in MT6290, default value is 0

+    $GFH_Buffer[$nIndex++] = &Dec2ASCIIString($ATTR);

+

+# 4K NAND flash page align

+    for ($nIndex = 0x38; $nIndex < 4096; $nIndex++)

+    {

+        $GFH_Buffer[$nIndex] = chr(0x00);

+    }

+    

+#    print pack("i*", @GFH_Buffer);

+}

+

+#****************************************************************************

+# subroutine:  Get file config

+# input:       config file

+# output:      File Info config setting

+#****************************************************************************

+sub GetFileInfoConfig

+{

+    my $fileContent = &GetFileContent(@_);

+    my $parse_file_ver;

+    my $parse_file_ver_str;

+    my $parse_file_type;

+    my $parse_flash_dev;

+    my $parse_load_addr;

+    my $parse_max_size;

+    my $parse_attr;

+

+    $fileContent =~ s/(.*)#(.*)/$1/g;

+

+    $fileContent =~ /FILE_VER:[\f\t]*(\w*)[\f\t]*/;

+    $parse_file_ver = hex($1);

+    $parse_file_ver_str = &Dec2ASCIIString($parse_file_ver);

+

+    $fileContent =~ /FILE_TYPE:[\f\t]*(\w*)[\f\t]*/;

+    $parse_file_type = $1;

+

+    $fileContent =~ /FLASH_DEV:[\f\t]*(\w*)[\f\t]*/;

+    $parse_flash_dev = $1;

+

+    $fileContent =~ /LOAD_ADDR:[\f\t]*(\w*)[\f\t]*/;

+    $parse_load_addr = hex($1);

+

+    $fileContent =~ /MAX_SIZE:[\f\t]*(\w*)[\f\t]*/;

+    $parse_max_size = hex($1);

+

+    $fileContent =~ /ATTRIBUTE:[\f\t]*(\w*)[\f\t]*/;

+    $parse_attr = hex($1);

+	

+    return ($parse_file_ver_str, $parse_file_type, $parse_flash_dev, $parse_load_addr, $parse_max_size, $parse_attr);

+}

+

+#****************************************************************************

+# subroutine:  GetFileContent

+# input:   strFilePath

+# output:  strFileContent after chomp

+#****************************************************************************

+sub GetFileContent

+{

+    my ($strFilePath) = @_;

+    my $content;

+    open FILE, "<$strFilePath" or &error_handler("$strFilePath: open file error!", __FILE__, __LINE__, 'GetFileContent');

+    {

+        local $/;

+        $content = <FILE>;

+    }

+    close FILE;

+    chomp($content);

+    return $content;

+}

+

+#****************************************************************************

+# subroutine:  Dec2HexASCII, without "0x" for prefix, big endian

+# input:       Integer value

+# output:      Hex ASCII without "0x"

+#****************************************************************************

+sub Dec2ASCIIString

+{

+    my ($dec) = @_;

+    my $str = "";

+    if ($dec > 0x00FF0000)

+    {

+        $str .= chr(($dec >> 0) & 0xFF);

+        $str .= chr(($dec >> 8) & 0xFF);

+        $str .= chr(($dec >> 16) & 0xFF);

+        $str .= chr(($dec >> 24) & 0xFF);

+    }

+    elsif($dec > 0x0000FF00)

+    {

+        $str .= chr($dec & 0xFF);

+        $str .= chr(($dec >> 8) & 0xFF);

+        $str .= chr(($dec >> 16) & 0xFF);

+        $str .= chr(0x00);

+    }

+    elsif($dec > 0x000000FF)

+    {

+        $str .= chr($dec & 0xFF);

+        $str .= chr(($dec >> 8) & 0xFF);

+        $str .= chr(0x00);

+        $str .= chr(0x00);

+    }

+    else

+    {

+        $str .= chr($dec & 0xFF);

+        $str .= chr(0x00);

+        $str .= chr(0x00);

+        $str .= chr(0x00);

+    }

+

+}

+

+#****************************************************************************

+# subroutine:  Check GFH Header, (0-2: 4D 4D 4D, 8-16: FILE_INFO)

+# input:       File Name

+# output:      True/False

+#****************************************************************************

+sub IsGFH

+{

+    my ($strFilePath) = @_;

+    my $bIsGFH = 0;

+

+    if (-e $strFilePath)

+{

+# Get 17bytes (0-2: 4D 4D 4D, 8-16: FILE_INFO

+open (FILE_HANDLE, "<$strFilePath") or &error_handler("$strFilePath: open file error!");

+#binmode(FILE_HANDLE);

+    my ($nIndex, $data) = (0, undef);

+    my @Buffer;

+    while (read(FILE_HANDLE, $data, 1))

+    {

+        $Buffer[$nIndex++] = $data;

+        last if ($nIndex > 16);

+    }

+    close FILE_HANDLE;

+    my ($strFILE_INFO, $nMatchMMM) = (undef, 0);

+    for (0..2)

+    {

+        $nMatchMMM++ if (ord($Buffer[$_]) == 0x4D);

+    }

+    for (8..16)

+    {

+        $strFILE_INFO .= $Buffer[$_];

+    }

+    $bIsGFH = 1 if ($nMatchMMM == 3 and $strFILE_INFO eq "FILE_INFO");

+}

+return $bIsGFH;

+}

+

+#****************************************************************************

+# subroutine:  error_handler

+# input:       $error_msg:     error message

+#              $file:          filename

+#              $line_no:       line number

+#****************************************************************************

+sub error_handler

+{

+    my ($error_msg) = @_;

+    my ($pack_name, $file, $line_no) = caller;

+    my $final_error_msg = "PREPEND_GFH ERROR: $error_msg at $file line $line_no\n";

+    die $final_error_msg;

+}

diff --git a/mcu/tools/SLT/slt b/mcu/tools/SLT/slt
new file mode 100644
index 0000000..33104de
--- /dev/null
+++ b/mcu/tools/SLT/slt
@@ -0,0 +1,808 @@
+#!/bin/sh
+
+BASE=../../../mcu
+MAKEFILE=make/"build.mak"
+OPTIONFILE=make/"Option.mak"
+ATESTMAKEFILE=make/module/driver/autotest/atest_drv.mak
+MTKREL=mtk_rel
+LABLEINI=label.ini
+PREPEND=tools/SLT/prepend_slt_gfh_file_info.pl
+MODIFY=tools/SLT/modify_slt_gfh_file_info.pl
+CONF=tools/SLT/fileinfo.conf
+SLTBL_C=service/sys_svc/bootloader_slt/inc/bl_slt_config.h
+SLT_NL_CONFIG=interface/service/config/middleWare_task_config.h
+LOADPATCHFILE=tools/SLT/config
+
+ctrl_c()
+# run if user hits control-c
+{
+	if [ -f "$MAKEFILE.bak" ]; then
+		mv $MAKEFILE.bak $MAKEFILE
+	fi
+	if [ -f "$CONF.bak" ]; then
+		mv $CONF.bak $CONF
+	fi
+	if [ -f "$PROJFILE.bak" ]; then
+		mv $PROJFILE.bak $PROJFILE
+	fi
+	if [ -f "$LABLEINI.bak" ]; then
+		mv $LABLEINI.bak $LABLEINI
+	fi
+	if [ -f "$MEMORYCONFIG.bak" ]; then
+		mv $MEMORYCONFIG.bak $MEMORYCONFIG
+	fi
+	if [ -f "$OPTIONFILE.bak" ]; then
+		mv $OPTIONFILE.bak $OPTIONFILE
+	fi	
+	if [ -f "$SLTBL_C.bak" ]; then
+		mv $SLTBL_C.bak $SLTBL_C
+	fi	
+	if [ -f "$LABLEINI.bak" ]; then
+		mv $LABLEINI.bak $LABLEINI
+	fi
+	if [ -f "$ATESTMAKEFILE.bak" ]; then
+		mv $ATESTMAKEFILE.bak $ATESTMAKEFILE
+	fi
+	if [ -f "$SLT_NL_CONFIG.bak" ]; then
+		mv $SLT_NL_CONFIG.bak $SLT_NL_CONFIG
+	fi
+	exit
+}
+
+function get_bin_path {
+	local filter=0
+	local fline=""
+	local enter=$(awk 'BEGIN{printf("\r")}')
+	echo Parsing $1
+	for line in `cat $1`
+	do
+		if [ $filter -eq 0 ]; then
+			fline=$fline$line
+		fi
+		if [ "${line:0:1}" = "#" ]; then
+			filter=1
+		fi
+		if [ "${line:${#line}-1:1}" != "$enter" ]; then
+			continue
+		fi
+		fline=${fline:0:${#fline}-1}
+		if [ "${fline%=*}" = "ORIGINAL_PROJECT_NAME" ]; then
+			ORIGINAL_PROJECT_NAME=${fline#ORIGINAL_PROJECT_NAME=}
+		fi
+		if [ "${fline%=*}" = "ORIGINAL_FLAVOR" ]; then
+			ORIGINAL_FLAVOR=${fline#ORIGINAL_FLAVOR=}
+		fi
+		if [ "${fline%=*}" = "BOARD_VER" ]; then
+			BOARD_VER=${fline#BOARD_VER=}
+		fi
+		if [ "${fline%=*}" = "CHIP_VER" ]; then
+			CHIP_VER=${fline#CHIP_VER=}
+			break
+		fi
+		fline=""
+		filter=0
+	done
+	BINPATH="build/"$ORIGINAL_PROJECT_NAME"/"$ORIGINAL_FLAVOR"/bin"
+}
+
+function parsing_project_file {
+	PROJECT=$1
+	PROJFILE=make/$PROJECT
+	get_bin_path $PROJFILE
+
+	MEMORYCONFIG="custom/system/"$BOARD_VER"/"$ORIGINAL_FLAVOR"/custom_MemoryDevice.h.conf"
+	if [ ! -f $MEMORYCONFIG ]; then
+		MEMORYCONFIG="custom/system/"$BOARD_VER"/DEFAULT/custom_MemoryDevice.h.conf"
+		if [ ! -f $MEMORYCONFIG ]; then
+			echo $MEMORYCONFIG is not exsit!	
+			ctrl_c
+			exit
+		fi
+	fi
+	FEATURECONFIG="custom/system/"$BOARD_VER"/"$ORIGINAL_FLAVOR"/custom_FeatureConfig.h.conf"
+	if [ ! -f $FEATURECONFIG ]; then
+		FEATURECONFIG="custom/system/"$BOARD_VER"/DEFAULT/custom_FeatureConfig.h.conf"
+		if [ ! -f $FEATURECONFIG ]; then
+			echo $FEATURECONFIG is not exsit!	
+			ctrl_c
+			exit
+		fi
+	fi
+
+	cp $PROJFILE $PROJFILE.bak
+	chmod +w $PROJFILE
+	cat $PROJFILE.bak \
+		| sed -e "s/^IC_TEST_TYPE\s*=.*/IC_TEST_TYPE = "$CHIP"_SLT/" \
+		> $PROJFILE	
+}
+
+function dispatch_attribute {
+	SLT_LOAD_ATTR_MD=0
+	SLT_LOAD_ATTR_HVT=0
+	SLT_LOAD_ATTR_LOAD_AP=0
+	SLT_LOAD_ATTR_AP_IDX=0
+	attribute_array=($(echo $1 | tr ',' ' ' | tr -s ' '))
+	attribute_array_num=${#attribute_array[@]}
+	SLT_LOAD_ATTR_PARAM0=${attribute_array[0]}
+	for (( attribute_i=0; attribute_i<$attribute_array_num; attribute_i++ ))
+	do
+		if [ "${attribute_array[attribute_i]}" = "MD" ]; then
+			SLT_LOAD_ATTR_MD=1
+		elif [ "${attribute_array[attribute_i]}" = "HVT" ]; then
+			SLT_LOAD_ATTR_HVT=1
+		elif [ "${attribute_array[attribute_i]:0:8}" = "LOAD_AP_" ]; then
+			SLT_LOAD_ATTR_LOAD_AP=1
+			SLT_LOAD_ATTR_AP_IDX=${attribute_array[attribute_i]#LOAD_AP_}
+		fi
+	done
+}
+
+function gen_fileinfo {
+	SLT_TEST_LOAD_IDX=""
+	SLT_LOAD_PATH=""
+	SLT_LOAD_PATH_CHANGED=0
+	SLT_LOAD_ATTRIBUTE=0
+	SLT_LOAD_ADDR=0
+	local gen_fileinfo_clean_conf=0
+	if [ ! -f "$CONF.bak" ]; then
+		cp $CONF $CONF.bak
+		chmod +w $CONF
+		gen_fileinfo_clean_conf=1
+	fi
+	for line in `cat $LOADPATCHFILE`
+	do
+		str=${line%${line#*=$1*}}
+		if [ "${str:0:1}" != "#" ] && [ "${str#*=}" = "$1" ]; then
+			SLT_TEST_LOAD_IDX=${line%=$1*}
+			str=${line#*=$1,*},
+			dispatch_attribute $str
+
+			if [ $SLT_LOAD_ATTR_MD -eq 1 ]; then
+				SLT_LOAD_ATTRIBUTE=$(awk 'BEGIN{printf("%#x",'$SLT_LOAD_ATTRIBUTE'+0x20000000)}')
+				SLT_LOAD_ADDR=0x40000000
+			fi
+			if [ $SLT_LOAD_ATTR_HVT -eq 1 ]; then
+				SLT_LOAD_ATTRIBUTE=$(awk 'BEGIN{printf("%#x",'$SLT_LOAD_ATTRIBUTE'+0x10000000)}')
+			fi
+			if [ $SLT_LOAD_ATTR_LOAD_AP -eq 1 ]; then
+				SLT_LOAD_ATTRIBUTE=$(awk 'BEGIN{printf("%#x",'$SLT_LOAD_ATTRIBUTE'+0x40000000)}')
+				SLT_LOAD_ATTRIBUTE=$(awk 'BEGIN{printf("%#x",'$SLT_LOAD_ATTRIBUTE'+('$SLT_LOAD_ATTR_AP_IDX'*0x01000000))}')
+			fi
+		fi
+	done
+
+	if [ -z $SLT_TEST_LOAD_IDX ] && [ "$SKIP_LOAD_IDX_CHK" != "TRUE" ]; then
+		echo '"'$1'"' is invalid !
+		ctrl_c
+		exit
+	fi
+	if [ "$SLT_LOAD_ADDR" != "0x40000000" ]; then
+		if [ $CHIP = "MT6290" ]; then
+			SLT_LOAD_ADDR=0x10000000
+		else
+			SLT_LOAD_ADDR=0x02000000
+		fi
+	fi
+
+	cat $CONF.bak \
+		| sed -e 's/^FILE_TYPE\s*:.*/FILE_TYPE:'$SLT_TEST_LOAD_IDX'/' \
+		| sed -e 's/^ATTRIBUTE\s*:.*/ATTRIBUTE:'$SLT_LOAD_ATTRIBUTE'/'  \
+		| sed -e 's/^LOAD_ADDR\s*:.*/LOAD_ADDR:'$SLT_LOAD_ADDR'/'  \
+		| sed -e 's/^MAX_SIZE\s*:.*/MAX_SIZE:0xFFFFFFFF/' \
+		> $CONF
+
+	for line in `cat $LOADPATCHFILE`
+	do
+		if [ "${line%=*}" = "$1" ]; then
+			SLT_LOAD_PATH=${line#$1=}
+		fi
+	done
+	if [ -z $SLT_LOAD_PATH ]; then
+		SLT_LOAD_PATH=.
+	else
+		if [ "${SLT_LOAD_PATH:1:7}" = "BINPATH" ]; then
+			SLT_LOAD_PATH=$BINPATH${SLT_LOAD_PATH#?BINPATH*}
+			SLT_LOAD_PATH_CHANGED=1
+		fi
+	fi
+	if [ $gen_fileinfo_clean_conf -eq 1 ]; then
+		mv $CONF.bak $CONF
+	fi
+	SKIP_LOAD_IDX_CHK=""
+}
+
+function gen_GFH_header {
+	cp $CONF $CONF.bak
+	chmod +w $CONF
+
+	gen_fileinfo $1
+	SLT_LOAD_PATH=$(ls $SLT_LOAD_PATH)
+	if [ $? -ne 0 ]; then
+		echo Generate $1 failed!
+		ctrl_c
+		exit
+	fi
+
+	cp -f $SLT_LOAD_PATH $SLTPATH/"$CHIP"_$1
+	if [ $SLT_LOAD_ATTR_HVT -eq 0 ]; then
+		perl $MODIFY $SLTPATH/"$CHIP"_$1 $SLTPATH/"$CHIP"_$1.gfh $CONF
+	else
+		perl $PREPEND $SLTPATH/"$CHIP"_$1 $SLTPATH/"$CHIP"_$1.gfh $CONF
+	fi
+	mv $SLTPATH/"$CHIP"_$1.gfh $SLTPATH/"$CHIP"_$1
+	mv $CONF.bak $CONF
+}
+
+function backup_compile_files {
+	BAKPATH=$SLTPATH"_ORG/"$1
+	if [ -d $BAKPATH ]; then
+		rm -fr $BAKPATH
+	fi
+	mkdir -p $BAKPATH
+	cp -f $BINPATH/*.elf $BAKPATH/.
+	cp -f $BINPATH/*.bin $BAKPATH/.
+	cp -f $BINPATH/*.cfg $BAKPATH/.
+	cp -f $BINPATH/EXT_BOOTLOADER $BAKPATH/.
+}
+
+function gen_slt_loader {
+
+	SKIP_LOAD_IDX_CHK="TRUE"
+	gen_fileinfo SLT_BL_FILE
+	if [ $SLT_LOAD_PATH_CHANGED -eq 1 ]; then
+		cat $PROJFILE.bak \
+			| sed -e 's/IC_TEST_TYPE\s*=.*/IC_TEST_TYPE = MT6290_SLT_LOADER/'\
+			> $PROJFILE
+
+		cp $OPTIONFILE $OPTIONFILE.bak
+		chmod +w $OPTIONFILE
+	
+		cat $OPTIONFILE.bak \
+			| sed -e 's/COM_DEFS += __IC_SLT__/COM_DEFS += __IC_SLT__ __IC_SLT_LOADER__/'\
+			> $OPTIONFILE
+
+		cp $MAKEFILE $MAKEFILE.bak
+		chmod +w $MAKEFILE
+	
+		cat $MAKEFILE.bak \
+			| sed -e 's/^new\s*:\s*update/#new : update/'\
+			> $MAKEFILE
+
+		local output_load_sq=""
+		for line in `cat $LOADPATCHFILE`
+		do
+			if [ "${line%=*}" = "SLT_SQ_ADD" ]; then
+				SLT_SQ_ADD=${line#SLT_SQ_ADD=}
+				output_load_sq=$output_load_sq"{"$SLT_SQ_ADD"},"
+			fi
+		done
+
+		if [ "$output_load_sq" = "" ]; then
+			echo SLT_SQ_ADD is invalid.
+			ctrl_c
+			exit
+		fi
+		if [ -z "$SLT_CHECK_EFUSE" ]; then
+			SLT_CHECK_EFUSE=0xFFFFFFFF
+		fi
+		cp $SLTBL_C $SLTBL_C.bak
+		chmod +w $SLTBL_C
+		cat $SLTBL_C.bak \
+			| sed -e 's/#define SLT_TEST_LOAD_SEQUENCE_FROM_CFG {0,0,PRIMARY_MAUI,NULL,SLT_APMCU_PDN,0}/#define SLT_TEST_LOAD_SEQUENCE_FROM_CFG '$output_load_sq'/'\
+			| sed -e 's/#define SLT_CHECK_EFUSE_FROM_CFG 0xFFFFFFFF/#define SLT_CHECK_EFUSE_FROM_CFG '$SLT_CHECK_EFUSE'/'\
+			> $SLTBL_C
+	
+		if [ -d $MTKREL ]; then
+			rm -r $MTKREL
+		fi
+	
+		./m "$PROJECT_LOADER" new
+	
+		cp -f $BINPATH/"$ORIGINAL_PROJECT_NAME"_BOOTLOADER*.bin $SLTPATH
+		if [ $? -ne 0 ]; then
+			echo Generate BOOTLOADER binary error!
+			ctrl_c
+			exit		
+		fi
+		rm $SLTPATH/"$ORIGINAL_PROJECT_NAME"_BOOTLOADER*_ext.bin
+	
+		if [ ! -f "$BINPATH/EXT_BOOTLOADER" ]; then
+			echo Generate EXT_BOOTLOADER binary error!
+			ctrl_c
+			exit
+		fi
+	
+		cp -f $BINPATH/EXT_BOOTLOADER $SLTPATH
+		backup_compile_files LOADER
+		mv $MAKEFILE.bak $MAKEFILE
+		mv $OPTIONFILE.bak $OPTIONFILE
+		mv $SLTBL_C.bak $SLTBL_C
+	else
+		SLT_LOAD_PATH=$(ls $SLT_LOAD_PATH)
+		if [ $? -ne 0 ]; then
+			echo $SLT_LOAD_PATH is not exist!
+			ctrl_c
+			exit
+		fi
+		cp -f $SLT_LOAD_PATH $SLTPATH
+
+ 		SLT_LOAD_PATH=${SLT_LOAD_PATH%/*}"/EXT_BOOTLOADER"
+		if [ -f "$SLT_LOAD_PATH" ]; then
+			cp -f $SLT_LOAD_PATH $SLTPATH
+		else
+			echo $SLT_LOAD_PATH is not exist.
+			ctrl_c
+			exit
+		fi
+	fi
+}
+
+function gen_hvt {
+	gen_GFH_header SLT_HVT_MD_LOAD
+	gen_GFH_header SLT_HVT_AP_LOAD
+}
+
+function gen_atest {
+	cp $ATESTMAKEFILE $ATESTMAKEFILE.bak
+	chmod +w $ATESTMAKEFILE
+	cp $LABLEINI $LABLEINI.bak
+	chmod +w $LABLEINI
+	cp $MEMORYCONFIG $MEMORYCONFIG.bak
+	chmod +w $MEMORYCONFIG
+
+	gen_fileinfo SLT_ATEST_LOAD
+	if [ $SLT_LOAD_PATH_CHANGED -eq 1 ]; then
+		if [ ! -z "$MOLY_LIB_PATH" ]; then
+			cat $LABLEINI.bak \
+				| sed -e "s,^LINUX_LIB_PATH_1\s*=.*,LINUX_LIB_PATH_1 = "$MOLY_LIB_PATH"," \
+				> $LABLEINI
+		fi
+
+		cat $PROJFILE.bak \
+			| sed -e "s/^IC_TEST_TYPE\s*=.*/IC_TEST_TYPE = "$CHIP"_SLT/" \
+			| sed -e "s/^SDS_SUPPORT\s*=.*/SDS_SUPPORT = FALSE/" \
+			> $PROJFILE
+	
+		cat $ATESTMAKEFILE.bak \
+			| sed -e 's/.*CUSTOM_OPTION.*+=.*ATEST_DRV_LEVEL=5\s*$/COM_DEFS += ATEST_DRV_LEVEL=0/g' \
+			| sed -e 's/.*COM_DEFS.*+=.*ATEST_SLT\s*$/COM_DEFS += ATEST_SLT/g' \
+			| sed -e 's/.*COM_DEFS.*+=.*ATEST_SLT_U3\s*$/COM_DEFS += ATEST_SLT_U3/g' \
+			> $ATESTMAKEFILE
+
+		cat $MEMORYCONFIG.bak \
+			| sed -e 's/^#define\s*CS1_PART_NUMBER.*/#define CS1_PART_NUMBER '"$NANDFLASH"'/' \
+			| sed -e 's/^#define\s*NAND_BOOTING_NAND_FS_SIZE.*/#define NAND_BOOTING_NAND_FS_SIZE 0x01B00000/' \
+			> $MEMORYCONFIG	
+
+		if [ -d $MTKREL ]; then
+			rm -r $MTKREL
+		fi
+		./m -test=ATEST_DRIVER "$PROJECT_ATEST" new
+		backup_compile_files ATEST
+	fi
+
+	gen_GFH_header SLT_ATEST_LOAD
+	
+	mv $LABLEINI.bak $LABLEINI
+	mv $ATESTMAKEFILE.bak $ATESTMAKEFILE
+	mv $MEMORYCONFIG.bak $MEMORYCONFIG
+}
+
+function gen_sdio {
+	cp $ATESTMAKEFILE $ATESTMAKEFILE.bak
+	chmod +w $ATESTMAKEFILE
+	cp $LABLEINI $LABLEINI.bak
+	chmod +w $LABLEINI
+	cp $MEMORYCONFIG $MEMORYCONFIG.bak
+	chmod +w $MEMORYCONFIG
+
+	gen_fileinfo SLT_SDIO_LOAD
+	if [ $SLT_LOAD_PATH_CHANGED -eq 1 ]; then
+		if [ $CHIP = "MT6290" ]; then
+			cat $PROJFILE.bak \
+				| sed -e "s/^SDS_SUPPORT\s*=.*/SDS_SUPPORT = FALSE/" \
+				> $PROJFILE
+
+			cat $ATESTMAKEFILE.bak \
+				| sed -e 's/.*CUSTOM_OPTION.*+=.*ATEST_DRV_LEVEL=5\s*$/COM_DEFS += ATEST_DRV_LEVEL=0/g' \
+				| sed -e 's/.*COM_DEFS.*+=.*ATEST_SLT_SDIO\s*$/COM_DEFS += ATEST_SLT_SDIO_LOAD_FOR_MSDC/g' \
+				> $ATESTMAKEFILE
+		else
+			cat $PROJFILE.bak \
+				| sed -e "s/^IC_TEST_TYPE\s*=.*/IC_TEST_TYPE = "$CHIP"_SLT/" \
+				| sed -e "s/^SDS_SUPPORT\s*=.*/SDS_SUPPORT = FALSE/" \
+				> $PROJFILE
+
+			cat $ATESTMAKEFILE.bak \
+				| sed -e 's/.*CUSTOM_OPTION.*+=.*ATEST_DRV_LEVEL=5\s*$/COM_DEFS += ATEST_DRV_LEVEL=0/g' \
+				| sed -e 's/.*COM_DEFS.*+=.*ATEST_SLT_SDIO\s*$/COM_DEFS += ATEST_SLT_SDIO/g' \
+				> $ATESTMAKEFILE
+		fi
+
+		cat $MEMORYCONFIG.bak \
+			| sed -e 's/^#define\s*CS1_PART_NUMBER.*/#define CS1_PART_NUMBER '"$NANDFLASH"'/' \
+			| sed -e 's/^#define\s*NAND_BOOTING_NAND_FS_SIZE.*/#define NAND_BOOTING_NAND_FS_SIZE 0x01B00000/' \
+			> $MEMORYCONFIG
+
+		if [ -d $MTKREL ]; then
+			rm -r $MTKREL
+		fi
+		./m -test=ATEST_DRIVER "$PROJECT_ATEST" new
+		backup_compile_files SDIO
+	fi
+	gen_GFH_header SLT_SDIO_LOAD
+
+	mv $LABLEINI.bak $LABLEINI
+	mv $ATESTMAKEFILE.bak $ATESTMAKEFILE
+	mv $MEMORYCONFIG.bak $MEMORYCONFIG
+}
+
+function gen_msdc1 {
+	gen_GFH_header SLT_MSDC1_LOAD
+}
+
+function gen_fdd {
+	gen_fileinfo SLT_FDD_LOAD
+	if [ $SLT_LOAD_PATH_CHANGED -eq 1 ]; then
+		cp $MEMORYCONFIG $MEMORYCONFIG.bak
+		chmod +w $MEMORYCONFIG
+	
+		if [ -d $MTKREL ]; then
+			rm -r $MTKREL
+		fi
+
+		cat $PROJFILE.bak \
+			| sed -e "s/^IC_TEST_TYPE\s*=.*/IC_TEST_TYPE = "$CHIP"_SLT/" \
+			| sed -e "s/^SDS_SUPPORT\s*=.*/SDS_SUPPORT = FALSE/" \
+			| sed -e "s/^HIF_USB30_SUPPORT\s*=.*/HIF_USB30_SUPPORT = FALSE/" \
+			| sed -e "s/^HIF_USB_SUPPORT\s*=.*/HIF_USB_SUPPORT = FALSE/" \
+			> $PROJFILE
+	
+		cat $MEMORYCONFIG.bak \
+			| sed -e 's/^#define\s*CS1_PART_NUMBER.*/#define CS1_PART_NUMBER '"$NANDFLASH"'/' \
+			| sed -e 's/^#define\s*NAND_BOOTING_NAND_FS_SIZE.*/#define NAND_BOOTING_NAND_FS_SIZE 0x01B00000/' \
+			> $MEMORYCONFIG
+		
+		./m "$PROJECT_FDD" new
+		
+		cp -f $BINPATH/*_DSPMOLY*.bin $SLTPATH
+		if [ $? -ne 0 ]; then
+			echo $BINPATH/*_DSPMOLY*.bin is not exist.
+			echo Generate FDD load error!
+			ctrl_c
+			exit
+		fi
+	
+		gen_GFH_header SLT_FDD_LOAD
+		cp -f $BINPATH/cmdScript.bin $SLTPATH
+		if [ $? -ne 0 ]; then
+			echo Generate FDD load error!
+			ctrl_c
+			exit
+		fi	
+		
+		backup_compile_files FDD
+		mv $MEMORYCONFIG.bak $MEMORYCONFIG
+	else
+		gen_GFH_header SLT_FDD_LOAD
+
+ 		SLT_LOAD_PATH=${SLT_LOAD_PATH%/*}"/cmdScript.bin"
+		if [ -f "$SLT_LOAD_PATH" ]; then
+			cp -f $SLT_LOAD_PATH $SLTPATH
+		else
+			echo $SLT_LOAD_PATH is not exist.
+			ctrl_c
+			exit
+		fi
+ 		SLT_LOAD_PATH=${SLT_LOAD_PATH%/*}
+		SLT_LOAD_PATH=$(ls $SLT_LOAD_PATH/*_DSPMOLY_*.bin)
+		if [ -f "$SLT_LOAD_PATH" ]; then
+			cp -f $SLT_LOAD_PATH $SLTPATH
+		else
+			echo $SLT_LOAD_PATH is not exist.
+			ctrl_c
+			exit
+		fi
+
+	fi
+}
+
+function gen_tdd {
+	gen_fileinfo SLT_TDD_LOAD
+	if [ $SLT_LOAD_PATH_CHANGED -eq 1 ]; then
+		cp $MEMORYCONFIG $MEMORYCONFIG.bak
+		chmod +w $MEMORYCONFIG
+		cp $SLT_NL_CONFIG $SLT_NL_CONFIG.bak
+		chmod +w $SLT_NL_CONFIG
+
+		if [ -d $MTKREL ]; then
+			rm -r $MTKREL
+		fi
+
+		cat $PROJFILE.bak \
+			| sed -e "s/^IC_TEST_TYPE\s*=.*/IC_TEST_TYPE = MT6290_TDSCDMA_SLT/" \
+			| sed -e "s/^SDS_SUPPORT\s*=.*/SDS_SUPPORT = FALSE/" \
+			| sed -e "s/^HIF_USB30_SUPPORT\s*=.*/HIF_USB30_SUPPORT = FALSE/" \
+			| sed -e "s/^HIF_USB_SUPPORT\s*=.*/HIF_USB_SUPPORT = FALSE/" \
+			| sed -e "s/^# Common preprocessor definitions\s*/&\nCUSTOM_OPTION += __TDDSYS_SLT_FACTORY_BOOT__ /g"\
+			> $PROJFILE
+	
+		cat $MEMORYCONFIG.bak \
+			| sed -e 's/^#define\s*CS1_PART_NUMBER.*/#define CS1_PART_NUMBER '"$NANDFLASH"'/' \
+			| sed -e 's/^#define\s*NAND_BOOTING_NAND_FS_SIZE.*/#define NAND_BOOTING_NAND_FS_SIZE 0x01B00000/' \
+			| sed -e 's/^#define\s*NAND_BOOTING_NAND_FS_BASE_ADDRESS.*/#define NAND_BOOTING_NAND_FS_BASE_ADDRESS 0x04400000/' \
+			> $MEMORYCONFIG 
+		
+		./m "$PROJECT_TDD" new
+	
+		gen_GFH_header SLT_TDD_LOAD
+		backup_compile_files TDD
+
+		mv $MEMORYCONFIG.bak $MEMORYCONFIG
+		mv $SLT_NL_CONFIG.bak $SLT_NL_CONFIG
+	else
+		gen_GFH_header SLT_TDD_LOAD
+	fi
+}
+
+function gen_cfg {
+	local CFGContent=""
+	local BLContent=""
+	local DSPContent=""
+	local load_idx=""
+	local i=0
+
+	for (( i=0; i<8; i++ ))
+	do
+		if [ $i -eq 7 ]; then
+			load_idx="PRIMARY_MAUI"
+		else
+			load_idx="SLT_TEST_LOAD_"$i
+		fi	
+		for line in `cat $LOADPATCHFILE`
+		do
+			if [ "${line%=*}" = "$load_idx" ]; then
+				SLT_LOAD_NAME=${line#$load_idx=}
+				if [ "$SLT_LOAD_NAME" != "" ]; then
+					dispatch_attribute $SLT_LOAD_NAME
+					CFGContent=$CFGContent"\n    - file: "$CHIP"_"$SLT_LOAD_ATTR_PARAM0
+				fi
+				break
+			fi
+		done
+	done
+
+	local DSPPATH=$(ls $SLTPATH/*_DSPMOLY_*.bin)
+	if [ -f "$DSPPATH" ]; then
+		DSPContent="    - file: "${DSPPATH##*/}
+	else
+		echo $SLTPATH/*_DSPMOLY_*.bin is not exist.
+		echo Generate CFG error!
+		ctrl_c
+		exit
+	fi
+	local BOOTLOADERPATH=$(ls $SLTPATH/*_BOOTLOADER_*.bin)
+	BLContent="    - file: "${BOOTLOADERPATH##*/}
+
+	
+	SKIP_LOAD_IDX_CHK="TRUE"
+	gen_fileinfo PRIMARY_MAUI
+	if [ "$SLT_LOAD_PATH" = "." ]; then
+		echo Can not ignore PRIMARY_MAUI.
+		ctrl_c
+		exit
+	fi
+
+	SKIP_LOAD_IDX_CHK="TRUE"
+	gen_fileinfo SLT_CFG_FILE
+	local val=$(egrep $BOARD_VER"_PCB01_MT6290_"$CHIP_VER"." $SLT_LOAD_PATH)
+	if [ -z "$val" ]; then
+		echo $SLT_LOAD_PATH is not match.
+		ctrl_c
+		exit
+	fi
+	cp -f $SLT_LOAD_PATH $SLTPATH/"$CHIP"_SLT.cfg
+	cat $SLTPATH/"$CHIP"_SLT.cfg \
+		| sed -e "s/.*_BOOTLOADER_.*/$BLContent/"  \
+		| sed -e "s/.*"$BOARD_VER"_PCB01_MT6290_"$CHIP_VER".*/$CFGContent/"  \
+		| sed -e "s/.*_DSPMOLY_.*/$DSPContent/"  \
+		> $SLTPATH/"$CHIP"_SLT.cfg.mod
+		
+	mv $SLTPATH/"$CHIP"_SLT.cfg.mod $SLTPATH/"$CHIP"_SLT.cfg
+	if [ $? -ne 0 ]; then
+		echo Generate CFG error!
+		echo Please build MOLY FDD or TDD SLT load first.
+		ctrl_c
+		exit		
+	fi
+	
+	if [ ! -f "$SLTPATH/cmdScript.bin" ]; then
+		SLT_LOAD_PATH=${SLT_LOAD_PATH%/*}/cmdScript.bin
+		cp -f $SLT_LOAD_PATH $SLTPATH
+		if [ $? -ne 0 ]; then
+			echo ${SLT_LOAD_PATH%/*}/cmdScript.bin is not exist.
+			echo Generate CFG error!
+			ctrl_c
+			exit
+		fi
+	fi
+	
+}
+
+function usage {
+	echo "usage:"
+	echo "	slt <chip> [module]"
+	echo "<chip>:"
+	echo "	6290"
+	echo "	6290m_[c/f]"
+	echo "[module]:"
+	echo "	loader - build SLT loader"
+	echo "	hvt - prepend GFH header for HVT binary"
+	echo "	atest - build MOLY SLT atest"
+	echo "	fdd - build MOLY SLT FDD normal load"
+	echo "	tdd - build MOLY SLT TDD normal load"
+	echo "	cfg - generate cfg for FlashTool download"
+	echo
+	echo "If not select any [module], all test load for SLT wiil be generated."
+	echo
+}
+
+if [ -z "$1" ]; then
+	usage
+	exit
+fi
+
+if [ "$1" = "6290" ] || [ "${1:0:5}" == "6290_" ]; then
+	CHIP=MT6290
+	echo $CHIP
+elif [ "$1" = "6290m" ] || [ "${1:0:6}" = "6290m_" ]; then
+	CHIP=MT6290M
+	echo $CHIP
+else
+	echo Error argument
+	exit
+fi
+
+LOADPATCHFILE=$LOADPATCHFILE'_'$1
+if [ ! -f "$LOADPATCHFILE" ]; then
+	echo $LOADPATCHFILE is not exist.
+	ctrl_c
+	exit
+fi
+for line in `cat $LOADPATCHFILE`
+do
+	if [ "${line%=*}" = "SLT_CHECK_EFUSE" ]; then
+		SLT_CHECK_EFUSE=${line#SLT_CHECK_EFUSE=}
+	fi
+	if [ "${line%=*}" = "MOLY_ATEST_LIB_PATH" ]; then
+		MOLY_LIB_PATH=${line#MOLY_ATEST_LIB_PATH=}
+	fi
+	if [ "${line%=*}" = "PROJECT_LOADER" ]; then
+		PROJECT_LOADER=${line#PROJECT_LOADER=}
+	fi
+	if [ "${line%=*}" = "PROJECT_ATEST" ]; then
+		PROJECT_ATEST=${line#PROJECT_ATEST=}
+	fi
+	if [ "${line%=*}" = "PROJECT_SDIO" ]; then
+		PROJECT_SDIO=${line#PROJECT_SDIO=}
+	fi
+	if [ "${line%=*}" = "PROJECT_FDD" ]; then
+		PROJECT_FDD=${line#PROJECT_FDD=}
+	fi
+	if [ "${line%=*}" = "PROJECT_TDD" ]; then
+		PROJECT_TDD=${line#PROJECT_TDD=}
+	fi
+	if [ "${line%=*}" = "NANDFLASH" ]; then
+		NANDFLASH=${line#NANDFLASH=}
+	fi
+done
+
+SLTPATH=build/${CHIP}_SLT
+if [ ! -z "$SLT_CHECK_EFUSE" ]; then
+	SLTPATH=$SLTPATH"_"$SLT_CHECK_EFUSE
+fi
+
+case "$2" in
+	"")
+		if [ -d $SLTPATH ]; then
+			rm -r $SLTPATH
+			mkdir -p $SLTPATH
+		else
+			mkdir -p $SLTPATH
+		fi
+		parsing_project_file $PROJECT_LOADER
+		gen_slt_loader
+		mv $PROJFILE.bak $PROJFILE
+		gen_hvt
+		parsing_project_file $PROJECT_ATEST
+		gen_atest
+		mv $PROJFILE.bak $PROJFILE
+		parsing_project_file $PROJECT_FDD
+		gen_fdd
+		mv $PROJFILE.bak $PROJFILE
+		parsing_project_file $PROJECT_TDD
+		gen_tdd
+		mv $PROJFILE.bak $PROJFILE
+		gen_cfg
+		;;
+	loader)
+		parsing_project_file $PROJECT_LOADER
+		if [ ! -d $SLTPATH ]; then
+			mkdir -p $SLTPATH
+		fi
+		echo Generate SLT Loader...
+		gen_slt_loader
+		echo Generate SLT Finished!
+		;;
+	hvt)
+		parsing_project_file $PROJECT_LOADER
+		if [ ! -d $SLTPATH ]; then
+			mkdir -p $SLTPATH
+		fi
+		echo Generate HVT...
+		gen_hvt
+		echo Generate HVT Finished!
+		;;
+	atest)
+		parsing_project_file $PROJECT_ATEST
+		if [ ! -d $SLTPATH ]; then
+			mkdir -p $SLTPATH
+		fi
+		echo Generate MOLY ATEST...
+		gen_atest
+		echo Generate MOLY Finished!
+		;;
+	fdd)
+		parsing_project_file $PROJECT_FDD
+		if [ ! -d $SLTPATH ]; then
+			mkdir -p $SLTPATH
+		fi
+		echo Generate MOLY FDD Normal Load...
+		gen_fdd			
+		echo Generate MOLY FDD Normal Finished!
+		;;
+	tdd)
+		parsing_project_file $PROJECT_TDD
+		if [ ! -d $SLTPATH ]; then
+			mkdir -p $SLTPATH
+		fi
+		echo Generate MOLY TDD Normal Load...
+		gen_tdd			
+		echo Generate MOLY TDD Normal Finished!
+		;;
+	cfg)
+		parsing_project_file $PROJECT_LOADER
+		if [ ! -d $SLTPATH ]; then
+			mkdir -p $SLTPATH
+		fi
+		echo Generate CFG File...
+		gen_cfg
+		echo Generate CFG Finished!
+		;;
+	sdio)
+		parsing_project_file $PROJECT_SDIO
+		if [ ! -d $SLTPATH ]; then
+			mkdir -p $SLTPATH
+		fi
+		echo Generate SDIO File...
+		gen_sdio
+		echo Generate SDIO Finished!
+		;;
+	msdc1)
+		parsing_project_file $PROJECT_LOADER
+		if [ ! -d $SLTPATH ]; then
+			mkdir -p $SLTPATH
+		fi
+		echo Generate MSDC1 File...
+		gen_msdc1
+		echo Generate MSDC1 Finished!
+		;;
+	*)
+		gen_GFH_header $2
+esac
+
+if [ -f "$PROJFILE.bak" ]; then
+	mv $PROJFILE.bak $PROJFILE
+fi
+	
+exit