[Feature]Upload Modem source code

Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/tools/emigenemi.pl b/mcu/tools/emigenemi.pl
new file mode 100644
index 0000000..42340d5
--- /dev/null
+++ b/mcu/tools/emigenemi.pl
@@ -0,0 +1,386 @@
+#!/usr/bin/perl

+

+my $DebugPrint    = 0;

+

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

+# subroutine:  custom_EMI_release_h_file_body

+# return:      

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

+sub custom_EMI_release_h_file_body

+{

+    my ($CUSTOM_MEM_DEV_OPTIONS_LOCAL, $COMM_MDL_INFO_LOCAL, $emi_clk_config_LOCAL, $cus_include, $cus_def, $cus_enum, $cus_struct, $cus_api) = @_;

+    my $emi_clk_str;

+    my $emi_device_mode;

+

+    if (($CUSTOM_MEM_DEV_OPTIONS_LOCAL->{FLASH_ACCESS_TYPE} eq 'SYNC_ACCESS') && ($CUSTOM_MEM_DEV_OPTIONS_LOCAL->{RAM_ACCESS_TYPE} eq 'SYNC_ACCESS'))

+    {

+        $emi_clk_str = sprintf("#define __EMI_CLK_%sMHZ__", $emi_clk_config_LOCAL);

+        if ($emi_clk_str =~ /\./)

+        {

+            $emi_clk_str =~ s/\./_/;

+        }

+    }

+    if ($CUSTOM_MEM_DEV_OPTIONS_LOCAL->{MEMORY_DEVICE_TYPE} =~ /LPDDR2/)

+    {

+        $emi_device_mode = "#define __EMI_DEVICE_LPDDR2__\n#define __EMI_MODE_2X__";

+    }

+    elsif ($CUSTOM_MEM_DEV_OPTIONS_LOCAL->{MEMORY_DEVICE_TYPE} =~ /LPDDR/)

+    {

+        $emi_device_mode = "#define __EMI_DEVICE_LPDDR1__\n#define __EMI_MODE_1X__";

+    }

+    else

+    {

+        &error_handler("MEMORY_DEVICE_TYPE:$CUSTOM_MEM_DEV_OPTIONS_LOCAL->{MEMORY_DEVICE_TYPE} didn't support yet!", __FILE__, __LINE__);

+    }

+

+    print "MDL info:$COMM_MDL_INFO_LOCAL->{1}->{'Size (Mb)'}\n" if ($DebugPrint == 1);

+

+    my $template = <<"__TEMPLATE";

+#ifndef __CUSTOM_EMI_RELEASE_H__

+#define __CUSTOM_EMI_RELEASE_H__

+/********************************************

+ * Include.

+ ********************************************/

+#include "kal_general_types.h"

+$cus_include

+/********************************************

+ * Definition.

+ ********************************************/

+/**

+  * Define EMI's clock rate.

+  * comes from EMI_CLK definition in custom_MemoryDevice.h, or highest freq in MDL 

+  */

+$emi_clk_str

+

+/**

+  * Define memory's mode.

+  */

+$emi_device_mode

+

+/**

+  * Define RAM size in Bytes.

+  */

+#define EMI_EXTSRAM_SIZE ((($COMM_MDL_INFO_LOCAL->{1}->{'Size (Mb)'})>>3)<<20)

+$cus_def

+/********************************************

+ * Enum.

+ ********************************************/

+$cus_enum

+/********************************************

+ * Struct.

+ ********************************************/

+$cus_struct

+/********************************************

+ * Exposed APIs.

+ ********************************************/

+$cus_api

+#endif /* __CUSTOM_EMI_RELEASE_H__ */

+

+__TEMPLATE

+

+    return $template;

+}

+

+

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

+# subroutine:  custom_EMI_release_h_90_file_body

+# return:      

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

+sub custom_EMI_release_h_90_file_body

+{

+    my ($MAKEFILE_OPTIONS_LOCAL, $CUSTOM_MEM_DEV_OPTIONS_LOCAL, $MDL_INFO_LIST_LOCAL, $COMM_MDL_INFO_LOCAL, $LPSDRAM_CHIP_SELECT_LOCAL, $emi_clk_config_LOCAL) = @_;

+    my ($cus_include, $cus_def, $cus_enum, $cus_struct, $cus_api);

+

+    return &custom_EMI_release_h_file_body($CUSTOM_MEM_DEV_OPTIONS_LOCAL, $COMM_MDL_INFO_LOCAL, $emi_clk_config_LOCAL, $cus_include, $cus_def, $cus_enum, $cus_struct, $cus_api);

+}

+

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

+# subroutine:  custom_EMI_h_file_body

