blob: a671aef29735d13551a1c9a5a6ec7d83e6527e37 [file] [log] [blame]
#!/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) 2008
#
# 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:
#* ---------
#* CheckBinaryBlockUsage.pl
#*
#* Project:
#* --------
#* Maui_Software
#*
#* Description:
#* ------------
#* This script will check if code ROM size is enough for all binaries.
#*
#*------------------------------------------------------------------------------
#* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
#*============================================================================
#****************************************************************************/
#****************************************************************************
# Usage
#****************************************************************************
BEGIN { push @INC, "pcore/" , '.\\pcore\\tools\\' } # add additional library path
use Getopt::Std;
use POSIX;
sub Usage {
print "Usage: perl CheckBinaryBlockUsage.pl ~flash_cfg_tmp.c <BIN_FILE_PATH> <PLATFORM> <BUILD_SYS_PATH>\n";
exit(1);
}
use File::stat;
use File::Basename;
use Math::BigInt;
#****************************************************************************
# parsing command arguments
#****************************************************************************
$DebugPrint = 1;
print "ARGV[0]:$ARGV[0] ARGV[1]:$ARGV[1] ARGV[2]:$ARGV[2] ARGV[3]:$ARGV[3] ARG_NUM $#ARGV\n" if (0 != $DebugPrint);
while ($#ARGV != -1) {
if ($ARGV[0] =~ /-h/i) {
&Usage;
}
elsif ($#ARGV == 3) {
$FLASH_CFG = $ARGV[0];
(!-e $FLASH_CFG) && die "$FLASH_CFG does NOT EXIST!\n";
$binary_path = $ARGV[1];
$platform = $ARGV[2];
last;
}
else {
&Usage;
}
}
print "Running pcore\\tools\\CheckBinaryBlockUsage.pl ....\n";
if($platform eq 'MT6280') {
$d = $bootloader_path;
print "path: $d\n";
if ($d =~ /\.(bin|txt)$/i ) {
push(@binary, $d);
}
print "@binary\n";
}
else{
# Get all cfg files in the target build path
opendir (DIR, "$binary_path") or die "build folder doesn't exist: $binary_path\n";
my @cfgfiles = grep {/.+\.cfg$/} readdir DIR;
close DIR;
if (@cfgfiles == 1) {
$cfg_file = pop @cfgfiles;
}
else {
die "There are more than one cfg files or no cfg files in $binary_path!\n";
}
$cfg_path = $binary_path . "/" . $cfg_file;
print "CFG File: $cfg_path\n" if (0 != $DebugPrint);
open(CFG_FILE_HANDLE, "$cfg_path") or die "Cannot open $cfg_path\n";
while ($line = <CFG_FILE_HANDLE>) {
if ($line =~ /\s*- file:/) {
chomp($line);
$line =~ s/\s*- file: //;
$file = $binary_path . "/" . $line;
push(@binary, $file);
}
}
close(CFG_FILE_HANDLE);
}
#****************************************************************************
# parsing block size
# block size is got from flash_opt_gen.h
#****************************************************************************
my $bin_path = $ARGV[3];
my $FLASH_OPT_GEN_H = $bin_path."/flash_opt_gen.h";
print "$bin_path..\n $FLASH_OPT_GEN_H\n"if $DebugPrint == 1;
open (FLASH_OPT_GEN_H, "<$FLASH_OPT_GEN_H") or die "Cannot open $FLASH_OPT_GEN_H\n";
#$blk_size = 128 * 1024; # Assume 128KB per block
while (<FLASH_OPT_GEN_H>)
{
if (/^#define\s+(\w+)\s+\(([\w|\-]*)\)/ || /^#define\s+(\w+)\s+([\w|\-]*)/)
{
if($1 eq 'NAND_BLOCK_SIZE')
{
$blk_size = $2*1024;#NAND_BLOCK_SIZE is KB
}
}
}
close FLASH_OPT_GEN_H;
print "blk_size is $blk_size\n";
# Get code rom size from ~flash_cfg_tmp.c
open (FLASH_CFG, "<$FLASH_CFG") or die "Cannot open $FLASH_CFG\n";
while ($line = <FLASH_CFG>)
{
$backup = $/; undef $/;
$reading = <FLASH_CFG>;
$/ = $backup;
}
close FLASH_CFG; #End of open (FLASH_CFG, "<$FLASH_CFG")
my ($addr, $len, $total_block, $bad_block);
if ($reading =~ /int\s+flash_base_address\s*=\s*(.*);/)
{
$addr = `perl -e "print ($1)" 2>&1`;
$base_block = $addr / ($blk_size);
}
if ($reading =~ /int\s+allocated_fat_space\s*=\s*(.*);/)
{
$len = `perl -e "print ($1)" 2>&1`;
}
$total_block = 0;
$idx = 0;
my $ImageSize = 0;
foreach $file (@binary) {
if(&CheckGFHMaxSize($file))
{
if($ImageSize == 0xFFFFFFFF)
{
$block = ceil(&get_size($file)/($blk_size));#Max Size is 0xffffffff
print "[1-1]GFH info, image size is $block\n";
}
else
{
$block = $ImageSize/$blk_size;#Max Size is not 0xffffffff
print "[1-2]GFH info, image size is $block\n";
}
}
else
{
$block = ceil(&get_size($file)/($blk_size));#image do not have GFH info
}
$total_block+=$block;
printf("\t[%d]$file size = %dKB, block # = %d\n", $idx, &get_size($file)/1024, $block) if $DebugPrint == 1;
$idx = $idx + 1;
}
$bad_block = ceil($total_block * (0.02));
printf("\t[%d]Estimated Bad Block # = %d\n", $idx, $bad_block) if $DebugPrint == 1;
$idx = $idx + 1;
# Add 7 blocks for image list
$img_list_blk = 7;
$total_block = $total_block + $img_list_blk;
printf("\t[%d]Image List Block # = %d\n", $idx, $img_list_blk) if $DebugPrint == 1;
$total_block = $total_block + $bad_block;
if ($total_block > $base_block) {
print "Error: BIN ($total_block blocks) and FAT ($base_block blocks) on NAND Flash overlap risk were detected.\n";
print "Please decrease ROM sizes by reducing features or adjust custom_MemoryDevice.h configuration.\n";
exit(1);
}
else {
print "BIN size = $total_block blocks on NAND Flash\n";
print "FAT start at $base_block block.\n";
}
exit;
#if ($query_mode == 0) {
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);
}
}
if ($secure_support eq "TRUE") {
$sec_support = 1;
($secure_version !~ /\d{1,4}/) && die "SECURE_VERSION: $secure_version should be a integer no longer than 4 digits!\n";
($secure_jtag_enable !~ /(TRUE|FALSE)/) && die "SECURE_JTAG_ENABLE: $secure_jtag_enable should be TRUE or FALSE!\n";
$secure_jtag_enable = ($secure_jtag_enable =~ /TRUE/)? 1 : 0;
(length($secure_custom_name) > 31) && die "SECURE_CUSTOM_NAME: $secure_custom_name should NOT exceed 31 bytes!\n";
}
my %BBtbl_EMI =
(
'MT6225' => 1,
'MT6228' => 1,
'MT6229' => 2,
'MT6230' => 2,
'MT6235' => 3,
'MT6235B' => 3,
'MT6238' => 3,
'MT6239' => 3,
'MT6268A' => 3,
);
if (($nand_flash_booting ne "NONE") || (exists $BBtbl_EMI{$platform}))
{
open (CUSTOM_EMI_H, "<$memory_cfg") or die "cannot open $memory_cfg\n";
$backup = $/; undef $/;
$reading = <CUSTOM_EMI_H>;
$/ = $backup;
close CUSTOM_EMI_H; #End of open (FLASH_CFG, "<$FLASH_CFG")
if ($reading =~ /\n\s*#define\s+DRAM_CS\s+/gs
and $reading =~ /\n\s*#define\s+DRAM_SIZE\s+/gs)
{
$needEMIInfo = 1;
}
}
#}
#****************************************************************************
# parsing flash configuration from a file or a string
#****************************************************************************
my $full_hex_str = '';
my $full_emi_str;
if ($FLASH_CFG =~ /custom_MemoryDevice\.h/i)
{
# parsing flash configuration from custom_MemoryDevice.h (NAND_FLASH_BOOTING)
open (FLASH_CFG, "<$FLASH_CFG") or die "cannot open $FLASH_CFG\n";
while ($line = <FLASH_CFG>)
{
if ($line =~ /^\s*#define\s+NAND_BOOTING_FLASH_BASE_ADDRESS\s+(0x[0-9A-Fa-f]+)/)
{
$addr = hex $1;
}
if ($line =~ /^\s*#define\s+NAND_BOOTING_ALLOCATED_FAT_SPACE\s+(0x[0-9A-Fa-f]+)/)
{
$len = hex $1;
}
}
close FLASH_CFG; #End of open (FLASH_CFG, "<$FLASH_CFG")
$hex_str = sprintf("%02X%04X%04X%04X%04X%08X%08X", 1 , 0, 0, 0, 0, $addr, $len);
$full_hex_str .= $hex_str;
print "[Flash Cfg 0] $hex_str\n" if $DebugPrint == 1;
}
elsif ($FLASH_CFG =~ /flash_opt\.h/i)
{
# parsing flash configuration from flash_opt.h (NOR-XIP)
open (FLASH_CFG, "<$FLASH_CFG") or die "cannot open $FLASH_CFG\n";
$backup = $/; undef $/;
$reading = <FLASH_CFG>;
$/ = $backup;
close FLASH_CFG; #End of open (FLASH_CFG, "<$FLASH_CFG")
#// FLASH_BASE_ADDRESS_FOR_SCATTER 0x01C00000
#// ALLOCATED_FAT_SPACE_FOR_SCATTER 0x00400000
if ($reading =~ /\/\/\s+FLASH_BASE_ADDRESS_FOR_SCATTER\s+(0x[0-9A-Fa-f]+)/gs)
{
$addr = hex $1;
}
if ($reading =~ /\/\/\s+ALLOCATED_FAT_SPACE_FOR_SCATTER\s+(0x[0-9A-Fa-f]+)/gs)
{
$len = hex $1;
}
if (($system_drive_on_nand eq "TRUE") && ($nand_flash_booting eq "NONE"))
{
$addr = 0x0;
$len = 0x0;
}
$hex_str = sprintf("%02X%04X%04X%04X%04X%08X%08X", 1, 0, 0, 0, 0, $addr, $len);
$full_hex_str .= $hex_str;
}
elsif ($FLASH_CFG =~ /flash_cfg_tmp\.c/i)
{
open (FLASH_CFG, "<$FLASH_CFG") or die "cannot open $FLASH_CFG\n";
$backup = $/; undef $/;
$reading = <FLASH_CFG>;
$/ = $backup;
close FLASH_CFG; #End of open (FLASH_CFG, "<$FLASH_CFG")
#int flash_base_address = 0x00E00000 ;
#int flash_base_address = ( (0xD00000) + 0x00100000) ;
#int allocated_fat_space = 0x00200000 ;
#int allocated_fat_space = ( (0x300000) - 0x00100000) ;
if ($reading =~ /int\s+flash_base_address\s*=\s*(.*);/)
{
$addr = `perl -e "print ($1)" 2>&1`;
}
if ($reading =~ /int\s+allocated_fat_space\s*=\s*(.*);/)
{
$len = `perl -e "print ($1)" 2>&1`;
}
$hex_str = sprintf("%02X%04X%04X%04X%04X%08X%08X", 1, 0, 0, 0, 0, $addr, $len);
$full_hex_str .= $hex_str;
}
elsif ($FLASH_CFG =~ /\.[ch]/i)
{
die "Not Support $FLASH_CFG parsing Yet";
}
else
{
# parsing flash configuration from a string
$full_hex_str = $FLASH_CFG;
$full_emi_str = $EMI_INFO;
if ((length($full_emi_str) == 0)
&& (($platform eq "MT6228") || ($platform eq "MT6229") || ($platform eq "MT6225") || ($platform eq "MT6230"))
) {
die "Cannot get EMI_INFO.";
}
print "full_hex_str=$full_hex_str\n" if $DebugPrint == 1;
print "[Flash Cfg 0] $FLASH_CFG\n" if $DebugPrint == 1;
}
######################################
#Get register values from custom_MEI.h
######################################
## Check DRAM setting in custom_EMI.h
#if ($needEMIInfo == 1 and not defined $full_emi_str)
#{
# $full_emi_str = getRegisterAddress($platform, $memory_cfg);
#}
#elsif (not defined $full_emi_str)
#{
# $full_emi_str = '';
#}
##################################################################################################################
######################################
# Binary String
######################################
$flash_len = length($full_hex_str);
if ( ($flash_len == 2)
|| ((($flash_len-34)%32) !=0)
|| ($flash_len > 34+5*32) )
{
die "The length of $full_hex_str ($flash_len) should be 34+32n. (5>=n>=0)\n";
}
$flash_device_count = hex(substr($full_hex_str, 0, 2));
if ((($flash_len-2)/32) != $flash_device_count)
{
die "($flash_len-2)/32 should be $flash_device_count\n";
}
#****************************************************************************
# in query, output @cfg_list with hex string
#****************************************************************************
if ($query_mode == 1) {
print "FLASH_CFG = $full_hex_str\n";
print "EMI_INFO = $full_emi_str\n";
exit(0);
}
#****************************************************************************
# Parse symbol file
#****************************************************************************
(open(LOGF, "<$symFile")) || die "$symFile can NOT been opened\n";
my %SYM_TBL =
(
'INT_Vectors' => undef,
'IMG_INFO' => undef,
'EMI_INFO' => undef,
'g_CustParaCfg' => undef,
'g_secinfo' => undef,
'g_secinfo_tail' => undef,
);
my %SYM_LEN =
(
'g_CustParaCfg' => undef,
);
my $prev_symbol;
while(<LOGF>)
{
# 0x00000000 A INT_Vectors
if (/^0x(\S+)\s+\w\s+(\S+)$/)
{
if (exists $SYM_TBL{$2})
{
$SYM_TBL{$2} = hex($1);
}
if (exists $SYM_LEN{$prev_symbol})
{
$SYM_LEN{$prev_symbol} = hex($1) - $SYM_TBL{$prev_symbol};
}
$prev_symbol = $2;
}
}
close(LOGF);
#****************************************************************************
# Validation symbol and feature combination
#****************************************************************************
die "Could not find IMG_INFO in $symFile\n" unless defined $SYM_TBL{'IMG_INFO'};
if ($sec_support)
{
die "Could not find g_secinfo in $symFile\n" unless defined $SYM_TBL{'g_secinfo'};
}
#****************************************************************************
# Setup BINARY File Offset
#****************************************************************************
my %ROM_POS =
(
'IMG_INFO' => undef,
'EMI_INFO' => undef,
'g_CustParaCfg' => undef,
'g_secinfo' => undef,
'g_secinfo_tail' => undef,
);
map { $ROM_POS{$_} = $SYM_TBL{$_} - $SYM_TBL{'INT_Vectors'}; } keys %ROM_POS;
#****************************************************************************
# set ROMINFO version
#****************************************************************************
if ((($system_drive_on_nand eq "TRUE") && ($nand_flash_booting eq "NONE")))
{
$rom_info_ver = "MTK_ROMINFO_v05";
}
#****************************************************************************
# append information to the file
#****************************************************************************
open (FILE, "+<$file") or die "cannot open $file\n";
binmode(FILE);
seek(FILE, $ROM_POS{'IMG_INFO'}, 0);
seek(FILE, 16, 1);
print FILE "$bin_name";
print FILE "\0" x (128 -length($bin_name));
print FILE "$verno";
print FILE "\0" x (64 -length($verno));
if ($FLASH_CFG =~ /custom_MemoryDevice\.h/i)
{
print FILE pack("H4", "ffff");
} else {
print FILE pack("H4", "0000");
}
$flash_len = length($full_hex_str);
print FILE pack("v1", $flash_device_count);
for ($i=0; $i<$flash_device_count; $i++)
{
$menuID = hex(substr($full_hex_str, 2+32*$i, 4));
$devID = hex(substr($full_hex_str, 6+32*$i, 4));
$extID1 = hex(substr($full_hex_str, 10+32*$i, 4));
$extID2 = hex(substr($full_hex_str, 14+32*$i, 4));
$fatAddr = hex(substr($full_hex_str, 18+32*$i, 8));
$fatLen = hex(substr($full_hex_str, 26+32*$i, 8));
print FILE pack("v1", $menuID);
print FILE pack("v1", $devID);
print FILE pack("v1", $extID1);
print FILE pack("v1", $extID2);
print FILE pack("V1", $fatAddr);
print FILE pack("V1", $fatLen);
}
if ($cust_para_support eq "TRUE")
{
seek(FILE, 12+(6-$flash_device_count)*16, 1);
print FILE pack("V1", $SYM_TBL{'g_CustParaCfg'});
print FILE pack("V1", $SYM_LEN{'g_CustParaCfg'});
}
if ($sec_support == 1)
{
#Parse scatter file to get SECINFO_TAIL address.
open(scat,"$scat") || die "Cannot open $sact. Error:$!\n";
my $line = 0;
my $rom_base = "";
my $rom_line = 0;
my $secondary_rom_base = "0";
my $secondary_rom_line = 0;
my $third_rom_base = "0";
my $third_rom_line = 0;
my $secinfo_tail_line = 0;
my $secinfo_tail_base = "0";
my $multiROM = "";
while(<scat>){
$line++;
if(index($_,"ROM") == 0){
$rom_line = $line;
if($_ =~ /[\w]+[\s](.+?)[\s]/ && $1 ne "+0x0"){
$rom_base = $1;
# Get ROM binary length.
if ($file =~ /(.+)\\ROM/) {
$bin_path = $1;
$rom_length = get_length($file);
}
}
} elsif(index($_,"SECONDARY_ROM") == 0){
$secondary_rom_line = $line;
if($_ =~ /[\w]+[\s](.+?)[\s]/){
$secondary_rom_base = $1;
if ($secondary_rom_base =~ /\+(.+)/) {
$secondary_rom_offset = hex $1;
$secondary_rom_base = $rom_length + $secondary_rom_offset;
$secondary_rom_length = get_length("$bin_path\\SECONDARY_ROM");
}
}
} elsif(index($_,"THIRD_ROM") == 0){
$third_rom_line = $line;
if($_ =~ /[\w]+[\s](.+?)[\s]/){
$third_rom_base = $1;
if ($third_rom_base =~ /\+(.+)/) {
$third_rom_offset = $1;
$third_rom_base = $secondary_rom_length + $third_rom_offset;
}
}
} elsif ($_ =~ /^[a-zA-Z].+/) {
$third_rom_line = $line;
if($_ =~ /[\w]+[\s](.+?)[\s]/){
$third_rom_base = $1;
if ($third_rom_base =~ /\+(.+)/) {
$third_rom_offset = $1;
$third_rom_base = $secondary_rom_length + $third_rom_offset;
}
}
} elsif(index($_,"SECINFO_TAIL") >= 0){
$secinfo_tail_line = $line;
}
}
close(scat);
if($secondary_rom_line == 0) {
$secinfo_tail_base = $rom_base;
} elsif($secondary_rom_line > $secinfo_tail_line){ #SECINFO_TAIL locates at ROM
$secinfo_tail_base = $rom_base;
} elsif(($secinfo_tail_line > $secondary_rom_line) && ($third_rom_line > $secinfo_tail_line)){#SECINFO_TAIL locates at SECONDARY_ROM
$secinfo_tail_base = $secondary_rom_base;
$multiROM = "SECONDARY";
} elsif(($secinfo_tail_line > $third_rom_line) && (third_rom_line != "0")) {#SECINFO_TAIL locates at THIRD_ROM
$secinfo_tail_base = $third_rom_base;
$multiROM = "THIRD";
}
#************************************************************
#Start to write secinfo to ROM
#************************************************************
seek(FILE, $ROM_POS{'g_secinfo'} + 20, 0);
print FILE pack("V1", $secure_jtag_enable);
print FILE "$secure_custom_name";
print FILE "\0" x (32 -length($secure_custom_name));
seek(FILE, $ROM_POS{'g_secinfo'} + 60, 0);
print FILE pack("V1", $secure_version);
if ($secinfo_tail_base =~ /0x/i) {
$secinfo_tail_base = hex($secinfo_tail_base);
}
# Verify the address of g_secinfo_tail
seek(FILE, $ROM_POS{'g_secinfo'} + 80, 0);
my $addr_secinfo_tail;
die "cannot read $file\n" unless (my $chnum = (read FILE, $addr_secinfo_tail, 4));
$addr_secinfo_tail = unpack ("V1",$addr_secinfo_tail);
die "secinfo tail don't match\n" if ($SYM_TBL{'g_secinfo_tail'} != $addr_secinfo_tail);
if(length($multiROM) > 0){
if($multiROM eq "SECONDARY"){
$file =~ s/ROM/SECONDARY_ROM/;
open(multiFILE,"+<$file") || die "Cannot open $file. Error:$!\b";
} elsif($multiROM eq "THIRD"){
$file =~ s/ROM/THIRD_ROM/;
open(multiFILE,"$file") || die "Cannot open $file. Error:$!\b";
}
# $addr_secinfo_tail = $ROM_POS{'g_secinfo_tail'} % 0x08000000;
$addr_secinfo_tail = $ROM_POS{'g_secinfo_tail'};
$addr_secinfo_tail = $addr_secinfo_tail - $secinfo_tail_base;
seek(multiFILE, $addr_secinfo_tail+20, 0);
print multiFILE pack("V1", $secure_jtag_enable);
print multiFILE "$secure_custom_name";
print multiFILE "\0" x (32 -length($secure_custom_name));
seek(multiFILE, $addr_secinfo_tail+60, 0);
print multiFILE pack("V1", $secure_version);
close(multiFILE);
} else {
$addr_secinfo_tail = unpack ("V1",$addr_secinfo_tail) % 0x08000000;
seek(FILE, $ROM_POS{'g_secinfo_tail'} + 20, 0);
print FILE pack("V1", $secure_jtag_enable);
print FILE "$secure_custom_name";
print FILE "\0" x (32 -length($secure_custom_name));
seek(FILE, $ROM_POS{'g_secinfo_tail'} + 60, 0);
print FILE pack("V1", $secure_version);
}
}
if ($rom_info_ver eq "MTK_ROMINFO_v05")
{
$cust_para_addr = hex(0);
$cust_para_len = hex(0);
$bit_ctrl = hex(0);
#Read the bit_ctrl first then OR needed bit
seek(FILE, $ROM_POS{'IMG_INFO'} + 328, 0);
(read FILE, $bit_ctrl, 4);
$bit_ctrl=unpack("V1",$bit_ctrl);
if (($system_drive_on_nand eq "TRUE") && ($nand_flash_booting eq "NONE"))
{
$bit_ctrl = $bit_ctrl | 0x00000002;
}
seek(FILE, $ROM_POS{'IMG_INFO'} + 320, 0);
print FILE pack("V1", $cust_para_addr);
seek(FILE, $ROM_POS{'IMG_INFO'} + 324, 0);
print FILE pack("V1", $cust_para_len);
seek(FILE, $ROM_POS{'IMG_INFO'} + 328, 0);
print FILE pack("V1", $bit_ctrl);
}
close FILE;
#************************************************************
#Start to write IMG_FOTA_INFO to BIN file for FOTA
#************************************************************
#*********************************************************************************
# Calculate checksum of IMG_FOTA_INFO string (Check sum of "MTK_FOTA_ROMINFO_V01")
#*********************************************************************************
#****************************************************************************
# Write Platform ID and Project ID
#****************************************************************************
#****************************************************************************
# Get array numbers
#****************************************************************************
#****************************************************************************
# Write file size of each ROM image
#****************************************************************************
#****************************************************************************
# Write XOR value of whole structure
# For image information: initial key is (0x86)
#****************************************************************************
exit 0;
#******************************************************************************
# FUNCTION
# get_size
# DESCRIPTION
# xxx
# PARAMETERS
# binary path
# RETURNS
# binary size
#******************************************************************************
sub get_size(){
($path) = @_;
$rom_size = stat("$path")->size;
return $rom_size;
}
#******************************************************************************
# FUNCTION
# CheckGFHMaxSize
# DESCRIPTION
# Check whether image has GFH head info
# PARAMETERS
# binary path
# RETURNS
# Image has GFH head or not
#******************************************************************************
sub CheckGFHMaxSize
{
my ($strFilePath) = @_;
my $bIsGFH = 0;
if(-e $strFilePath)
{
# Get 17bytes (0-2: 4D 4D 4D, 8-16: FILE_INFO
open (FILE_HANDLE, "<$strFilePath") or &error_handler("$strFilePath: open file error!");
#binmode(FILE_HANDLE);
my ($nIndex, $data) = (0, undef);
my @Buffer;
while(read(FILE_HANDLE, $data, 1))
{
$Buffer[$nIndex++] = $data;
last if($nIndex > 64);
}
close FILE_HANDLE;
my ($strFILE_INFO, $nMatchMMM) = (undef, 0);
for(0..2)
{
$nMatchMMM++ if(ord($Buffer[$_]) == 0x4D);
}
for(8..16)
{
$strFILE_INFO .= $Buffer[$_];
}
$bIsGFH =1 if($nMatchMMM == 3 and $strFILE_INFO eq "FILE_INFO");
if($bIsGFH == 1)
{
# GFH_FILE_INFO_v1
# [ 3: 0] GFH_Header.m_magic_ver
# [ 5: 3] GFH_Header.m_size, = size of GFH_FILE_INFO_v1 structure
# [ 7: 6] GFH_Header.m_type, = GFH_FILE_INFO_v1
# [ 19: 8] identifier, = GFH_FILE_INFO_ID = "FILE_INFO"
# [ 23: 20] m_file_ver
# [ 25: 24] m_file_type, = PRI_ROM, DSP_ROM, ...
# [ : 26] m_flash_dev
# [ : 27] m_sig_type
# [ 31: 28] m_load_addr
# [ 35: 32] m_file_len
# [ 39: 36] m_max_size
# [ 43: 40] m_content_offset
# [ 47: 44] m_sig_len
# [ 51: 48] m_jump_offset
# [ 55: 52] m_attr
$ImageSize = ord($Buffer[36]) + (ord($Buffer[37])<<8) + (ord($Buffer[38])<<16) + (ord($Buffer[39])<<24);
print "ImageSize is $ImageSize\n";
}
}
return $bIsGFH;
}