[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/tools/NFBPack3rdROM.pl b/mcu/tools/NFBPack3rdROM.pl
new file mode 100644
index 0000000..b254d0a
--- /dev/null
+++ b/mcu/tools/NFBPack3rdROM.pl
@@ -0,0 +1,320 @@
+#!/usr/bin/perl -W
+#
+# 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).
+#
+#
+#*****************************************************************************
+
+#use strict;
+use Fcntl;
+
+if ($#ARGV != 1) { &Usage; }
+#die "Please use 5.8.6 or later Perl interpreter\n" if $] < 5.008005;
+
+#
+# NP3R - 0 : (under construction) pre-processing & info gathering from makefile
+#
+$prefix_path = $ARGV[0];
+$themf = $ARGV[1];
+
+die "$themf did NOT exist!\n" if (!-e $themf);
+open (FILE_HANDLE, "<$themf") or die "cannot open $themf\n";
+while (<FILE_HANDLE>) {
+ if (/^(\S+)\s*=\s*(\S+)/) {
+ $keyname = lc($1);
+ defined($${keyname}) && warn "$1 redefined in $themf!\n";
+ $${keyname} = uc($2);
+ }
+}
+close (FILE_HANDLE);
+
+#
+# NP3R - 1 : determine if _NAND_FLASH_BOOTING_ defined
+#
+
+if (not defined $nand_flash_booting)
+{
+ exit(0);
+}
+
+if ($nand_flash_booting ne "ENFB" and $nand_flash_booting ne "MIXED")
+{
+ exit(0);
+}
+#
+# NP3R - 2 : Global Configuration section
+#
+my $EnfbOutputfile = "THIRD_ROM";
+my %EnfbInputFiles = (
+"CustENFBImg\0" => "plutommi\\Customer\\CustResource\\CustENFBImgData",
+"CustENFBStr\0" => "plutommi\\Customer\\CustResource\\CustENFBStrData",
+);
+my $EnfbReservedHearderSize = 256;
+my $EnfbAlignToSize = 64;
+my $sv5_offset = 0;
+#
+# NP3R - 3 : read the pre-defined 3rd ROM header content
+#
+my %EnfbInputKeys; # Key ==> id
+my %EnfbInputBegin; # Key ==> begin
+my %EnfbInputEnd; # Key ==> end
+my %EnfbBinFiles; # Key ==> external bin file length
+my $buffer;
+$EnfbOutputfile = $prefix_path . $EnfbOutputfile;
+
+sysopen( HANDLE, $EnfbOutputfile, O_RDWR ) or die $!;
+binmode(HANDLE);
+
+#SV5 binary has "MMM" tag in its first 3 bytes
+sysread(HANDLE, $buffer, 3);
+
+if($buffer eq 'MMM')
+{
+ $sv5_offset = 56;
+ print "SV5 detected\n";
+}
+
+sysseek(HANDLE, $sv5_offset, 0);
+
+while ( sysread(HANDLE, $buffer, 32) )
+{
+# my (@ID, $cid, $begin, $length, @Desc) = unpack "C11CVVC12", $buffer;
+ my @buf = unpack "C11CVVC12", $buffer;
+ my $cid = $buf[11];
+ my $begin = $buf[12];
+ my $length = $buf[13];
+ my $key = pack "C12", splice(@buf, 14, 12);
+ my $idstring = pack "C7", splice(@buf, 0, 7);
+ #printf "ID = %x , \t %s \t %x \t %x \n", $cid, $key, $begin, $length;
+ if ($cid eq 0xff)
+ {
+ &AdjustDynamicCodeBeginEnd($begin);
+ last;
+ }
+ if (defined $EnfbInputFiles{$key}) # external binary file ...
+ {
+ $EnfbInputKeys{$key} = $cid;
+ next;
+ }
+ if ($length > 0 ) # dynamic code linked ...
+ {
+ $EnfbInputKeys{$key} = $cid;
+ $EnfbInputBegin{$key} = $begin;
+ $EnfbInputEnd{$key} = $begin + $length - 1;
+ }
+ last unless ($idstring eq "ENFB3RD");
+}
+#
+# NP3R - 4 : testing existing of external members in the 3rd rom
+#
+&ChkAllExternalBehindDynamicCode();
+foreach (keys %EnfbInputKeys)
+{
+ next if not defined $EnfbInputFiles{$_};
+ my $f = $EnfbInputFiles{$_};
+ if (-e $f)
+ {
+ $EnfbBinFiles{$_} = (stat $f )[7];
+ }
+ else
+ {
+ print "External Binary File $_ ==> $f not found\n";
+ delete $EnfbInputKeys{$_};
+ }
+}
+#
+# NP3R - 5 : correct 3RD ROM header , synthetize external content to 3RD ROM
+#
+&SetupExternalBinOffset();
+&DumpInternal3rdRomHeader();
+my $read_pos = sysseek(HANDLE, 0, 1); # SEEK_CUR
+my @SortedKeyList = sort { $EnfbInputKeys{$a} <=> $EnfbInputKeys{$b} } keys %EnfbInputKeys;
+sysseek(HANDLE, $sv5_offset, 0);
+
+foreach my $h (@SortedKeyList)
+{
+ $buffer = &Pack_enfb_header( $EnfbInputKeys{$h},
+ $EnfbInputBegin{$h},
+ $EnfbInputEnd{$h},
+ $h);
+ syswrite(HANDLE, $buffer, 32);
+}
+$buffer = &Pack_enfb_header( 0xff, 0, 0, "ENDMARK");
+syswrite(HANDLE, $buffer, 32);
+ # Zero Padding ---
+my $write_pos = sysseek(HANDLE, 0, 1); # SEEK_CUR
+#print "Read position : $read_pos\n";
+#print "Write position : $write_pos\n";
+if ($read_pos > $write_pos)
+{
+ $buffer = chr(0) x ($read_pos - $write_pos);
+ syswrite(HANDLE, $buffer, $read_pos - $write_pos);
+}
+ # External Binary Append
+my $cur_pos;
+#$cur_pos = sysseek(HANDLE, 0, 2); # SEEK_END
+#print "Current position : $cur_pos\n";
+foreach my $h (@SortedKeyList)
+{
+ next if not defined $EnfbBinFiles{$h};
+ # Padding To
+ $cur_pos = sysseek(HANDLE, 0, 2); # SEEK_END
+ if ($EnfbInputBegin{$h} > $cur_pos)
+ {
+ $buffer = chr(0) x ($EnfbInputBegin{$h} - $cur_pos);
+ syswrite(HANDLE, $buffer, ($EnfbInputBegin{$h} - $cur_pos));
+ }
+ # Append To
+ sysopen(EXTBIN, $EnfbInputFiles{$h} , O_RDONLY) or die $!;
+ binmode(EXTBIN);
+ my $read_len = sysread(EXTBIN, $buffer, 8192);
+ while ($read_len)
+ {
+ syswrite(HANDLE, $buffer, $read_len);
+ $read_len = sysread(EXTBIN, $buffer, 8192);
+ }
+ close(EXTBIN);
+}
+$cur_pos = sysseek(HANDLE, 0, 2); # SEEK_END
+print "Tail position : $cur_pos\n";
+
+close (HANDLE);
+exit(0);
+#
+# NP3R ------ End of MAIN BODY -----------
+#
+
+sub Align
+{
+ my ($size, $orig) = @_;
+
+ return $size * (int($orig/$size) + 1);
+}
+
+sub Pack_enfb_header
+{
+ my ($cid, $begin, $end, $description ) = @_;
+ my $ID = "ENFB3RDROM!";
+ my @ID = unpack "C*", $ID;
+ my $buf;
+ my @Desc = unpack "C*", $description;
+
+ $buf = pack "C11CVVC12", @ID, $cid, $begin, $end, @Desc ;
+ return $buf;
+}
+
+#
+# NP3R ------ Shift the being & end ------
+#
+sub AdjustDynamicCodeBeginEnd
+{
+ my ($base) = @_;
+ foreach my $k (keys %EnfbInputKeys)
+ {
+ next unless defined $EnfbInputBegin{$k};
+ $EnfbInputBegin{$k} -= $base;
+ $EnfbInputEnd{$k} -= $base;
+ }
+}
+
+#
+# NP3R ------ Debug use ------
+#
+sub DumpInternal3rdRomHeader
+{
+ foreach my $k (sort { $EnfbInputKeys{$a} <=> $EnfbInputKeys{$b} } keys %EnfbInputKeys)
+ {
+ if (defined $EnfbBinFiles{$k}) # external binary files
+ {
+ print $k, "\t", $EnfbInputKeys{$k}, "\t", $EnfbInputBegin{$k}, "\t", $EnfbInputEnd{$k}, "\t";
+ print "External BIN files\t size : ", $EnfbBinFiles{$k} , "\n";
+ }
+ else # linked dynamic code on NAND flash
+ {
+ print $k, "\t", $EnfbInputKeys{$k}, "\t", $EnfbInputBegin{$k}, "\t", $EnfbInputEnd{$k}, "\n";
+ }
+ }
+}
+
+#
+# NP3R ------ check if external bin cid larger than internal code cid ------
+#
+sub ChkAllExternalBehindDynamicCode
+{
+ my @codelist = keys %EnfbInputEnd;
+ #print "CODE LIST at Chk: $#codelist \n";
+ #map { print "CODE: ", $_, "\n"; } @codelist;
+ return if ($#codelist == -1);
+ my @SortedKeyList = sort { $EnfbInputKeys{$a} <=> $EnfbInputKeys{$b} } keys %EnfbInputKeys;
+ my @SortedCodeList = sort { $EnfbInputKeys{$a} <=> $EnfbInputKeys{$b} } @codelist;
+ my $lastidx = $#codelist;
+ die "External BIN cid must behind code cid"
+ unless ($SortedCodeList[$lastidx] eq $SortedKeyList[$lastidx]);
+}
+
+#
+# NP3R ------ check if external bin cid larger than internal code cid ------
+#
+sub SetupExternalBinOffset
+{
+ my @codelist = keys %EnfbInputEnd;
+ #print "CODE LIST at Setup: $#codelist \n";
+ #map { print "CODE: ", $_, "\n"; } @codelist;
+ my $ExtBinBegin;
+ if ($#codelist == -1)
+ {
+ $ExtBinBegin = $EnfbReservedHearderSize + $sv5_offset;
+ }
+ elsif ($#codelist == 0)
+ {
+ $ExtBinBegin = &Align( $EnfbAlignToSize, $EnfbInputEnd{ $codelist[-1] } );
+ }
+ else
+ {
+ my @SortedCodeList = sort { $EnfbInputKeys{$a} <=> $EnfbInputKeys{$b} } @codelist;
+ #print "The Last one : ", $SortedCodeList[-1], "\n";
+ $ExtBinBegin = &Align( $EnfbAlignToSize, $EnfbInputEnd{ $SortedCodeList[-1] } );
+ }
+ # okay , external bin setup begin and offset
+ foreach my $ebin ( sort { $EnfbInputKeys{$a} <=> $EnfbInputKeys{$b} } keys %EnfbBinFiles)
+ {
+ $EnfbInputBegin{$ebin} = $ExtBinBegin;
+ $EnfbInputEnd{$ebin} = $ExtBinBegin + $EnfbBinFiles{$ebin} - 1;
+ $ExtBinBegin = &Align( $EnfbAlignToSize, $ExtBinBegin + $EnfbBinFiles{$ebin} );
+ }
+}
+
+sub Usage {
+ print "perl nfbpack3rdrom.pl <binary path> <Project MakeFile>\n";
+}
+