[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/xboot_pack.pl b/mcu/tools/xboot_pack.pl
new file mode 100644
index 0000000..783b8b0
--- /dev/null
+++ b/mcu/tools/xboot_pack.pl
@@ -0,0 +1,343 @@
+#!/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:
+#* ---------
+#*   xboot_pack.pl
+#*
+#* Project:
+#* --------
+#*   MOLY
+#*
+#* Description:
+#* ------------
+#*   Pack xboot image
+#*       
+#* Author:
+#* -------
+#*   Cindy Tu (mtk03468)
+#*
+#****************************************************************************
+use strict;
+
+#****************************************************************************
+# Constants
+#****************************************************************************
+my $XBOOT_PACK_VERNO = " m0.01"; # v0.01 by mtk3468, initial version
+
+#Usage:xboot_pack.pl DA_BINFILE_PATH(filename) BL_BINFILE_PATH(filename) EXT_BINFILE_PATH(filename) MOLY_Image(filename) DST_BINFILE_PATH(filename)
+
+#****************************************************************************
+# Global Variables
+#****************************************************************************
+my $IMG_TBL_MAGIC=0x2454E7D3;
+my $IMG_TBL_ADDR_MAGIC=0x14;
+my $IMG_TBL_BASE_ADDR=0x20;
+my $IMG_TBL_SIZE=0x10;
+my $IMG_TYPE_DA=0x06;
+my $IMG_TYPE_MINI_BL=0x02;
+my $IMG_TYPE_EXT_BL=0x03;
+my $IMG_TYPE_MOLY=0x04;
+my $IMAGE_ALIGN=0x100;
+my $DA_MAX_SIZE=0x10000;
+my $BL_MAX_SIZE=0x40000;
+my $IMAGE_BIN_START=0x100;
+
+my $da_base;
+my $mini_bl_base;
+my $ext_bl_base;
+my $moly_base;
+
+my @img_tbl_buffer;
+
+#****************************************************************************
+# Input Parameters
+#****************************************************************************
+my ($xboot_da_file)    = $ARGV[0];
+my ($mini_bl_bin_file) = $ARGV[1];
+my ($ext_bl_bin_file)  = $ARGV[2];
+my ($moly_bin_file)    = $ARGV[3];
+my ($dst_bin_file)     = $ARGV[4];
+my ($net_path)         = $ARGV[5];
+my ($partial_source)   = $ARGV[6];
+
+print "Input: $xboot_da_file $mini_bl_bin_file $ext_bl_bin_file $moly_bin_file\n";
+
+#****************************************************************************
+# Parameter Check
+#****************************************************************************
+die "xboot DA file $xboot_da_file doesn't exist" if not -e $xboot_da_file;
+die "mini BL file $mini_bl_bin_file doesn't exist" if not -e $mini_bl_bin_file;
+die "ext BL file $ext_bl_bin_file doesn't exist" if not -e $ext_bl_bin_file;
+die "moly binary file $moly_bin_file doesn't exist" if not -e $moly_bin_file;
+
+#****************************************************************************
+# Functions
+#****************************************************************************
+
+#Write img param
+open (FILE_HANDLE, ">$dst_bin_file") or &error_handler("$dst_bin_file: open file error!");
+binmode(FILE_HANDLE);
+&ImgTblGen();
+print FILE_HANDLE @img_tbl_buffer;
+close FILE_HANDLE;
+
+#Write Xboot DA
+&ConcaFile($xboot_da_file, $dst_bin_file, 1); 
+&ConcaFile($mini_bl_bin_file, $dst_bin_file, 1); 
+&ConcaFile($ext_bl_bin_file, $dst_bin_file, 1); 
+&ConcaFile($moly_bin_file, $dst_bin_file, 0);
+
+print "Partial $partial_source";
+if($partial_source eq "TRUE")
+{
+    system("/proj/wcp1sm/Guardian $net_path/$dst_bin_file");
+}
+
+#****************************************************************************
+# subroutine:  Construct img param region
+# input:       NA
+# output:      NA
+#****************************************************************************
+sub ImgTblGen
+{
+    my ($loop, $nIndex, $crcIndex) = (0, 0, 0);
+    my $da_bin_size = (-s $xboot_da_file);
+    my $mini_bl_size = (-s $mini_bl_bin_file);
+    my $ext_bl_size = (-s $ext_bl_bin_file);
+    my $entries = '';
+    
+    #check file size
+    if( $da_bin_size > $DA_MAX_SIZE )
+    {
+       die "xboot DA file should not exist $DA_MAX_SIZE";
+    }
+     
+    if( $mini_bl_size > $BL_MAX_SIZE )
+    {
+       die "mini BL file should not exist $DA_MAX_SIZE";
+    }
+    
+    if( $ext_bl_size > $BL_MAX_SIZE )
+    {
+       die "ext BL file should not exist $DA_MAX_SIZE";
+    }
+    
+    #calculate binary offset
+    $da_base      = $IMAGE_BIN_START;
+    $mini_bl_base = ($da_base + $da_bin_size + $IMAGE_ALIGN - 1) & ~($IMAGE_ALIGN - 1);
+    $ext_bl_base  = ($mini_bl_base + $mini_bl_size + $IMAGE_ALIGN - 1) & ~($IMAGE_ALIGN - 1);
+    $moly_base    = ($ext_bl_base + $ext_bl_size + $IMAGE_ALIGN - 1) & ~($IMAGE_ALIGN - 1);
+    
+    print "da_base=$da_base, mini_bl_base=$mini_bl_base, ext_bl_base=$ext_bl_base, moly_base=$moly_base\n";
+
+    #padding reserved head
+    for ($loop=0; $loop < $IMG_TBL_ADDR_MAGIC ; $loop=$loop+1, $nIndex=$nIndex+1) {
+        $img_tbl_buffer[$nIndex] = chr(0xFF);
+    }
+    #Write img base at magic addr
+    $img_tbl_buffer[$nIndex++] = &Dec2ASCIIString($IMG_TBL_BASE_ADDR);
+
+    #padding reserved
+    for ($loop = 0; $loop < $IMG_TBL_BASE_ADDR - ($IMG_TBL_ADDR_MAGIC+4) ; $loop=$loop+1, $nIndex=$nIndex+1) {
+        $img_tbl_buffer[$nIndex] = chr(0xFF);
+    }
+
+    #Write img tbl magic
+    $img_tbl_buffer[$nIndex++] = &Dec2ASCIIString($IMG_TBL_MAGIC);
+    
+    #Write img tbl reserve
+    $img_tbl_buffer[$nIndex++] = chr(0xFF);
+    $img_tbl_buffer[$nIndex++] = chr(0xFF);
+    
+    #Write img tbl size
+    $img_tbl_buffer[$nIndex++] = chr($IMG_TBL_SIZE);
+    $img_tbl_buffer[$nIndex++] = chr(0x0);
+    $crcIndex = $nIndex++; 
+    
+    #Write img tbl entry
+    $img_tbl_buffer[$nIndex++] = &Dec2ASCIIString( ($IMG_TYPE_DA << 24) | ($da_base >> 8));
+    $entries .= $img_tbl_buffer[$nIndex-1];
+    $img_tbl_buffer[$nIndex++] = &Dec2ASCIIString( ($IMG_TYPE_MINI_BL << 24) | ($mini_bl_base >> 8));
+    $entries .= $img_tbl_buffer[$nIndex-1];
+    $img_tbl_buffer[$nIndex++] = &Dec2ASCIIString( ($IMG_TYPE_EXT_BL << 24) | ($ext_bl_base >> 8));
+    $entries .= $img_tbl_buffer[$nIndex-1];
+    $img_tbl_buffer[$nIndex++] = &Dec2ASCIIString( ($IMG_TYPE_MOLY << 24) | ($moly_base >> 8));
+    $entries .= $img_tbl_buffer[$nIndex-1];
+
+    #Write img tbl crc
+    my $crc = &Crc32($entries);
+    $img_tbl_buffer[$crcIndex] = &Dec2ASCIIString($crc);
+    
+    my $tblstr = join('', @img_tbl_buffer);
+    #&PrintHex($tblstr);
+    
+    #padding reserved
+    for ($loop = 0; $loop < $IMAGE_BIN_START - length($tblstr) ; $loop=$loop+1, $nIndex=$nIndex+1) {
+        $img_tbl_buffer[$nIndex] = chr(0xFF);
+    }    
+}
+
+#****************************************************************************
+# subroutine:  Concatenate src file to dst file 
+# input:       Src file, dst file
+# output:      NA
+#****************************************************************************
+sub ConcaFile
+{
+    my ($src, $dst, $pad) = @_;
+    my $b;
+    my $src_bin_file_size = (-s $src);
+    my $align_size;
+    my $loop;
+    my @padding;
+    
+    open (DST_FILE_HANDLE, ">>$dst") or &error_handler("$dst: open file error!");
+    binmode(DST_FILE_HANDLE);
+    
+    open (SRC_FILE_HANDLE, "<$src")  or &error_handler("$src: open file error!");
+    binmode(SRC_FILE_HANDLE);
+    
+    #append src file
+    while(read(SRC_FILE_HANDLE, $b, 1))
+    {
+    	print DST_FILE_HANDLE $b;
+    }    
+    
+    if($pad == 1)
+    {
+       #padding reserved
+       $align_size = ($src_bin_file_size + $IMAGE_ALIGN - 1) & ~($IMAGE_ALIGN - 1);
+       for ($loop = 0; $loop < $align_size - $src_bin_file_size ; $loop=$loop+1) {
+           $padding[$loop] = chr(0xFF);
+       }  
+       print DST_FILE_HANDLE @padding;
+    }
+    
+    close SRC_FILE_HANDLE;
+    close DST_FILE_HANDLE;
+}
+
+#****************************************************************************
+# 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:  Calculate the CRC32
+# input:       Input string
+# output:      CRC value
+#****************************************************************************
+sub Crc32 {
+    my ($input, $init_value, $polynomial) = @_;
+    
+    $init_value = 0 unless (defined $init_value);
+    $polynomial = 0xedb88320 unless (defined $polynomial);
+    
+    my @lookup_table;
+    
+    for (my $i=0; $i<256; $i++) {
+        my $x = $i;
+        for (my $j=0; $j<8; $j++) {
+            if ($x & 1) {
+                $x = ($x >> 1) ^ $polynomial;
+            } else {
+                $x = $x >> 1;
+            }
+        }
+        $lookup_table[$i]=$x;
+    }
+    
+    my $crc = $init_value;
+    
+    foreach my $x (unpack ('C*', $input)) {
+        $crc = $lookup_table[ ($crc ^ $x) & 0xff ] ^ (($crc >> 8) & 0xffffff);
+    }
+    
+    return $crc;
+}
+
+#****************************************************************************
+# subroutine:  Print string in HEX value
+# input:       Input string
+# output:      NA
+#****************************************************************************
+sub PrintHex
+{
+    ## Initial string
+    my ($string) = @_;
+    
+    ## convert each character from the string into HEX code
+    $string =~ s/(.)/sprintf("%02X",ord($1))/eg;
+    
+    print "$string\n";
+}