+# return:      

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

+sub custom_EMI_h_file_body

+{

+    ### EMI register value for each MCP

+    my ($MAKEFILE_OPTIONS_LOCAL, $CUSTOM_MEM_DEV_OPTIONS_LOCAL, $MDL_INFO_LIST_LOCAL, $cus_include, $cus_def, $cus_enum, $cus_struct, $cus_api) = @_;

+    my ($combo_mem_emi_reg, $combo_mem_emi_reg_clk);

+    my $emi_reg_bb_key_ref;

+    my $clk, $first_parse_clk;

+    my $mtk_emi_info;

+    

+    for (1..$CUSTOM_MEM_DEV_OPTIONS_LOCAL->{COMBO_MEM_ENTRY_COUNT})

+    {

+        my $combo_idx = $_ - 1;

+        my $def_pre = undef;

+        undef $mtk_emi_info;

+        undef $first_parse_clk;

+

+        $combo_mem_emi_reg .= <<"__TEMPLATE";

+/*

+ * EMI register value definition

+ * EMI/MEM configuration information of MCP$combo_idx

+ */

+__TEMPLATE

+        $def_pre = "#define DRAM_VENDOR_MCP$combo_idx";

+        $combo_mem_emi_reg .= $def_pre;

+        $combo_mem_emi_reg .= " " x (47 - length($def_pre));

+        $combo_mem_emi_reg .= " (\"$MDL_INFO_LIST_LOCAL->[$_]->{0}->{'Vendor'}\")\n";

+        $def_pre = "#define DRAM_PART_NUMBER_MCP$combo_idx";

+        $combo_mem_emi_reg .= $def_pre;

+        $combo_mem_emi_reg .= " " x (47 - length($def_pre));

+        $combo_mem_emi_reg .= " (\"$MDL_INFO_LIST_LOCAL->[$_]->{0}->{'Part Number'}\")\n";

+        my $emi_reg_bb_key_ref = $MDL_INFO_LIST_LOCAL->[$_]->{0}->{$MAKEFILE_OPTIONS_LOCAL->{'platform'}};

+        foreach my $emi_key (sort keys %{$emi_reg_bb_key_ref})

+        {

+            if ($emi_key =~ /(\d+)MHZ EMI Driving/)

+            {

+                $clk = $1;

+                if (! defined $first_parse_clk)

+                {

+                    $first_parse_clk = $clk;

+                }

+                if (! defined $combo_mem_emi_reg_clk)

+                {

+                    $combo_mem_emi_reg_clk = "#if defined(__EMI_CLK_$clk\MHZ__)\n";

+                }

+                else

+                {

+                    $combo_mem_emi_reg_clk .= "#elif defined(__EMI_CLK_$clk\MHZ__)\n";

+                }

+                my $emi_clk_dri = $emi_key;

+                foreach my $emi_key (sort keys %{$emi_reg_bb_key_ref->{$emi_clk_dri}})

+                {

+                    my $val = $emi_reg_bb_key_ref->{$emi_clk_dri}->{$emi_key};

+                    if (($val ne 'x') && ($val ne 'X') && ($val ne ''))

+                    {

+                        $def_pre = "#define $emi_key\_MCP$combo_idx";

+                        $combo_mem_emi_reg_clk .= $def_pre;

+                        # for alignment

+                        $combo_mem_emi_reg_clk .= " " x (47 - length($def_pre));

+                        $combo_mem_emi_reg_clk .= " ($val)\n";

+                    }

+

+                    if ($first_parse_clk == $clk)

+                    {

+                        $mtk_emi_info .= "    unsigned int " . lc($emi_key) . ";\n";

+                    }

+                }

+            }

+            else

+            {

+                my $val = $emi_reg_bb_key_ref->{$emi_key};

+                $def_pre = "#define $emi_key\_MCP$combo_idx";

+                if (($val ne 'x') && ($val ne 'X') && ($val ne ''))

+                {

+                    $combo_mem_emi_reg .= $def_pre;

+                    # for alignment

+                    $combo_mem_emi_reg .= " " x (47 - length($def_pre));

+                    $combo_mem_emi_reg .= " ($val)\n";

+                }

+                $mtk_emi_info .= "    unsigned int " . lc($emi_key) . ";\n";

+            }

+        }

+        $combo_mem_emi_reg_clk .= "#endif /* __EMI_CLK_$clk\MHZ__ */\n";

+

+        $combo_mem_emi_reg .= <<"__TEMPLATE";

+

+$combo_mem_emi_reg_clk

+/*

+ * End of EMI/MEM configuration information of MCP$combo_idx

+ */

+__TEMPLATE

+

+        undef $combo_mem_emi_reg_clk;

+    }

+

+    my $template = <<"__TEMPLATE";

+#ifndef __CUSTOM_EMI_H__

+#define __CUSTOM_EMI_H__

+/********************************************

+ * Include.

+ ********************************************/

+$cus_include

+/********************************************

+ * Definition.

+ ********************************************/

+$combo_mem_emi_reg

+$cus_def

+/********************************************

+ * Enum.

+ ********************************************/

+typedef enum {

+    DRAMType_Invalid = 0x0,

+    DRAMType_DDR,

+    DRAMType_DDR2,

+    DRAMType_DDR_166M,

+    DRAMType_DDR_200M,

+    DRAMType_DDR2_166M,

+    DRAMType_DDR2_200M,

+    DRAMType_LPDDR = 0x800,

+    DRAMType_LPDDR2,

+    DRAMType_LPDDR_166M,

+    DRAMType_LPDDR_200M,

+    DRAMType_LPDDR2_166M,

+    DRAMType_LPDDR2_200M,

+    DRAMType_DDR_166M_SIP = 0x1000,

+    DRAMType_DDR_200M_SIP,

+    DRAMType_DDR2_166M_SIP,

+    DRAMType_DDR2_200M_SIP,

+    DRAMType_LPDDR_SIP = 0x1800,

+    DRAMType_LPDDR2_SIP,

+    DRAMType_LPDDR_166M_SIP,

+    DRAMType_LPDDR_200M_SIP,

+    DRAMType_LPDDR2_166M_SIP,

+    DRAMType_LPDDR2_200M_SIP,

+    DRAMType_End = 0x42424242

+} DRAMType;

+$cus_enum

+/********************************************

+ * Struct.

+ ********************************************/

+typedef struct {

+    DRAMType ramType;

+$mtk_emi_info} MTK_EMI_Info;

+$cus_struct

+/********************************************

+ * Exposed APIs.

+ ********************************************/

+$cus_api

+#endif /* end of __CUSTOM_EMI_H__ */

+__TEMPLATE

+

+    return $template;

+}

