[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/tools/dcmcomp_process.pm b/mcu/tools/dcmcomp_process.pm
new file mode 100644
index 0000000..3432dbb
--- /dev/null
+++ b/mcu/tools/dcmcomp_process.pm
@@ -0,0 +1,252 @@
+#!/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 dcmcomp_process;
+#****************************************************************************
+# Included Modules
+#****************************************************************************
+BEGIN { push @INC, '.\\pcore\\tools\\' } # add additional library path
+use vivaHelper;
+use File::stat;
+use Math::BigInt;
+
+#****************************************************************************
+# Constants
+#****************************************************************************
+my $dcmcmpBinaryName = "DYNAMIC_COMP_CODE";
+my $lzma_exe = "pcore\\tools\\7lzma.exe";
+my %info = ("name" => "DCM with Compression",
+ "binary_name" => $dcmcmpBinaryName,
+ "struct_name" => "dcmcmp",
+ "entry_function" => \&Process);
+
+
+#****************************************************************************
+# subroutine: Process
+# description: Perform the ZIMAGE post build process.
+# input: Binary folder, available start address,
+# original start address ref, original size ref
+# output: Actual start address, new binary size
+#****************************************************************************
+sub Process
+{
+ my $binaryFolder = shift;
+ my $availableStartAddress = shift;
+ my $startAddressRef = shift;
+ my $sizeRef = shift;
+
+ my $dcmcmpEnabled = &vivaHelper::GetMakefileOption("DCM_COMPRESSION_SUPPORT");
+ if (defined $dcmcmpEnabled and $dcmcmpEnabled eq "TRUE")
+ {
+ my $binary = "$binaryFolder\\$dcmcmpBinaryName";
+ processBody($binaryFolder);
+
+ # Update start address and binary size
+ # Need 4 byte align
+ $$startAddressRef = &vivaHelper::RoundUpToAlignment($availableStartAddress, 4);
+ $$sizeRef = -s $binary;
+
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+#****************************************************************************
+# subroutine: GetInfo
+# description: Get the basic information of processing
+# input: None
+# output: Info ref
+#****************************************************************************
+sub GetInfo
+{
+ return \%info;
+}
+
+#****************************************************************************
+# subroutine: processBody
+# description: Perform the ZIMAGE post build process.
+# input: Binary folder
+# output: None
+#****************************************************************************
+sub processBody
+{
+ my ($processed_folder) = @_;
+ my @Binary_Files = ();
+ my @Compress_List = ();
+
+ my $lzma_exe = "pcore\\tools\\7lzma.exe";
+
+ die "compression tool $lzma_exe do NOT exist!\n" if (!-e $lzma_exe);
+
+ if(-d "$processed_folder"){
+ opendir DIRHANDLE, "$processed_folder";
+ @Binary_Files = grep { !/^\.{1,2}$/ and -f "$processed_folder\\$_"} readdir (DIRHANDLE);
+ close DIRHANDLE;
+ } else {
+ die "$processed_folder bin file folder do NOT exist!!!\n";
+ }
+
+ my $base_identifier = "DCM_COMPRESS_CANDIDATE_HDR_V01";
+ $base_identifier = unpack('V1', "$base_identifier");
+
+ my $output_identifier = "DCMGBODY";
+
+ foreach (@Binary_Files){
+ my $B_file = $_;
+ open (FILE, "<$processed_folder\\$B_file") or die "cannot open $processed_folder\\$B_file\n";
+ binmode(FILE);
+ (read FILE, $identifier, 32);
+ my $tmp_id = $identifier;
+ $identifier = unpack('V1', $identifier);
+ (read FILE, $checksum, 4);
+ $checksum = unpack('V1', $checksum);
+ push(@Compress_List,$B_file) && next if (($identifier eq $base_identifier) && (&checksum($tmp_id,$checksum)));
+
+ $identifier = "";
+ seek(FILE, 0, 0);
+ (read FILE, $identifier, 8);
+ unpack('C', $identifier);
+
+ $output_file = "$B_file" if ($identifier eq $output_identifier);
+ close FILE;
+ }
+
+ my $comp_files_cnt = $#Compress_List + 1;
+ print "Total $comp_files_cnt files need to be compressed to $output_file\n";
+
+ if($output_file eq "") {
+ print "Error: DCM output file is not existed!\n";
+ exit 1 ;
+ }
+
+ system("rd $processed_folder\\DYNAMIC_COMP_BIN") if (-d "$processed_folder\\DYNAMIC_COMP_BIN");
+ system("md $processed_folder\\DYNAMIC_COMP_BIN");
+
+ system("copy $processed_folder\\$output_file $processed_folder\\DYNAMIC_COMP_BIN\\$output_file.bin");
+
+ open (OUTFILE, "+<$processed_folder\\$output_file") or die "cannot open $processed_folder\\$output_file\n";
+ binmode(OUTFILE);
+ seek(OUTFILE, 104, 0);
+ print OUTFILE pack("V1",$comp_files_cnt);
+
+ my $processed_cnt = 0;
+ foreach (@Compress_List) {
+
+ my $current_file = $_;
+
+ system("$lzma_exe e $processed_folder\\$current_file $processed_folder\\$current_file.gz");
+ system("rename $processed_folder\\$current_file $current_file.bin");
+ system("rename $processed_folder\\$current_file.gz $current_file");
+
+ open (FILE, "<$processed_folder\\$current_file.bin") or die "cannot open $processed_folder\\$current_file.bin\n";
+ binmode(FILE);
+ seek(FILE, 36, 0);
+ (read FILE, $img_id, 4);
+ $img_id = unpack('V1', $img_id);
+ (read FILE, $img_exec_base, 4);
+ $img_exec_base = unpack('V1', $img_exec_base);
+ (read FILE, $img_zi_base, 4);
+ $img_zi_base = unpack('V1', $img_zi_base);
+ (read FILE, $img_zi_size, 4);
+ $img_zi_size = unpack('V1', $img_zi_size);
+
+ $comp_size = stat("$processed_folder\\$current_file")->size;
+ $original_size = stat("$processed_folder\\$current_file.bin")->size;
+
+ my $header_pos = 108 + 28*$processed_cnt;
+
+ seek(OUTFILE, 0, 2);
+ my $last_position = tell(OUTFILE);
+
+ seek(OUTFILE, $header_pos, 0);
+ print OUTFILE pack("V1",$img_id);
+ print OUTFILE pack("V1",$img_exec_base);
+ print OUTFILE pack("V1",$img_zi_base);
+ print OUTFILE pack("V1",$img_zi_size);
+ print OUTFILE pack("V1",$original_size);
+ print OUTFILE pack("V1",$comp_size);
+ print OUTFILE pack("V1",$last_position);
+ seek(OUTFILE, $last_position, 0);
+ open (GZFILE, "<$processed_folder\\$current_file") or die "cannot open $processed_folder\\$current_file\n";
+ binmode GZFILE;
+ while (read(GZFILE, $buf, 4)) {
+ print OUTFILE $buf;
+ }
+ close GZFILE;
+ close FILE;
+
+ system("move /y $processed_folder\\$current_file $processed_folder\\DYNAMIC_COMP_BIN\\$current_file");
+ system("move /y $processed_folder\\$current_file.bin $processed_folder\\DYNAMIC_COMP_BIN\\$current_file.bin");
+
+ $processed_cnt ++;
+
+ }
+
+ close OUTFILE;
+}
+
+sub checksum {
+ my ($identifier,$id_checksum) = @_;
+ my $count = 0;
+ my $checksum1="";
+ my $checksum2="";
+ my $checksum="";
+ my @buffer = split(//,$identifier);
+ my @buffer2 = reverse @buffer;
+ foreach (@buffer2) {
+ if ($count % 4 < 3) {
+ $checksum1 = $checksum1.unpack("H*",$_);
+ }
+ if ($count % 4 == 3) {
+ $checksum2 = $checksum1.unpack("H*",$_);
+ $checksum = eval($checksum+hex($checksum2));
+ $checksum1=undef;
+ $checksum2=undef;
+ }
+ $count++;
+ }
+ $checksum=$checksum%(Math::BigInt->new('0x100000000'));
+ my $result = ($checksum eq $id_checksum) ? 1 : 0;
+ return $result;
+}
+
+sub Usage {
+ print "perl dcmcomp_process.pl <bin file folder>\n";
+ exit 1;
+}
\ No newline at end of file