#!/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; | |
} |