#!/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). | |
# | |
# | |
#***************************************************************************** | |
#* | |
#* Filename: | |
#* --------- | |
#* vivaProcess.pl | |
#* | |
#* Project: | |
#* -------- | |
#* Maui_Software | |
#* | |
#* Description: | |
#* ------------ | |
#* This file implemented the VIVA post build process to gen the VI binaries. | |
#* | |
#* | |
#* Author: | |
#* ------- | |
#* Ke-Ting Chen (mtk03141) | |
#* | |
#***************************************************************************** | |
#**************************************************************************** | |
# Included Modules | |
#**************************************************************************** | |
use strict; | |
use warnings; | |
BEGIN { push @INC, "pcore/" , '.\\pcore\\tools\\' } # add additional library path | |
use vivaHelper; | |
use zImageProcess; | |
use File::Copy; | |
#**************************************************************************** | |
# History | |
#**************************************************************************** | |
my $VIVA_PROCESS_VERNO = " v1.02"; | |
# v1.02: Phase out ALICE and BOOT_ZIMAGE on MOLY | |
# v1.01: Phase in BOOT_ZIMAGE | |
# v1.00: Phase in VIVA | |
#**************************************************************************** | |
# Constants | |
#**************************************************************************** | |
my $DEBUG = 1; | |
my $vivaBinaryName = "VIVA"; | |
my $vivaBinaryBackupName = "VIVA.bin"; | |
# Note the sequence of this list is the same as VI processing sequence. | |
# Thus it should be consistent to the position in scatter file. | |
my @viList = (&zImageProcess::GetZImageInfo()); | |
my $separateLine = "============================================================="; | |
#**************************************************************************** | |
# Arguments | |
#**************************************************************************** | |
&vivaHelper::ErrorHandler("Insufficient arguments!", __LINE__, __FILE__) | |
unless scalar(@ARGV) == 2; | |
my ($binaryFolder, $makefilePath) = @ARGV; | |
$binaryFolder =~ s/^.\\|^\\//; | |
$makefilePath =~ s/^.\\|^\\//; | |
#**************************************************************************** | |
# Variables | |
#**************************************************************************** | |
my $vivaBinary = "$binaryFolder\\$vivaBinaryName"; | |
my $vivaBinaryBackup = "$binaryFolder\\$vivaBinaryBackupName"; | |
my %vivaInfo; | |
my $viAvailableStartAddress; | |
my $viStartAddressRef; | |
my $viSize; | |
#**************************************************************************** | |
# Process | |
#**************************************************************************** | |
printLog("Start VIVA processing..."); | |
&vivaHelper::Initialize(&vivaHelper::PROCESS_TYPE, $makefilePath); | |
&vivaHelper::ErrorHandler("Insufficient arguments!", __LINE__, __FILE__) | |
unless defined $binaryFolder and defined $makefilePath; | |
debugLog("Binary Folder: $binaryFolder"); | |
debugLog("Makefile: $makefilePath"); | |
# Backup VIVA binary | |
copy($vivaBinary, $vivaBinaryBackup) or | |
&vivaHelper::ErrorHandler("Cannot backup VIVA header binary $vivaBinary: $!", __FILE__, __LINE__); | |
# Open VIVA binary | |
open my $inout, "+<$vivaBinary" or | |
&vivaHelper::ErrorHandler("Cannot open VIVA header binary $vivaBinary: $!", __FILE__, __LINE__); | |
binmode $inout; | |
# Read VIVA binary | |
printLog("Read VIVA info..."); | |
&vivaHelper::ReadVIVAInfo($inout, \%vivaInfo); | |
while (my ($key, $value) = each (%vivaInfo)) | |
{ | |
debugLog("$key: ".&vivaHelper::DecToHex($value)); | |
} | |
# Get the first VI available start address | |
$viSize = -s $vivaBinaryBackup; | |
$viAvailableStartAddress = $vivaInfo{"viva_base"} + $viSize; | |
printLog("VI Start Address: ".&vivaHelper::DecToHex($viAvailableStartAddress)); | |
# For each VI | |
foreach my $vi (@viList) | |
{ | |
printLog($separateLine); | |
printLog("Start processing ".$vi->{"name"}."..."); | |
$viStartAddressRef = \$vivaInfo{$vi->{"struct_name"}."_base"}; | |
# Invoke VI post process | |
if ($vi->{"entry_function"}($binaryFolder, $viAvailableStartAddress, $viStartAddressRef, \$viSize)) | |
{ | |
# Add padding for new start address | |
{ | |
my $writeCount = $$viStartAddressRef - $viAvailableStartAddress; | |
my $buffer = pack("C[$writeCount]", 0); | |
print $inout $buffer; | |
} | |
# Append proccessed binary | |
&vivaHelper::ConcatenateBinary($inout, [$binaryFolder."\\".$vi->{"binary_name"}]); | |
printLog("Processing OK"); | |
$viAvailableStartAddress = $$viStartAddressRef + $viSize; | |
debugLog("Start Address: ".&vivaHelper::DecToHex($$viStartAddressRef)); | |
debugLog("Image Size: ".&vivaHelper::DecToHex($viSize)); | |
debugLog("Next Available Start Address: ".&vivaHelper::DecToHex($viAvailableStartAddress)); | |
} | |
else | |
{ | |
printLog("Processing SKIPPED"); | |
} | |
printLog("End processing ".$vi->{"name"}); | |
} | |
printLog($separateLine); | |
# Write VIVA binary | |
printLog("Update VIVA info..."); | |
seek $inout, 0, 0; | |
&vivaHelper::WriteVIVAInfo($inout, \%vivaInfo); | |
while (my ($key, $value) = each (%vivaInfo)) | |
{ | |
debugLog("$key: ".&vivaHelper::DecToHex($value)); | |
} | |
close $inout; | |
# Padding the total size to 4 bytes align | |
&vivaHelper::PaddingBinaryToAlignment($vivaBinary, 4); | |
printLog("End VIVA processing"); | |
exit 0; | |
sub printLog | |
{ | |
print "[VIVA] $_[0]\n"; | |
} | |
sub debugLog | |
{ | |
if ($DEBUG) | |
{ | |
printLog("[DEBUG] $_[0]"); | |
} | |
} |