[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/mbis.pm b/mcu/tools/mbis.pm
new file mode 100644
index 0000000..e820969
--- /dev/null
+++ b/mcu/tools/mbis.pm
@@ -0,0 +1,554 @@
+#!/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) 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).

+#

+#

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

+package tools::mbis;

+BEGIN{ push @INC, "tools/perl"};

+use MIME::Lite;

+use File::Copy;

+use Cwd;

+use File::Basename;

+

+# for export subroutines

+use Exporter;

+@ISA = qw(Exporter);

+use vars qw(@EXPORT);

+@EXPORT  = qw(&mbisLogCommand &mbisLogInfo &mbisLogTimeStamp &mergeLogFile &mbisPostProcess &writeTimeLogFromTempfile);

+

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

+#              Global Variable Declaration and Initialization

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

+my $file_server_folder;

+my $mbis_config_ini;

+

+if($^O eq "MSWin32") {

+	if (!-d "protocol/lte_sec"){

+		$file_server_folder = "\\\\glbfs14\\sw_releases\\mbis\\moly\\un_processed\\";

+		$mbis_config_ini = "\\\\glbfs14\\sw_releases\\mbis\\scripts\\MBIS_conf.ini";

+	}else{ # in LTE domain

+		$file_server_folder = "\\\\mtklwafs01\\mbis\\moly\\un_processed\\";

+		$mbis_config_ini = "\\\\mtklwafs01\\mbis\\scripts\\MBIS_conf.ini";

+	}

+}

+if($^O eq "linux") {

+  $file_server_folder = "/moly/un_processed"; #/glbfs14/sw_releases/mbis/ is root

+  $mbis_config_ini = "/mtkeda/wcpsm/mbis/config/mbis_conf.ini";

+}

+

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

+#   Function: mbisLogCommand

+#   Argument:

+#       (1) $mbis_enable:   mbis enable flag

+#       (2) @argv:          original command (.bat) name + the arguments

+#

+#   Return: NONE

+#   Description: log the original command and arguments into mbis info MBIS_BUILD_INFO_LOG.

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

+sub mbisLogCommand{

+    my ($mbis_enable, @argv) = @_;

+    

+    if ($mbis_enable){

+        logToInfoFile ("COMMAND,make @argv");

+    }

+}

+

+

+

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

+#   Function: mbisLogInfo

+#   Argument:

+#       (1) $mbis_enable:   mbis enable flag

+#       (2) $info:          the info string

+#

+#   Return: NONE

+#   Description: log the info message into MBIS_BUILD_INFO_LOG.

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

+sub mbisLogInfo{

+    my ($mbis_enable, $info) = @_;

+    if ($mbis_enable){

+        logToInfoFile ($info);

+    }

+}

+

+

+

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

+#   Function: mbisLogTimeStamp

+#   Argument:

+#       (1) $mbis_enable:   mbis enable flag

+#       (2) $info:          the info string

+#

+#   Return: NONE

+#   Description: log the info message and timestamp into MBIS_BUILD_TIME_TMP.

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

+sub mbisLogTimeStamp{

+    my ($mbis_enable, $info) = @_;

+    if ($mbis_enable){

+        logToTimeStampTempFile ($info);

+    }

+}

+

+

+

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

+#   Function: mergeFileIntoTempfile

+#   Argument:

+#       (1) $mbis_enable:   mbis enable flag

+#       (2) $folder:        the *.mbis folder

+#

+#   Return: NONE

+#   Description: merge the content of all the *.mbis files $dir into MBIS_BUILD_TIME_TMP.

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

+sub mergeLogFile{

+    my ($mbis_enable, $folder) = @_;

+    if ($mbis_enable){

+        opendir (DIR, $folder) or die "no folder : $folder";

+        my @files = grep {/.+\.mbis/}  readdir DIR;

+        close DIR;

+        foreach my $file (@files){

+            logFileIntoTimeStampTempFile("$folder/$file");

+        }

+    }

+}

+

+

+

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

+#   Function: mbisPostProcess

+#   Argument:

+#       (1) $mbis_enable:   mbis enable flag

+#   Return: NONE

+#   Description: rewrite MBIS_BUILD_INFO_LOG and MBIS_BUILD_TIME_LOG and add 

+#                mbis process time info.

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

+sub mbisPostProcess{

+    my ($mbis_enable) = @_;

+    if ($mbis_enable)

+    {

+      my $build_time_string = "";

+      my $successful_build = 0;

+      my $userID = "";

+      my @info_list = ();

+      my $bm_build = 0;

+      my $transfer_file_name = "";

+      my $machine = "";

+      my $build_start_time = "";

+      my $mbis_process_start_time;

+      my $mbis_process_end_time;

+      my $mbis_duration_time;

+      my $total_process_start_time;

+      my $total_process_end_time;

+      my $total_duration_time;

+      my $line;

+      my $PID = "";

+      my $sec;

+      my $min;

+      my $hour;

+      my $mday;

+      my $mon;

+      my $year;

+      my $path;

+       

+      $mbis_process_start_time = time;

+      logToTimeStampTempFile("T_S,MBIS,M");

+       

+      # process the time log file

+      &writeTimeLogFromTempfile($mbis_enable);

+      

+      # process the info log file

+      open(FILEHANDLE, $ENV{MBIS_BUILD_INFO_LOG}) or die "can't open $ENV{MBIS_BUILD_INFO_LOG}!\n";

+    

+      foreach $line (<FILEHANDLE>){

+          # for time end/start stamp

+          $line =~ s/\s+$//;

+          @info_list=split /,/, $line;

+          if ($info_list[0] eq "SUCCESSFUL_BUILD")

+          {

+            $successful_build = $info_list[1];

+          }

+          elsif ($info_list[0] eq "USER") 

+          {

+            $userID = $info_list[1];

+          }

+          elsif ($info_list[0] eq "BM_BUILD")

+          {

+            $bm_build = $info_list[1];

+          }

+          elsif ($info_list[0] eq "BUILD_MACHINE")

+          {

+            $machine = lc($info_list[1]); 

+          }

+          elsif ($info_list[0] eq "BUILD_START_DATATIME")

+          {

+            $build_start_time = lc($info_list[1]);

+          }

+          elsif ($info_list[0] eq "PID")

+          {

+            $PID = sprintf("%8.8d",($info_list[1]));

+          }

+      }

+      close(FILEHANDLE);

+      

+      $mbis_process_end_time = time;

+      logToTimeStampTempFile("T_E,MBIS,M");

+      logToTimeStampTempFile("T_E,TOTAL,A");

+      

+      # write the reformatted time log directly since parse the temp time log file already.

+      $mbis_duration_time = $mbis_process_end_time - $mbis_process_start_time;

+      logToTimeStampFile("MBIS,M,$mbis_process_start_time,$mbis_process_end_time,$mbis_duration_time");

+      

+      # get the start stampe for TOTAL to calculate the TOTAL time

+      open(FILEHANDLE, $ENV{MBIS_BUILD_TIME_TMP}) or die "can't open  $ENV{MBIS_BUILD_TIME_TMP}!\n"; 

+      foreach $line (<FILEHANDLE>){

+          if($line =~ /^T_S,TOTAL,A,(.+)/){

+              $total_process_start_time = trim($1);

+              last;

+          }

+      }

+      close(FILEHANDLE);

+

+      # write the reformatted time log directly again.

+      $total_process_end_time = time;	

+      $total_duration_time = $total_process_end_time - $total_process_start_time;

+      logToTimeStampFile("TOTAL,A,$total_process_start_time,$total_process_end_time,$total_duration_time");

+

+      # Record build end_data_time

+      # get epoch timestamp

+      $build_time_sec = time;

+      # convert to GMT+8 time

+      ($sec, $min, $hour, $mday, $mon, $year) = gmtime($build_time_sec+28800);

+      $build_time_string = sprintf("%4.4d.%2.2d.%2.2d.%2.2d.%2.2d.%2.2d", $year+1900, $mon+1, $mday, $hour, $min, $sec);

+      logToInfoFile("BUILD_END_DATATIME,$build_time_string");

+      

+      #if(($successful_build == 1) && ($bm_build == 1)){

+      $transfer_file_name = $build_start_time  . "_" .  $machine . "_" . $PID;

+

+      $dir_path = dirname($ENV{MBIS_BUILD_INFO_LOG});

+      move($ENV{MBIS_BUILD_INFO_LOG}, "$dir_path/$transfer_file_name"."_mbis_info.log");

+      move($ENV{MBIS_BUILD_TIME_LOG}, "$dir_path/$transfer_file_name"."_mbis_time.log");

+      move($ENV{MBIS_BUILD_TIME_TMP}, "$dir_path/$transfer_file_name"."_mbis_time.tmp");

+      $path = $ENV{MBIS_BUILD_INFO_LOG};

+      $path =~ m/(.*)[\\\/](.+)/;

+        #}

+    } #if ($mbis_enable)

+}

+

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

+#   Function: writeTimeLogFromTempfile

+#   Argument: NONE

+#   Return: NONE

+#   Description: calculate the time duration in MBIS_BUILD_TIME_TMP and rewrite 

+#                into MBIS_BUILD_TIME_LOG file.

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

+sub writeTimeLogFromTempfile{

+    my ($mbis_enable) = @_;

+    if ($mbis_enable){

+        my @time_data;

+        my $timestamp_type;

+        my $item_name;

+        my $item_type;

+        my $item_timestamp;

+        my %mbis_start_timetable;

+        my %mbis_end_timetable;

+        my @item_seq;

+        my $last_item_name;

+        my @mbis_end_timetable_key;

+        my $item;

+        my $item_start_time;

+        my $item_end_time;

+        my $item_duration_time;

+        my $log_str;

+        my $line;

+    

+        open(FILEHANDLE, $ENV{MBIS_BUILD_TIME_TMP}) or die "can't open $ENV{MBIS_BUILD_TIME_TMP}!\n";

+        foreach $line (<FILEHANDLE>){

+            $line =~ s/\s+$//;

+            

+            # do NOT process TOTAL and MBIS start timestamp because the end timestamp is not logged yet.

+            if($line =~ /(^T_S,TOTAL,A)|(^T_S,MBIS,M)/){

+                next;

+            }

+            

+            if($line =~ /^(T_S|T_E),/){

+                @time_data  = split (/,/ , $line);

+                

+                #T_S[0],emigen[1],T[2],1288539647[3]

+                $timestamp_type = trim($time_data[0]);

+                $item_name      = trim($time_data[1]);

+                $item_type      = trim($time_data[2]);

+                $item_timestamp = trim($time_data[3]);

+                

+                if ($timestamp_type eq "T_S"){

+                    $mbis_start_timetable{$item_name} = "$item_type,$item_timestamp";

+                    

+                    # remember the item sequence

+                    push(@item_seq, $item_name); 

+                    

+                    # special handling for $item_type = "O", keep the $item_name for next item comparsion

+                    if ($item_type eq "O"){

+                        $last_item_name = $item_name;

+                    }   

+                }

+                else{ #$timestamp_type eq "T_E"

+                    $mbis_end_timetable{$item_name} = "$item_type,$item_timestamp";

+                    

+                    # special handling for $item_type = "O", obj timestamp must side by side with T_S and T_E

+                    if ($item_type eq "O"){

+                        if ($last_item_name ne $item_name){

+                            logWarning("[WARNING] Unexpect timestamp for object : $item_name");

+                        }

+                        $last_item_name = "";

+                    }            

+                }

+            }

+            elsif ($line =~ /^Time Stamp/){

+        	   #ignore title

+       	    }

+       	    else{

+       	         logWarning("[WARNING] Unexpect mbis log line : $line");

+       	    }

+        }

+        close(FILEHANDLE);

+        

+        foreach $item_name(@item_seq){

+            # $item = "$item_type,$item_name"          

+            $item_start_time    = getItemTimeStamp($mbis_start_timetable{$item_name});

+            $item_end_time      = getItemTimeStamp($mbis_end_timetable{$item_name});

+            if (defined($item_end_time)){

+                $item_duration_time = $item_end_time - $item_start_time;

+                $item_type = getItemType($mbis_start_timetable{$item_name});

+                

+                # check if the item_type is match

+                # still log the timestamp according to the start timestamp type

+                if (getItemType($mbis_end_timetable{$item_name}) ne $item_type){

+                     logWarning("[WARNING] Type mismatch for item : $item_name");

+                }    

+                

+                # append to the log string

+                #print "$item_name,$item_type,$item_start_time,$item_end_time,$item_duration_time\n";

+                $log_str .= "$item_name,$item_type,$item_start_time,$item_end_time,$item_duration_time\n";

+    

+                # clean the value of $mbis_end_timetable{$item_name} for checking single T_E

+                $mbis_end_timetable{$item_name} = undef;

+            }

+            else{

+                # check if just T_S but no T_E

+                logWarning("[WARNING] Single T_S of $item_name");

+            }

+        }

+        

+        # check if just T_E but no T_S

+        @mbis_end_timetable_key = keys %mbis_end_timetable;

+        foreach $item_name(@mbis_end_timetable_key){

+            if (defined($mbis_end_timetable{$item_name})){

+                logWarning("[WARNING] Single T_E of $item_name");

+            }

+        }

+        

+        # write the log string to the log file

+        if (defined($log_str)){

+            open(FILEHANDLE, ">$ENV{MBIS_BUILD_TIME_LOG}") or die "cannot open file for writing: $!";

+            print FILEHANDLE "Item Name,Type,Start Time,End Time,Duration Time\n";

+            print FILEHANDLE "$log_str";

+            close(FILEHANDLE);

+        }

+    }#if ($mbis_enable)

+}

+

+

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

+#              Internal Subroutine Definition

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

+sub logToInfoFile{

+    open FILEHANDLE, ">>$ENV{MBIS_BUILD_INFO_LOG}";

+    print FILEHANDLE "$_[0]\n";

+    close FILEHANDLE;

+}

+

+

+

+sub logToTimeStampFile{

+    open FILEHANDLE, ">>$ENV{MBIS_BUILD_TIME_LOG}";

+    print FILEHANDLE "$_[0]\n";

+    close FILEHANDLE;

+}

+

+

+

+sub logToTimeStampTempFile{

+    my $datetime = time;

+    open FILEHANDLE, ">>$ENV{MBIS_BUILD_TIME_TMP}";

+    print FILEHANDLE "$_[0],$datetime\n";

+    close FILEHANDLE;

+}

+

+

+

+sub logFileIntoTimeStampTempFile{

+    my $file_path = $_[0];

+    my $line;

+    open FILEHANDLE, ">>$ENV{MBIS_BUILD_TIME_TMP}";

+    open INPUT, $file_path or die "cannot open source file: $!";

+    foreach $line (<INPUT>){

+        print FILEHANDLE $line;

+    }

+    close INPUT;

+    close FILEHANDLE;

+}

+

+

+

+sub logWarning{

+    return 0;

+#    open FILEHANDLE, ">>mbis_warning.log";

+#    print FILEHANDLE "$_[0]\n";

+#    close FILEHANDLE;

+}

+

+

+

+sub trim{

+    if (defined($_[0])){

+        my $item = $_[0];

+        $item =~ s/(^\s+)|(\s+$)//g;

+        return $item;

+    }

+    else{

+        return undef;

+    }

+    

+}

+

+

+

+sub getItemTimeStamp{

+    if (defined($_[0])){

+        my $item = $_[0];

+        $item =~ /(?:\w+),(\w+)/;

+        return $1;

+    }

+    else{

+        return undef;

+    }

+}

+

+

+

+sub getItemType{

+    if (defined($_[0])){

+        my $item = $_[0];

+        $item =~ /(\w+),\w+/;

+        return $1;

+    }

+    else{

+         return undef;

+    }

+}

+

+sub notify_owner{

+  #skip notify owner

+  return 0;

+

+  if (!-e "$mbis_config_ini") {

+  	  warn "Skip mbis log files. Build process is DONE.\n";

+  	  exit 0;

+  } 

+  my %mbis_conf = iniToHash($mbis_config_ini);

+  my $smtp = $mbis_conf{'NOTIFY_INFO'}->{'SMTP'};

+  my $admin_email = $mbis_conf{'NOTIFY_INFO'}->{'MBIS_ADMIN_MAIL'};

+  my $notify_owner_email = $mbis_conf{'NOTIFY_INFO'}->{'MBIS_NOTIFY_MAIL'};

+  my $message_body="";

+  

+  print "Notify MBIS Service Owner...";  

+	chomp(my $cwd = cwd());

+	my ($infolog,$timelog,$infotmp,$upload_log) = @_;

+

+  if(-e "$upload_log")

+  {

+    open (LOG_FILE, "<$upload_log") or warn "cannot open $upload_log!\n";

+    $backup = $/;

+    undef $/;

+    $message_body = <LOG_FILE>;

+    $/ = $backup;

+    close LOG_FILE;

+  }

+  

+  $msg = MIME::Lite->new(

+    From    => $admin_email,

+    To      => $notify_owner_email,

+    Subject => '[MBIS Notify] MBIS log files upload Failed',

+    Type    => 'multipart/mixed'

+  );

+  

+  $msg->attach(Type  => 'auto',Path  => $cwd."/".$infolog,);

+  $msg->attach(Type  => 'auto',Path  => $cwd."/".$timelog,);

+  $msg->attach(Type  => 'auto',Path  => $cwd."/".$infotmp,);

+  

+  $msg->attach (

+     Type => 'TEXT',

+     Data => $message_body

+  ) or warn "Error adding the text message part: $!\n";

+  

+  $msg->send('smtp', $smtp, Timeout => 60);

+  print "Done\n"; 

+}

+

+sub iniToHash {

+  open(MYINI, $_[0]);

+  my %hash;

+  my $hashref;

+

+  while(<MYINI>)

+  {

+    next if ((/^\s*$/) || (/^\s*#/));

+    if (/^\s*\[(.+)\]/)

+    {

+      $hashref = $hash{$1} ||= {};

+    }

+    elsif (/^\s*(\S+)\s*=\s*(.+)\s*$/)

+    {

+      $hashref->{$1} = $2;

+    }

+    elsif (/^\s*(\S+)\s*\+=\s*(.+)\s*$/)

+    {

+      $hashref->{$1} = $hashref->{$1} . " $2";

+    }

+  }

+

+  close MYINI;

+  return %hash;

+}

+

+1;