+

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

+# subroutine:  custom_EMI_h_90_file_body

+# return:      

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

+sub custom_EMI_h_90_file_body

+{

+    my ($MAKEFILE_OPTIONS_LOCAL, $CUSTOM_MEM_DEV_OPTIONS_LOCAL, $MDL_INFO_LIST_LOCAL, $COMM_MDL_INFO_LOCAL, $PART_NUMBER_LOCAL, $CUSTOM_MEMORY_DEVICE_HDR_LOCAL, $LPSDRAM_CHIP_SELECT_LOCAL, $emi_clk_config_LOCAL, $emi_nor_cmd_num_max_LOCAL, $emi_psram_cmd_num_max_LOCAL, $MCP_LIST_LOCAL) = @_;

+    my ($cus_include, $cus_def, $cus_enum, $cus_struct, $cus_api);

+

+    $cus_def = <<"__TEMPLATE";

+/* Initial EMI Definition */

+#define USE_DUAL_RANK_DDR

+#define DRAM_START          (0x00000000)

+

+#define MAX_DQ_DATA_WIDTH   (32)

+

+#define DQ_NUMBER_PER_DQS   (8)

+#define DQS_NUMBER          (dq_data_width / DQ_NUMBER_PER_DQS)

+#define TX_STEPS            (8)   // This value is obtained by measurement of waveform for the relationship between DQS and CLK.

+__TEMPLATE

+

+    $cus_api = <<"__TEMPLATE";

+kal_int8 custom_InitDRAM(void);

+__TEMPLATE

+

+    return &custom_EMI_h_file_body($MAKEFILE_OPTIONS_LOCAL, $CUSTOM_MEM_DEV_OPTIONS_LOCAL, $MDL_INFO_LIST_LOCAL, $cus_include, $cus_def, $cus_enum, $cus_struct, $cus_api);

+}

+

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

+# subroutine:  custom_EMI_info_h_file_body

+# return:      

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

+sub custom_EMI_info_h_file_body

