[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/tools/AutoGen/postBuild/update_dump_table.pl b/mcu/tools/AutoGen/postBuild/update_dump_table.pl
new file mode 100644
index 0000000..3f39188
--- /dev/null
+++ b/mcu/tools/AutoGen/postBuild/update_dump_table.pl
@@ -0,0 +1,228 @@
+#!/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) 2018
+#
+# 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:
+#* ---------
+#* update_dump_table.pl
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#* This script is to update the value of dump table.
+#*
+#* Author:
+#* -------
+#* Yao Liu (mtk15073)
+#*
+#****************************************************************************/
+
+use strict;
+use warnings;
+BEGIN { push @INC, './tools/', './tools/MemoryUtility/' }
+use FileInfoParser;
+use constant {
+ Section_Size =>0,
+ Section_VMA =>1,
+ Section_LMA =>2,
+ Section_Fileoffset =>3,
+ Symbol_VMA =>0,
+ Symbol_Section =>1,
+ Symbol_Size =>2,
+};
+#****************************************************************************
+# Input
+#****************************************************************************
+my $debug = 1;
+&msg_handler("Fatal", "Wrong Parameters, Usage: update_drdi_table.pl <ELF_FILE> <SYM_FILE> <DUMP_FILE> <MAKEFILE>", __LINE__) if($#ARGV != 3);
+
+my ($elf_file, $sym_file, $dump_file, $makefile) = @ARGV;
+
+my $templog = "Input: ELF is $elf_file\nSYM is $sym_file\nDUMP_TABLE is $dump_file\nmakefile is $makefile\n\n";
+&msg_handler("Log", $templog, __LINE__);
+
+my %g_MAKEFILE_OPTIONS;
+&msg_handler("Fatal", "Failed to parse makefile!!!\n", __LINE__) if(1!=&FileInfo::Parse_MAKEFILE($makefile, \%g_MAKEFILE_OPTIONS));
+&msg_handler("Log", "This load do not support DHL!!!\n", __LINE__) if(FileInfo::is("DHL_SUPPORT", "FALSE"));
+exit 0 if(FileInfo::is("DHL_SUPPORT", "FALSE"));
+
+my @symbol_array = qw/dhl_dump_profile/;
+
+my %sym_file_hash;
+map{ $sym_file_hash{'symbol_info'}->{$_} = 0 } (@symbol_array);
+&parse_sym_file();
+
+my @CRC32_Table;
+&Init_CRC32_Table();
+
+my $init = 0x1A424650;
+my $constant = 1; #If the value of $init is not 0xFFFFFFFF, please set $constant to 1.
+my $update_content = &get_table_info();
+
+&dump_update_elf();
+
+exit 0;
+
+sub parse_sym_file
+{
+ my ($bBegin, $sum_hit_sym) = (undef, 0);
+ open SYM, "< $sym_file" or &msg_handler("Fatal", "fail to open $sym_file", __LINE__);
+ while(my $line = <SYM>) {
+ $bBegin = 1 if($line =~ /^Sections:$/);
+ $bBegin = 2 if($line =~ /^SYMBOL TABLE:$/);
+ next unless(defined $bBegin);
+
+ #Idx Name Size VMA LMA File off Algn
+ # 0 ROM_GFH 0000084c 00000000 00000000 00000fd4 2**2
+ if($bBegin == 1 and $line =~ /\s*(\d+)\s+(\S+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\S+)/) {
+ my $section_name = $2;
+ $sym_file_hash{'section_info'}->{$section_name} = [$3, $4, $5, $6];
+ }
+ #91437ed0 g O ROM 00000180 DRDI_RCUCS_Array
+ elsif($bBegin == 2 and $line =~ /^([0-9a-fA-F]{8})\s+g\s+O\s+(\S+)\s+(\S+)\s+(?:\S+\s+)?(\S+)$/) {
+ my $symbol_name = $4;
+ next unless(exists $sym_file_hash{'symbol_info'}->{$symbol_name});
+ $sym_file_hash{'symbol_info'}->{$symbol_name} = [$1, $2, hex($3)];
+ &msg_handler("Log", "[Symbol]:$symbol_name [VMA]:0x$1 [Section]:$2 [Size]:0x$3\n", __LINE__) if($debug);
+ last if(($sum_hit_sym ++) == $#symbol_array);
+ }
+ }
+ close SYM;
+ map {&msg_handler("Fatal", "can't find symbol: $_!!!", __LINE__) if ($sym_file_hash{'symbol_info'}->{$_} == 0)} (@symbol_array);
+}
+
+ sub get_table_info
+{
+ my @temp = stat($dump_file);
+ #Check total size
+ &msg_handler("Fatal", "The sie of $dump_file is biffer than symbol size!!!\n", __LINE__) if($temp[7] > $sym_file_hash{'symbol_info'}->{"dhl_dump_profile"}->[Symbol_Size]);
+
+ my $header = unpack("V", read_memory_from_file($dump_file, 0, 4,__LINE__));
+ my $table_value = read_memory_from_file($dump_file, 0, ($temp[7] - 4),__LINE__);
+ my $check_sum = unpack("V", read_memory_from_file($dump_file, ($temp[7] - 4), 4,__LINE__));
+ my $content = read_memory_from_file($dump_file, 0, $temp[7],__LINE__);
+
+ #Check header
+ &msg_handler("Fatal", "The magic pattern mismatch!!!\n", __LINE__) if($header != 0x1A424650);
+ #Check CRC32 checksum
+ my $check_value = CRC32_CheckSum($table_value);
+ &msg_handler("Log", "[File Size]:$temp[7] [Old CHecksum]:$check_sum [New Checksum]:$check_value\n", __LINE__) if($debug);
+
+ &msg_handler("Fatal", "The checksum mismatch!!!\n", __LINE__) if($check_value != $check_sum);
+ return $content;
+}
+
+sub dump_update_elf
+{
+ open (ELF_FILE, "+< $elf_file") or &msg_handler("Fatal", "Open $elf_file file failed!!!\n", __LINE__);
+ binmode ELF_FILE;
+ foreach my $symbol (@symbol_array) {
+ if($sym_file_hash{'symbol_info'}->{$symbol} == 0) {
+ &msg_handler("Fatal", "can't find symbol: $symbol", __LINE__);
+ next;
+ }
+ my $sym_region = $sym_file_hash{'symbol_info'}->{$symbol}->[Symbol_Section];
+ my $offset = (hex($sym_file_hash{'symbol_info'}->{$symbol}->[Symbol_VMA]) - hex($sym_file_hash{'section_info'}->{$sym_region}->[Section_VMA])) +
+ hex($sym_file_hash{'section_info'}->{$sym_region}->[Section_Fileoffset]);
+ &msg_handler("Log", "The addr of symbol in ELF is $offset.\n", __LINE__);
+
+ seek ELF_FILE, $offset, 0;
+ print ELF_FILE $update_content;
+ }
+ close ELF_FILE;
+ &msg_handler("Log", "\n\nUpdate Elf succeed ^O^", __LINE__);
+}
+
+sub read_memory_from_file
+{
+ &msg_handler("Fatal", "[Error]: argument of $0 is insufficient\n", __LINE__) if(@_ != 4);
+ my ($file,$off,$len,$file_line_no) = @_;
+
+ my $content;
+ open(FH, $file) or &msg_handler("Fatal", "Fail to open $file: $!\n", __LINE__);
+ binmode FH;
+ &msg_handler("Fatal", "Can not seek to $off\n", __LINE__) if not seek FH, $off, 0;
+ &msg_handler("Fatal", "At line $file_line_no! Can't read offset $off, length $len from file $file\n", __LINE__) if read(FH, $content, $len) != $len;
+ close FH;
+ return $content;
+}
+
+sub Init_CRC32_Table
+{
+ foreach my $index (0..255){
+ my $crc = $index;
+ foreach (0..7){
+ $crc = ($crc >> 1) ^ ($crc & 1 && 0xEDB88320);
+ }
+ my $value = $crc & 2 ** 32 - 1;
+ push @CRC32_Table, $value;
+ }
+}
+
+sub CRC32_CheckSum
+{
+ my ($data) = @_;
+ $init ^= 0xFFFFFFFF if ($constant);
+ my $check_sum = $init;
+ my $len = length $data;
+ foreach my $pos (0..$len-1){
+ my $temp = ($check_sum ^ ord(substr($data, $pos, 1))) & 0xFF;
+ $check_sum = ($check_sum >> 8) ^ $CRC32_Table[$temp];
+ }
+ $check_sum ^= 0xFFFFFFFF;
+ return ($check_sum & 0xFFFFFFFF);
+}
+
+sub msg_handler
+{
+ my ($type, $msg, $line_no) = (@_);
+ my $prompt_prefix;
+ if($type eq "Log") {
+ print $msg . "\n";
+ }
+ elsif($type eq "Warning") {
+ $prompt_prefix = ">> Warning : ";
+ print "\n" . $prompt_prefix . "[at line $line_no] " . $msg . "\n";
+ }
+ elsif($type eq "Fatal") {
+ $prompt_prefix = ">> Fatal : ";
+ die $prompt_prefix . "[at line $line_no] " . "$msg" . "\n";
+ }
+}
+
+