[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/cfgGen_EMI.pl b/mcu/tools/cfgGen_EMI.pl
new file mode 100644
index 0000000..9b113be
--- /dev/null
+++ b/mcu/tools/cfgGen_EMI.pl
@@ -0,0 +1,526 @@
+#!/usr/bin/perl
+#
+# Copyright Statement:
+# --------------------
+# This software is protected by Copyright and the information contained
+# herein is confidential. The software may not be copied and the information
+# contained herein may not be used or disclosed except with the written
+# permission of MediaTek Inc. (C) 2006
+#
+# BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+# NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+# SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+# BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+# LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+# THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+# WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+# LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+# RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+# THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#* cfgGen_EMI.pl
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#* This script generates EMI part in the CFG file for flash tool for SV5
+#*
+#* Author:
+#* -------
+#* Marvin Lin (mtk03483)
+#*
+#*============================================================================
+#* HISTORY
+#* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+#*------------------------------------------------------------------------------
+#* $Revision$
+#* $Modtime$
+#* $Log$
+#*
+#* 05 22 2014 tafang.chen
+#* [MOLY00062786] [UMOLY][SM]
+#* Initial MoDIS build env - fix path problem.
+#*
+#* 08 23 2013 guo-huei.chang
+#* [MOLY00034592] [MT6290][Combo Memory Support] Enable Combo Memory Feature
+#* 1. Update Memory Device List for MT6290(m)
+#* 2. Update/re-arch cfggen
+#* 3. Update/re-arch emigen
+#* 4. remove emigen/cfggen legacy
+#* 5. Add combo memory supporting
+#* 6. auto-generate all header files that emigen related
+#*
+#* 04 16 2013 guo-huei.chang
+#* [MOLY00013409] [MT6290 Bring-up] DRAMC/EMI related Code Update
+#* 1. update emigen to auto-gen all header files
+#* 2. update init mempll
+#* 3. update cfggen
+#*
+#* 03 22 2013 guo-huei.chang
+#* [MOLY00012511] update auto-k for MT6290 FPGA, MT6290 EVB, and MT6290M EVB
+#* 1. add custom folder for MT6290M
+#* 2. update custom_EMI.h and custom_EMI_release.h with emigen
+#* 3. update custom_EMI_INFO.h with manual check in
+#* 4. update cfggen
+#*
+#* 03 19 2013 guo-huei.chang
+#* [MOLY00011607] update custom_EMI function and cfggen EMI part
+#* integrate CBr that update emigen and cfggen
+#*
+#* 03 08 2013 guo-huei.chang
+#* [MOLY00011607] update custom_EMI function and cfggen EMI part
+#* update custom_EMI function into custom_EMI_MT6290.c and remove it in devdrv_fakeapi.c
+#* update cfgGen_EMI.pl for MT6290
+#*
+#* 08 16 2012 marvin.lin
+#* [MOLY00002193] [MemoryStorage][Auto-Gen][EMI Gen/CFG Gen][Request For Design Change] support MT6280 combo memory
+#* .
+#*
+#*
+#*------------------------------------------------------------------------------
+#* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+#*============================================================================
+#****************************************************************************/
+
+#****************************************************************************
+# Included Modules
+#****************************************************************************
+use strict;
+use warnings;
+no warnings 'redefine';
+# auto flush print function
+local $| = 1;
+
+#****************************************************************************
+# Constants
+#****************************************************************************
+my $CFGGEN_EMI_VERNO = " V0.03";
+ # v0.03 , Fix compile error when $PLATFORM is not found
+ # v0.02 , Support MT6255 SF+DDR or DISCRETE_NAND case
+ # v0.01 , Fix unable to pre-compie custom_EMI_MT6256.c when make new issue
+ # v0.00 , initial version
+
+#****************************************************************************
+# Input Parameters and Global Variables
+#****************************************************************************
+my $DebugPrint = 0;
+
+#****************************************************************************
+# subroutine: get_mem_dev_h_value
+# input: $str_BB_path: BB folder path
+# input: $href_mem_dev: reference of hash of custom_MemoryDevice.h configurations
+#****************************************************************************
+sub get_mem_dev_h_value
+{
+ my ($str_BB_path, $href_makefile_options) = @_;
+ my %mem_dev_options;
+ my $CUSTOM_MEM_DEV_H = $str_BB_path . "\/custom_MemoryDevice.h";
+
+ open (MEMDEVH_HANDLE, "<$CUSTOM_MEM_DEV_H") or &error_handler("$CUSTOM_MEM_DEV_H: file error!", __FILE__, __LINE__);
+ while (<MEMDEVH_HANDLE>) {
+ if (/^#define\s+(\w+)\s+\((\w*)\)/ || /^#define\s+(\w+)\s+(\w*)/)
+ {
+ my $option = $1;
+ my $value = $2;
+
+ &error_handler("$CUSTOM_MEM_DEV_H: $option redefined in custom_MemoryDevice.h!", __FILE__, __LINE__) if defined($mem_dev_options{$option});
+ if ((!defined $value) or ($value eq ''))
+ {
+ $mem_dev_options{$option} = 'TRUE';
+ }
+ else
+ {
+ $mem_dev_options{$option} = $value;
+ }
+ }
+ }
+ if ((!defined $href_makefile_options->{'combo_memory_support'}) or ($href_makefile_options->{'combo_memory_support'} eq 'FALSE'))
+ {
+ $mem_dev_options{COMBO_MEM_ENTRY_COUNT} = 1;
+ }
+
+ close (MEMDEVH_HANDLE);
+
+ return %mem_dev_options;
+}
+
+#****************************************************************************
+# subroutine: error_handler
+# input: $error_msg: error message
+#****************************************************************************
+sub error_handler
+{
+ my ($error_msg, $file, $line_no) = @_;
+
+ my $final_error_msg = "CFGGEN ERROR: $error_msg at $file line $line_no\n";
+ print $final_error_msg;
+ die $final_error_msg;
+}
+
+#****************************************************************************
+# subroutine: get_emi_settings
+# return: EMI settings
+#****************************************************************************
+sub get_emi_settings
+{
+ my ($str_BB_path, $bb, $cc_cmd, $via_cmd, $option_tmp_file, $custom_emi_temp_local, $href_MAKEFILE_OPTIONS, $href_mem_dev_options) = @_;
+ my @emi_settings;
+
+ ### Pre-compile custom_EMI.c
+ my ($custom_EMI_c_file);
+ my $custom_emi_command;
+ $custom_EMI_c_file = ".\/pcore\/custom\/driver\/common\/custom_EMI_" . $bb . ".c";
+
+ print "custom_EMI.c = $custom_EMI_c_file\n";
+ $custom_emi_command = "$cc_cmd $via_cmd$option_tmp_file -E $custom_EMI_c_file > " . $custom_emi_temp_local . "\/" . "~custom_EMI_c.tmp";
+ print "$custom_emi_command\n";
+
+ my $status = system($custom_emi_command);
+ &error_handler("\/pcore\/tools\/cfgGen_EMI.pl: pre-compile $custom_EMI_c_file erro!", __FILE__, __LINE__) if ($status != 0);
+
+ ### Get Memory Type
+ my ($emi_clk, $emi_dev_type, $memory_type);
+ my $CUSTOM_EMI_RELEASE_H;
+ $CUSTOM_EMI_RELEASE_H = $str_BB_path . "\/custom_EMI_release.h";
+
+ open (CUSTOM_EMI_RELEASE_H, "<$CUSTOM_EMI_RELEASE_H") or &error_handler("$CUSTOM_EMI_RELEASE_H: file error!", __FILE__, __LINE__);
+ while (<CUSTOM_EMI_RELEASE_H>)
+ {
+ if (/#define __EMI_CLK_(\d+)MHZ__/)
+ {
+ $emi_clk = $1;
+ }
+ elsif (/#define __EMI_DEVICE_(\w+)__/)
+ {
+ $emi_dev_type = $1;
+ }
+ }
+ close CUSTOM_EMI_RELEASE_H;
+ if($href_MAKEFILE_OPTIONS->{'sip_ram_size'} ne "NONE")
+ {
+ $memory_type = "SIP_";
+ }
+ $memory_type .= $emi_dev_type . "_" . $emi_clk . "MHZ";
+
+ ### Read EMI settings from ~custom_EMI_c.tmp
+ my $file_content;
+ my $custom_emi_path;
+ $custom_emi_path = "<" . $custom_emi_temp_local . "\/~custom_EMI_c.tmp";
+
+ print "path:$custom_emi_path\n";
+ open (CUSTOM_EMI_C_TMP, $custom_emi_path) or &error_handler("~custom_EMI_c.tmp: file error!", __FILE__, __LINE__);
+ {
+ local $/;
+ $file_content = <CUSTOM_EMI_C_TMP>;
+ }
+ close CUSTOM_EMI_C_TMP;
+
+ ### Get EMI_INFO type declaration
+ my $EMI_INFO_decl_str;
+ my %EMI_INFO_decl_hash; # key: EMI register; value: index
+ my $EMI_INFO_decl_count = 0;
+ if ($file_content =~ /typedef\s*struct\s*\{([\S|\s]+?)\}\s*MTK_EMI_Info/)
+ {
+ $EMI_INFO_decl_str = $1;
+ }
+ while ($EMI_INFO_decl_str =~ /\{/) # Skip all other contents between the beginning { and the real EMI info
+ {
+ $EMI_INFO_decl_str = $';
+ }
+ while ($EMI_INFO_decl_str =~ /unsigned int (\w+)\;/)
+ {
+ $EMI_INFO_decl_hash{$1} = $EMI_INFO_decl_count;
+ $EMI_INFO_decl_count++;
+ $EMI_INFO_decl_str = $';
+ }
+ print "EMI_INFO_decl_hash:\n" if ($DebugPrint == 1);
+ foreach my $idx (keys %EMI_INFO_decl_hash)
+ {
+ print "$idx\n" if ($DebugPrint == 1);
+ }
+
+ ### Trim EMI Info contents string
+ my $EMI_INFO_value_str;
+ if ($file_content =~ /MTK_EMI_Info\s*EMI_INFO\[\]\s*\=\s*\{([\s|\S]+?)\}\;/)
+ {
+ $EMI_INFO_value_str = $1;
+ }
+ $EMI_INFO_value_str =~ s/\s//g; # EMI_INFO_value_str becomes {EMI_INFO set 1},{EMI_INFO set 2},......,{EMI_INFO set n}
+
+ my @EMI_INFO_value_array;
+ @EMI_INFO_value_array = split(/},{/,$EMI_INFO_value_str);
+
+ for my $idx (0..$#EMI_INFO_value_array)
+ {
+ $EMI_INFO_value_array[$idx] =~ s/^,//; # Remove the beginning ,
+ $EMI_INFO_value_array[$idx] =~ s/^{//; # Remove the beginning {
+ $EMI_INFO_value_array[$idx] =~ s/,$//; # Remove the last ,
+ $EMI_INFO_value_array[$idx] =~ s/,}$//; # Remove the last ,}
+ print "\$EMI_INFO_value_array[$idx]:\n$EMI_INFO_value_array[$idx]\n" if ($DebugPrint == 1);
+ }
+
+ for my $combo_idx (1..$href_mem_dev_options->{COMBO_MEM_ENTRY_COUNT})
+ {
+ ### Get EMI Info contents
+ my %cur_emi_info_value_list;
+ foreach (split(/,/, $EMI_INFO_value_array[$combo_idx-1]))
+ {
+ if ((/\.(\w+)=\((0x[\w]{1,8})\)/) or (/\.(\w+)=(0x[\w]{1,8})/))
+ {
+ $cur_emi_info_value_list{$1} = $2;
+ }
+ }
+ $emi_settings[$combo_idx] = <<"__TEMPLATE";
+ memory_type: $memory_type
+ EMI_Setting:
+__TEMPLATE
+ foreach my $key (sort keys %cur_emi_info_value_list)
+ {
+ if ($key =~ /(\w+)_val/)
+ {
+ $emi_settings[$combo_idx] .= " " . uc($1) . ": " . $cur_emi_info_value_list{$key} . "\n";
+ }
+ else
+ {
+ $emi_settings[$combo_idx] .= " " . uc($key) . ": " . $cur_emi_info_value_list{$key} . "\n";
+ }
+ }
+ print "combo_mem_idx:$combo_idx\n" if ($DebugPrint == 1);
+ print "$emi_settings[$combo_idx]\n" if ($DebugPrint == 1);
+ }
+
+ return @emi_settings;
+}
+
+#****************************************************************************
+# subroutine: get_flash_settings
+# return: Flash settings
+#****************************************************************************
+sub get_flash_settings
+{
+ my ($str_BB_path, $bb, $cc_cmd, $via_cmd, $option_tmp_file, $custom_emi_temp_local, $href_MAKEFILE_OPTIONS, $href_mem_dev_options) = @_;
+ my @flash_settings;
+
+ ### Read flash ID from combo_flash_id.h
+ my (@flash_id_str_list, @flash_id, @valid_id_length_list);
+ my $flash_id_template;
+ my $decide_flash_type = "NAND";
+ my $mcp_count = 0;
+ my $COMBO_FLASH_ID_H;
+ $COMBO_FLASH_ID_H = $str_BB_path . "\/combo_flash_id.h";
+
+ open (COMBO_FLASH_ID_H, "<$COMBO_FLASH_ID_H") or &error_handler("$COMBO_FLASH_ID_H: file error!", __FILE__, __LINE__);
+ while (<COMBO_FLASH_ID_H>)
+ {
+ if (/\s+(\d+),\s*\/\/\s*Valid\s+ID\s+length/)
+ {
+ $valid_id_length_list[$mcp_count] = $1;
+ }
+ elsif (/\s+\{(.+)\}\s*\/\/\s*Flash\s+ID/)
+ {
+ $flash_id_str_list[$mcp_count] = $1;
+ ##$mcp_count++;
+ if($href_MAKEFILE_OPTIONS->{'serial_flash_support'} eq 'TRUE')##SF align with NAND, restruct 16bit type ID string
+ {
+ $flash_id_template = undef;
+ $decide_flash_type = "SF";
+ $flash_id_str_list[$mcp_count] =~ s/\{//;
+ $flash_id_str_list[$mcp_count] =~ s/\}//;
+ $flash_id_str_list[$mcp_count] =~ s/\s+//g;
+ print "Before restruct id string is : $flash_id_str_list[$mcp_count]\n";
+ @flash_id = split /\,/, $flash_id_str_list[$mcp_count];
+ my $cur_flash_id = "0xFFFF";
+ for (0..7) # there are totally 8 flash ID
+ {
+ $cur_flash_id = sprintf("0x%04X", hex($flash_id[$_]));
+ print "cur_flash_id is : $cur_flash_id\n";
+ if(7 == $_)
+ {
+ $flash_id_template .= "$cur_flash_id\n";
+ ###$block_info_lines .= " \{$tmp_start, $tmp_size\},\n";
+ }
+ else
+ {
+ $flash_id_template .= "$cur_flash_id, \n";
+ }
+ print "After restruct template id string is : $flash_id_template\n";
+ chomp($flash_id_template);
+ }
+ $flash_id_str_list[$mcp_count] = $flash_id_template;
+ print "After restruct id string is : $flash_id_template\n";
+ }
+ $mcp_count++;
+ }
+ }
+ close COMBO_FLASH_ID_H;
+
+
+ #Parse combo_nfi_config.h to gen NAND Parameters for Flashtool Download
+ my @combo_nfi_info_struct;
+ if($href_MAKEFILE_OPTIONS->{'nand_support'} eq 'TRUE')
+ {
+ my $COMBO_FLASH_CONFIG_H;##NAND Flash Config File
+ $COMBO_FLASH_CONFIG_H = $str_BB_path . "\/combo_nfi_config.h";
+
+ my $combo_flash_idx = -1;
+ print "$COMBO_FLASH_CONFIG_H\n";
+ open (COMBO_FLASH_CONFIG_H, "<$COMBO_FLASH_CONFIG_H") or &error_handler("$COMBO_FLASH_CONFIG_H: file error!", __FILE__, __LINE__);
+ while (<COMBO_FLASH_CONFIG_H>)
+ {
+ if (/\s*0x(\w+),\s*\/\/\s*NFI_(\w+)_(\w+)/)
+ {
+ #print "1-[$combo_flash_idx]: $1, $2, $3\n";
+ $combo_nfi_info_struct[$combo_flash_idx] .= "\n " ."NFI_" ."$2_" . "$3" .": " ."0x$1";
+ }
+ elsif (/\s*(\w+),\s*\/\/\s*NFI_(\w+)_(\w+)/)
+ {
+ #print "2-[$combo_flash_idx]: $1, $2, $3\n";
+ $combo_nfi_info_struct[$combo_flash_idx] .= "\n " ."NFI_" ."$2_" . "$3" .": " ."$1";
+ }
+ elsif (/\s*\{(.+)\},\s*\/\/\s*NFI_(\w+)_(\w+)/)
+ {
+ #print "3-[$combo_flash_idx]: $1, $2, $3\n";
+ if($2 eq 'BB')
+ {
+ $combo_nfi_info_struct[$combo_flash_idx] .= "\n " ."NFI_" ."$2_" . "$3" .": " ."[$1]";
+ }
+ else
+ {
+ $combo_flash_idx++;#to calculate combo idx
+ $combo_nfi_info_struct[$combo_flash_idx] .= "\n " ."NFI_" ."$2_" . "$3" .": " ."$1";#NFI_DeviceName is the first parse line of combo flash
+ }
+ }
+ }
+ }
+
+ for (0..($mcp_count-1))
+ {
+ my $combo_idx = $_ + 1;
+
+
+ $flash_settings[$combo_idx] .= <<"__TEMPLATE";
+ - flash_info:
+ flash_type: $decide_flash_type
+ id_length: $valid_id_length_list[$_]
+__TEMPLATE
+ if (defined $combo_nfi_info_struct[$_])
+ {
+ $flash_settings[$combo_idx] .= <<"__TEMPLATE";
+ flash_id: [$flash_id_str_list[$_]]$combo_nfi_info_struct[$_]
+__TEMPLATE
+ }
+ else
+ {
+ $flash_settings[$combo_idx] .= <<"__TEMPLATE";
+ flash_id: [$flash_id_str_list[$_]]
+__TEMPLATE
+ }
+ }
+
+ return @flash_settings;
+}
+
+#****************************************************************************
+# subroutine: gen_external_memory_setting
+# input: $str_BB_path: BB folder path
+# return: External Memory Setting
+#****************************************************************************
+sub gen_external_memory_setting
+{
+ my ($str_BB_path, $str_board_ver, $bb, $cc_cmd, $via_cmd, $option_tmp_file, $custom_emi_temp_local, $href_MAKEFILE_OPTIONS) = @_;
+ my (@emi_settings, @flash_settings);
+ my %custom_mem_dev_options;
+
+ %custom_mem_dev_options = &get_mem_dev_h_value($str_BB_path, $href_MAKEFILE_OPTIONS);
+
+ ### Generate EMI settings from CFG file for chips which do not support Auto-Gen
+ if (($bb ne 'MT6276') and ($bb ne 'MT6256') and ($bb ne 'MT6255') and ($bb ne 'MT6280') and ($bb ne 'MT6290'))
+ {
+ my $EMI_CFG_FILE;
+ $EMI_CFG_FILE = $str_BB_path . "\/" . $str_board_ver . "\.cfg";
+
+ open (EMI_CFG_FILE, "<$EMI_CFG_FILE") or &error_handler("$EMI_CFG_FILE: file error!", __FILE__, __LINE__);
+ my $saved_sep = $/;
+ undef $/;
+ my $emi_cfg_file_content = <EMI_CFG_FILE>;
+ close EMI_CFG_FILE;
+ $/ = $saved_sep;
+ my $template = <<"__TEMPLATE";
+############################################################################################################
+#
+# External Memory Setting
+#
+############################################################################################################
+
+$emi_cfg_file_content
+
+__TEMPLATE
+
+ return $template;
+ }
+
+ @emi_settings = &get_emi_settings($str_BB_path, $bb, $cc_cmd, $via_cmd, $option_tmp_file, $custom_emi_temp_local, $href_MAKEFILE_OPTIONS, \%custom_mem_dev_options);
+ @flash_settings = &get_flash_settings($str_BB_path, $bb, $cc_cmd, $via_cmd, $option_tmp_file, $custom_emi_temp_local, $href_MAKEFILE_OPTIONS, \%custom_mem_dev_options);
+
+ ###
+ my $combo_mem_param;
+ for my $combo_idx (1..$custom_mem_dev_options{COMBO_MEM_ENTRY_COUNT})
+ {
+ $combo_mem_param .= <<"__TEMPLATE";
+ # EMI $combo_idx
+$flash_settings[$combo_idx]
+$emi_settings[$combo_idx]
+__TEMPLATE
+ }
+
+ my $para_ver;
+ if($bb eq 'MT6290')
+ {
+ $para_ver = "v3.1";
+ }
+ elsif($bb eq 'MT6280')
+ {
+ $para_ver = "v2";
+ }
+ else
+ {
+ $para_ver = "v1";
+ }
+
+ my $template = <<"__TEMPLATE";
+############################################################################################################
+#
+# External Memory Setting
+#
+############################################################################################################
+
+external_memory:
+ parameters_version: $para_ver
+ PMIC: $href_MAKEFILE_OPTIONS->{'pmic'}
+ parameters:
+$combo_mem_param
+__TEMPLATE
+}
+
+return 1;