[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/auto_amms_drdi_attribute.pl b/mcu/tools/auto_amms_drdi_attribute.pl
new file mode 100644
index 0000000..da9af7a
--- /dev/null
+++ b/mcu/tools/auto_amms_drdi_attribute.pl
@@ -0,0 +1,341 @@
+#!/usr/bin/perl -w

+

+#-------------------------------------------------------------------

+#Tool version

+

+$tool_version = '20170719';

+

+#-------------------------------------------------------------------

+#Parameters Configuration

+

+$imm_file         = $ARGV[0];

+$list_file        = $ARGV[1];

+$symbol_file      = $ARGV[2];

+$log_file         = $ARGV[3];

+

+#-------------------------------------------------------------------

+# Replace '\' with '/'

+

+$imm_file        =~ s/\\/\//g;

+$list_file       =~ s/\\/\//g;

+$symbol_file     =~ s/\\/\//g;

+$log_file        =~ s/\\/\//g;

+

+#-------------------------------------------------------------------

+

+$debug_mode = 0;  # 0 or 1

+$error_prefix   = 'AutoAMMS Error:';

+$nolist_keyword = 'NO_LIST';

+$attribute_line_number = 0;

+

+#-------------------------------------------------------------------

+# Open log file

+open (FILE_LOG,  ">>$log_file" ) or die (print "$error_prefix Can't open Auto-AMMS-Attribute log file $log_file!\n");

+print FILE_LOG "Auto AMMS Attribute Tool $tool_version\n";

+

+#-------------------------------------------------------------------

+#Construct C file name

+$c_file = $imm_file;

+$c_file =~ s/.*\///;         # remove path part

+print FILE_LOG "Source C   File : $c_file\n";

+print FILE_LOG "Immediated File : $imm_file\n";

+

+#-------------------------------------------------------------------

+# Intialize some list as empty

+%special_symbol_list  = ();

+%added_code = ();

+%attribute_list = ();

+

+$attribute   = '';

+$find_file   = 0;

+$special_symbol_list_num = 0;	

+

+Extract_DRDI_attribute($list_file,$c_file);

+if($find_file == 1)

+{

+   $special_symbol_list_num = Extrace_DRDI_symbol($symbol_file,$c_file);

+   print FILE_LOG "special symbol list num : $special_symbol_list_num\n";

+   &Find_DRDI_List($imm_file, $attribute);

+}

+

+#Add __attribute__ code in source code

+if( scalar(keys %added_code) > 0 )

+{  

+   my $backup = &Add_Attribute_Code( $debug_mode, $imm_file );

+   print FILE_LOG "Backup Imm File : $backup\n";

+   

+}else

+{     

+   print FILE_LOG "\t$c_file is not in AMMS symbol lists.\n";

+}

+

+#-------------------------------------------------------------------

+#Close log file handle

+

+print FILE_LOG "Done!\n";

+print FILE_LOG "-----------------------------------------------------------\n";

+close FILE_LOG;

+

+#-------------------------------------------------------------------

+

+#Parsing Done. 

+

+exit 0;  #return 0 if it is successful

+

+#-------------------------------------------------------------------

+

+sub Extract_DRDI_attribute

+{  

+   my $list = $_[0];

+   

+   return 0 if( $list eq $nolist_keyword );

+   

+   my $search_file_1 = $_[1];

+   my $search_file_2 = $search_file_1;

+   my $section       = '';  

+   $search_file_2 =~ s/\.c$/\.obj/;

+   

+   # Open TCM fucntions list file

+   open (FILE_ITCM, "<$list" ) or &print_error_info_die("$error_prefix Can't open AMMS 3GFDD list file $list!\n");         

+

+   while (<FILE_ITCM>)

+   {  

+      if( /^__attribute__/)

+      {

+         $section = $_;

+      }elsif( /^\s*($search_file_1|$search_file_2)\b/ )

+      { 

+	     $find_file = 1;

+	     print FILE_LOG "find file: $search_file_2\n";

+		 last;

+      }  

+   }

+   $section =~ s/\r\n//g;

+   $attribute = $section;

+   close FILE_ITCM;

+}

+

+sub Extrace_DRDI_symbol

+{  

+   my $list = $_[0];

+   

+   return 0 if( $list eq $nolist_keyword );

+   

+   my $search_file_1 = $_[1];

+   my $search_file_2 = $search_file_1;

+   my $section       = '';   

+   $search_file_2 =~ s/\.c$/\.obj/;

+   

+   # Open TCM fucntions list file

+   open (FILE_ITCM, "<$list" ) or &print_error_info_die("$error_prefix Can't open AMMS 3GFDD list file $list!\n");         

+

+   while (<FILE_ITCM>)

+   {  

+      if( /^\s*(\S+)\s*,?\s*($search_file_1|$search_file_2)\b/ )

+      { 

+         my $search_symbol = $1;

+		 my $symbol_name = $search_symbol;

+		 $symbol_name    =~ s/_SetX/_Set/;

+		 $special_symbol_list{$symbol_name} = 0;

+      }  

+   }

+

+   close FILE_ITCM;

+

+   return scalar(keys %special_symbol_list);

+}

+

+#-------------------------------------------------------------------

+

+#-------------------------------------------------------------------

+

+sub Find_DRDI_List

+{

+   my $imm = $_[0];  #Input is immediated 

+   my $attribute_section = $_[1]; #Input attribute

+   

+   # Open imm file, which is output of pre-processor

+   open (FILE_IMM,  "<$imm"  ) or &print_error_info_die("$error_prefix Can't open immediated file $imm!\n");

+

+   my $line_in      = '';

+   my $line_number  = 0;

+   my $brace_l_sum  = 0;  # left brace { conter 

+   my $brace_r_sum  = 0;  # right brace } conter

+   my $setx  = 'SetX';

+      

+   foreach my $i (0..63)

+   {

+      my $attribute = $attribute_section;

+	  my $setnum = $setx;

+	  $attribute =~ s/SETX/SET$i/;

+	  $setnum       =~ s/X/$i/;

+	  $attribute_list{$setnum} = $attribute;

+   }

+ 

+   while( <FILE_IMM> )

+   {

+      $line_in = $_;

+      $line_number++;

+      

+      next if($line_in =~ /^\#line/);   # speed up parsing

+      next unless ( $line_in =~ /\S/ ); # speed up parsing

+      

+      # Update {} counters

+      my $brace_l_cnt = $line_in =~ tr/{//;  #count { number

+      my $brace_r_cnt = $line_in =~ tr/}//;  #count } number        

+      my $brace_tick_ori = $brace_l_sum - $brace_r_sum;

+      my $brace_tick_new = $brace_tick_ori + ($brace_l_cnt - $brace_r_cnt);      

+      my $run_special_symbol_list = 1;	  

+      $brace_l_sum += $brace_l_cnt;

+      $brace_r_sum += $brace_r_cnt;

+      

+      if( $brace_tick_ori == 0 && !($line_in =~ /^\s*{/) ) # Only search global variable

+      {

+         unless( ( $line_in =~ /\bextern\b/ ) || !($line_in =~ /\bconst\b/ ) )      # || ($line_in =~ /\*/)

+         {   

+		    if(($line_in =~ /\*+\s*\b(\S+)_Set(\d+)\b/i) || ($line_in =~ /\*+\s*\b(\S+)_Type(\d+)\b/i))

+			{

+			   if(($line_in =~ /\*+\s*\bconst\b\s*\b(\S+)_Set(\d+)\b.*[=;,]/i) || ($line_in =~ /\*+\s*\bconst\b\s*\b(\S+)_TYPE(\d+)\b.*[=;,]/))

+			   {

+			      my $num = $2;

+			      my $setnum = $setx;

+			      $setnum =~ s/X/$num/;

+			      $added_code{ $line_number } = $attribute_list{$setnum};

+				  $run_special_symbol_list = 0;

+			   }

+			}

+			elsif(( $line_in =~ /(^|,)[^=]*\b(\S+)_Set(\d+)\b.*[=;,]/i ) || ( $line_in =~ /(^|,)[^=]*\b(\S+)_TYPE(\d+)\b.*[=;,]/ ))

+			{

+			   my $num = $3;

+			   my $setnum = $setx;

+			   $setnum =~ s/X/$num/;

+			   $added_code{ $line_number } = $attribute_list{$setnum};

+			   $run_special_symbol_list = 0;

+			}

+         }         

+		 

+		 if( ($special_symbol_list_num > 0) && ($run_special_symbol_list == 1) )

+		 {

+		    foreach( keys %special_symbol_list )

+		    {

+		       my $target = $_;

+		 	  

+		 	  if($target =~ /\s*(\S+)\*(\S+)\*(\S+)/)

+		       {

+		          my $pre    = $1;

+		 	     my $middle = $2;

+		 	     my $post   = $3;

+		 	     if( $line_in =~ /(^|,)[^=]*\b$pre\w+$middle\w+$post(\d+)\b.*[=;,]/ )

+		 	     {

+		 	        my $num = $2;	

+		 		    my $setnum = $setx;

+		 		    $setnum =~ s/X/$num/;

+		 		    $special_symbol_list{ $target }++;    # hit and increase hit counter

+		 		    $added_code{ $line_number } = $attribute_list{$setnum};

+		 	     }

+		       }

+		       elsif($target =~ /\s*(\S+)\*(\S+)/)

+		       {

+		          my $pre  = $1;

+		 	     my $post = $2;

+		 	     if( $line_in =~ /(^|,)[^=]*\b$pre\w+$post(\d+)\b.*[=;,]/ )

+		 	     {

+		 	        my $num = $2;			   

+		             my $setnum = $setx;

+		 	        $setnum =~ s/X/$num/;               

+                     $special_symbol_list{ $target }++;    # hit and increase hit counter

+                     $added_code{ $line_number } = $attribute_list{$setnum};

+		 	     }

+		       }

+		       else

+		       {

+                  if( $line_in =~ /(^|,)[^=]*\b$target(\d+)\b.*[=;,]/ )   # variable name is matched but assignment is excluded

+                  {       

+                     my $num = $2;			   

+		             my $setnum = $setx;

+		 	        $setnum =~ s/X/$num/;

+                     $special_symbol_list{ $target }++;    # hit and increase hit counter

+                     $added_code{ $line_number } = $attribute_list{$setnum};                          

+                  }

+		       }#End of if()

+			}

+         }         

+      }           

+   }         

+   

+   close FILE_IMM;

+

+}

+

+#-------------------------------------------------------------------

+

+sub Add_Attribute_Code

+{

+   my $debug    = $_[0];

+   my $file_ori = $_[1];

+

+   my $file_new = $file_ori;

+   my $file_bak = $file_ori;

+   $file_bak =~ s/\.c$/\.i/;

+

+   rename $file_ori, $file_bak or &print_error_info_die("$error_prefix Can't rename $file_ori to $file_bak\n");

+   

+   open (FILE_IN,   "<$file_bak"  ) or &print_error_info_die("$error_prefix Can't open immediated file $file_bak!\n");

+   open (FILE_OUT,  ">$file_new"  ) or &print_error_info_die("$error_prefix Can't open output file $file_new!\n");

+

+   my $line_number = 0;

+   my $line_in = '';

+   my $log_on = 0;

+   

+   while( <FILE_IN> )   

+   {

+      $line_in = $_;

+      $line_number++;

+      

+      if( exists $added_code{$line_number} )

+      {

+         my $added = $added_code{$line_number};

+		 $attribute_line_number++;

+		 $added =~ s/LINE/$attribute_line_number/;

+         print FILE_OUT "$added\n  ";

+         

+         if( $debug == 1 )

+         {

+            print FILE_LOG "$added  ";

+            $log_on = 1;

+         }

+      }                  

+      

+      print FILE_OUT $line_in;

+      

+      if($log_on==1)

+      {

+         print FILE_LOG $line_in;

+

+         if( $line_in =~ /[={\;]/ )

+         {  

+            $log_on= 0;

+            print FILE_LOG "\n";

+         }

+      }

+   

+   }

+  

+   close FILE_IN;

+   close FILE_OUT;

+   

+   return $file_bak;

+}

+

+#-------------------------------------------------------------------

+

+sub print_error_info_die

+{

+   my $error_info = $_[0];

+   print FILE_LOG $error_info;

+   print STDERR   $error_info;

+   exit(1);

+  

+}

+

+#-------------------------------------------------------------------
\ No newline at end of file