+{

+    my ($MAKEFILE_OPTIONS_LOCAL, $CUSTOM_MEM_DEV_OPTIONS_LOCAL, $MDL_INFO_LIST_LOCAL, $emi_clk_config_LOCAL, $cus_include, $cus_def, $cus_enum, $cus_struct, $cus_api) = @_;

+    my $combo_mem_emi_info_struct;

+    my $combo_mem_emi_type;

+

+    $combo_mem_emi_type = "DRAMType_";

+    if ($CUSTOM_MEM_DEV_OPTIONS_LOCAL->{MEMORY_DEVICE_TYPE} =~ /[A-Za-z]*DDR[0-9]*/)

+    {

+        $combo_mem_emi_type .= $&;

+    }

+    if (($CUSTOM_MEM_DEV_OPTIONS_LOCAL->{FLASH_ACCESS_TYPE} eq 'SYNC_ACCESS') && ($CUSTOM_MEM_DEV_OPTIONS_LOCAL->{RAM_ACCESS_TYPE} eq 'SYNC_ACCESS'))

+    {

+        $combo_mem_emi_type .= sprintf("_%sM", $emi_clk_config_LOCAL);

+    }

+    if ($MAKEFILE_OPTIONS_LOCAL->{'sip_ram_size'} ne "NONE") {

+        $combo_mem_emi_type .= "_SIP";       

+    }

+    for (1..$CUSTOM_MEM_DEV_OPTIONS_LOCAL->{COMBO_MEM_ENTRY_COUNT})

+    {

+        my $combo_idx = $_ - 1;

+        $combo_mem_emi_info_struct .= <<"__TEMPLATE";

+    {

+        .ramType = $combo_mem_emi_type,

+__TEMPLATE

+        my $emi_reg_bb_key_ref = $MDL_INFO_LIST_LOCAL->[$_]->{0}->{$MAKEFILE_OPTIONS_LOCAL->{'platform'}};

+        foreach my $emi_key (sort keys %{$emi_reg_bb_key_ref})

+        {

+            if ($emi_key =~ /(\d+)MHZ EMI Driving/)

+            {

+                my $emi_clk_dri = $emi_key;

+                foreach my $emi_key (sort keys %{$emi_reg_bb_key_ref->{$emi_clk_dri}})

+                {

+                    my $val = $emi_reg_bb_key_ref->{$emi_clk_dri}->{$emi_key};

+                    if (($val ne 'x') && ($val ne 'X') && ($val ne ''))

+                    {

+                        my $emi_info_def = "$emi_key\_MCP$combo_idx";

+                        $combo_mem_emi_info_struct .= "        ." . lc($emi_key) . " = " . $emi_info_def . ",\n";

+                    }

+                }

+            }

+            else

+            {

+                my $val = $emi_reg_bb_key_ref->{$emi_key};

+                if (($val ne 'x') && ($val ne 'X') && ($val ne ''))

+                {

+                    my $emi_info_def = "$emi_key\_MCP$combo_idx";

+                    $combo_mem_emi_info_struct .= "        ." . lc($emi_key) . " = " . $emi_info_def . ",\n";

+                }

+            }

+        }

+        $combo_mem_emi_info_struct .= "    },\n";

+    }

+    my $template = <<"__TEMPLATE";

+#ifndef __CUSTOM_EMI_INFO_H__

+#define __CUSTOM_EMI_INFO_H__

+/********************************************

+ * Include.

+ ********************************************/

+#include "custom_EMI_release.h"

+#include "custom_EMI.h"

+$cus_include

+/********************************************

+ * Definition.

+ ********************************************/

+$cus_def

+/********************************************

+ * Enum.

+ ********************************************/

+$cus_enum

+/********************************************

+ * Struct.

+ ********************************************/

+MTK_EMI_Info EMI_INFO[] = {

+$combo_mem_emi_info_struct

+}; /* End of EMI_INFO struct */

+$cus_struct

+/********************************************

+ * Exposed APIs.

+ ********************************************/

+$cus_api

+

+#endif /* __CUSTOM_EMI_INFO_H__ */

+__TEMPLATE

+

+    return $template;

+}

+

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

+# subroutine:  custom_EMI_info_h_90_file_body

+# return:      

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

+sub custom_EMI_info_h_90_file_body

+{

+    my ($MAKEFILE_OPTIONS_LOCAL, $CUSTOM_MEM_DEV_OPTIONS_LOCAL, $MDL_INFO_LIST_LOCAL, $COMM_MDL_INFO_LOCAL, $PART_NUMBER_LOCAL, $CUSTOM_MEMORY_DEVICE_HDR_LOCAL, $LPSDRAM_CHIP_SELECT_LOCAL, $emi_clk_config_LOCAL, $emi_nor_cmd_num_max_LOCAL, $emi_psram_cmd_num_max_LOCAL) = @_;

+    my ($cus_include, $cus_def, $cus_enum, $cus_struct, $cus_api);

+

+    return &custom_EMI_info_h_file_body($MAKEFILE_OPTIONS_LOCAL, $CUSTOM_MEM_DEV_OPTIONS_LOCAL, $MDL_INFO_LIST_LOCAL, $emi_clk_config_LOCAL, $cus_include, $cus_def, $cus_enum, $cus_struct, $cus_api);

+}

+

+return 1;