blob: 92d33657fdf66805fef52b1bb5217ebb5b3a0339 [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001#!/usr/bin/perl
2#
3# Copyright Statement:
4# --------------------
5# This software is protected by Copyright and the information contained
6# herein is confidential. The software may not be copied and the information
7# contained herein may not be used or disclosed except with the written
8# permission of MediaTek Inc. (C) 2005
9#
10# BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
11# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
12# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
13# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
14# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
15# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
16# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
17# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
18# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
19# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
20# NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
21# SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
22#
23# BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
24# LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
25# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
26# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
27# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
28#
29# THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
30# WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
31# LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
32# RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
33# THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
34#
35#
36#*****************************************************************************
37#*
38#* Filename:
39#* ---------
40#* vivaProcess.pl
41#*
42#* Project:
43#* --------
44#* Maui_Software
45#*
46#* Description:
47#* ------------
48#* This file implemented the VIVA post build process to gen the VI binaries.
49#*
50#*
51#* Author:
52#* -------
53#* Ke-Ting Chen (mtk03141)
54#*
55#*****************************************************************************
56
57#****************************************************************************
58# Included Modules
59#****************************************************************************
60use strict;
61use warnings;
62BEGIN { push @INC, "pcore/" , '.\\pcore\\tools\\' } # add additional library path
63use vivaHelper;
64use zImageProcess;
65use File::Copy;
66
67#****************************************************************************
68# History
69#****************************************************************************
70my $VIVA_PROCESS_VERNO = " v1.02";
71 # v1.02: Phase out ALICE and BOOT_ZIMAGE on MOLY
72 # v1.01: Phase in BOOT_ZIMAGE
73 # v1.00: Phase in VIVA
74
75#****************************************************************************
76# Constants
77#****************************************************************************
78my $DEBUG = 1;
79my $vivaBinaryName = "VIVA";
80my $vivaBinaryBackupName = "VIVA.bin";
81# Note the sequence of this list is the same as VI processing sequence.
82# Thus it should be consistent to the position in scatter file.
83my @viList = (&zImageProcess::GetZImageInfo());
84my $separateLine = "=============================================================";
85
86#****************************************************************************
87# Arguments
88#****************************************************************************
89&vivaHelper::ErrorHandler("Insufficient arguments!", __LINE__, __FILE__)
90 unless scalar(@ARGV) == 2;
91
92my ($binaryFolder, $makefilePath) = @ARGV;
93$binaryFolder =~ s/^.\\|^\\//;
94$makefilePath =~ s/^.\\|^\\//;
95
96#****************************************************************************
97# Variables
98#****************************************************************************
99my $vivaBinary = "$binaryFolder\\$vivaBinaryName";
100my $vivaBinaryBackup = "$binaryFolder\\$vivaBinaryBackupName";
101my %vivaInfo;
102my $viAvailableStartAddress;
103my $viStartAddressRef;
104my $viSize;
105
106#****************************************************************************
107# Process
108#****************************************************************************
109printLog("Start VIVA processing...");
110
111&vivaHelper::Initialize(&vivaHelper::PROCESS_TYPE, $makefilePath);
112
113&vivaHelper::ErrorHandler("Insufficient arguments!", __LINE__, __FILE__)
114 unless defined $binaryFolder and defined $makefilePath;
115
116debugLog("Binary Folder: $binaryFolder");
117debugLog("Makefile: $makefilePath");
118
119# Backup VIVA binary
120copy($vivaBinary, $vivaBinaryBackup) or
121 &vivaHelper::ErrorHandler("Cannot backup VIVA header binary $vivaBinary: $!", __FILE__, __LINE__);
122
123# Open VIVA binary
124open my $inout, "+<$vivaBinary" or
125 &vivaHelper::ErrorHandler("Cannot open VIVA header binary $vivaBinary: $!", __FILE__, __LINE__);
126binmode $inout;
127
128# Read VIVA binary
129printLog("Read VIVA info...");
130&vivaHelper::ReadVIVAInfo($inout, \%vivaInfo);
131while (my ($key, $value) = each (%vivaInfo))
132{
133 debugLog("$key: ".&vivaHelper::DecToHex($value));
134}
135
136# Get the first VI available start address
137$viSize = -s $vivaBinaryBackup;
138$viAvailableStartAddress = $vivaInfo{"viva_base"} + $viSize;
139printLog("VI Start Address: ".&vivaHelper::DecToHex($viAvailableStartAddress));
140
141# For each VI
142foreach my $vi (@viList)
143{
144 printLog($separateLine);
145 printLog("Start processing ".$vi->{"name"}."...");
146
147 $viStartAddressRef = \$vivaInfo{$vi->{"struct_name"}."_base"};
148
149 # Invoke VI post process
150 if ($vi->{"entry_function"}($binaryFolder, $viAvailableStartAddress, $viStartAddressRef, \$viSize))
151 {
152 # Add padding for new start address
153 {
154 my $writeCount = $$viStartAddressRef - $viAvailableStartAddress;
155 my $buffer = pack("C[$writeCount]", 0);
156 print $inout $buffer;
157 }
158
159 # Append proccessed binary
160 &vivaHelper::ConcatenateBinary($inout, [$binaryFolder."\\".$vi->{"binary_name"}]);
161
162 printLog("Processing OK");
163
164 $viAvailableStartAddress = $$viStartAddressRef + $viSize;
165
166 debugLog("Start Address: ".&vivaHelper::DecToHex($$viStartAddressRef));
167 debugLog("Image Size: ".&vivaHelper::DecToHex($viSize));
168 debugLog("Next Available Start Address: ".&vivaHelper::DecToHex($viAvailableStartAddress));
169 }
170 else
171 {
172 printLog("Processing SKIPPED");
173 }
174 printLog("End processing ".$vi->{"name"});
175}
176
177printLog($separateLine);
178
179# Write VIVA binary
180printLog("Update VIVA info...");
181seek $inout, 0, 0;
182&vivaHelper::WriteVIVAInfo($inout, \%vivaInfo);
183while (my ($key, $value) = each (%vivaInfo))
184{
185 debugLog("$key: ".&vivaHelper::DecToHex($value));
186}
187
188close $inout;
189
190# Padding the total size to 4 bytes align
191&vivaHelper::PaddingBinaryToAlignment($vivaBinary, 4);
192
193printLog("End VIVA processing");
194exit 0;
195
196
197
198sub printLog
199{
200 print "[VIVA] $_[0]\n";
201}
202
203sub debugLog
204{
205 if ($DEBUG)
206 {
207 printLog("[DEBUG] $_[0]");
208 }
209}