blob: 4e343b71ffcf42409eb8b8c9cc1ef99abcefd4c3 [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) 2006
#
# 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:
#* ---------
#* scatGenFOTA.pl
#*
#* Project:
#* --------
#*
#*
#* Description:
#* ------------
#* This script designed as module to be include by top level perl script
#*
#* Author:
#* -------
#* Claudia Lo (mtk01876)
#*
#*
#****************************************************************************/
#use strict;
BEGIN { push @INC, "pcore/" , './pcore/tools/' } # add additional library path
use sysGenUtility; #pm file name without case sensitivity
my $nfb;
my $scatter_maui;
my $fota_cfg_href;
1;
#****************************************************************************
# MAIN INTERFACE
# input:
#****************************************************************************
sub scatGenFOTA_main
{
my ($func, $bb, $rs, $fota_cfg, $bb_path, $scatter) = @_;
my $nand_flash_booting = &$func('nand_flash_booting');
my $emmc_booting = &$func('emmc_booting');
$nfb = "NONE";
if ((defined $nand_flash_booting) and ($nand_flash_booting ne "NONE"))
{
$nfb = $nand_flash_booting;
}
elsif ((defined $emmc_booting) and ($emmc_booting ne "NONE"))
{
$nfb = $emmc_booting;
}
$scatter_maui = $scatter;
$fota_cfg_href = $fota_cfg;
# SW Feature dispatch decision tree
my $output_result = &layout_fota($bb, $rs, $nfb);
# Finally , return output
return $output_result;
}
#****************************************************************************
# subroutine: FOTA Scatter Layout <Class>
# return: the body strings
#****************************************************************************
sub layout_fota
{
my ($bb, $rs, $nfb) = @_;
# --- --- ---
my ($emiinitcode_base, $intsram_base, $itcm_base, $dtcm_base, $sysram_base, $sysram_size, $hidden_secure_mac_base);
open (SCATTER_H, "<$scatter_maui") or &sysUtil::sysgen_die("$scatter_maui: file error!", __FILE__, __LINE__);
while (<SCATTER_H>)
{
if (/\s*EMIINIT_CODE\s*(0x\w+)\s*\w*\s*(0x\w+)*/)
{
$emiinitcode_base = $1;
}
if (/\s*INTSRAM\s*(0x\w+)\s*\w*\s*(0x\w+)/)
{
$intsram_base = $1;
}
if (/\s*INTSRAM_CODE\s*(0x\w+)\s*\w*\s*(0x\w+)/)
{
$itcm_base = $1;
}
if (/\s*INTSRAM_DATA\s*(0x\w+)\s*\w*\s*(0x\w+)/)
{
$dtcm_base = $1;
}
if (/\s*INTSRAM_MULTIMEDIA\s*(0x\w+)\s*\w*\s*(0x\w+)/)
{
$sysram_base = $1;
$sysram_size = $2;
}
if (/^__HIDDEN_SECURE_MAC\s*(0x\w+)\s*\w*/ or /^__HIDDEN_SECURE_MAC\s*(\+0x\w+)\s*\w*/)
{
$hidden_secure_mac_base = $1;
}
}
close (SCATTER_H) or &sysUtil::sysgen_die("$scatter_maui: file error!", __FILE__, __LINE__);
# --- --- ---
my $ua_rom_base = $fota_cfg_href->{'FOTA_UE_EXECUTION_BASE'};
my $ua_rom_size = $fota_cfg_href->{'CONFIG_FOTA_UE_FLASH_SPACE'};
# --- --- ---
my ($ua_intsram_code_base, $ua_intsram_data_base);
if (defined $emiinitcode_base)
{
$ua_intsram_code_base = $emiinitcode_base;
if ((defined $sysram_base) and ($nfb eq 'NONE'))
{
$ua_intsram_data_base = sprintf("0x%08X", hex($sysram_base));
}
elsif (defined $dtcm_base)
{
$ua_intsram_data_base = $dtcm_base
}
}
elsif (defined $itcm_base)
{
$ua_intsram_code_base = $itcm_base;
if ((defined $sysram_base) and ($nfb eq 'NONE'))
{
$ua_intsram_data_base = sprintf("0x%08X", hex($sysram_base));
}
elsif (defined $dtcm_base)
{
$ua_intsram_data_base = $dtcm_base
}
else
{
$ua_intsram_data_base = sprintf("0x%08X", hex($itcm_base) + hex('0x8000'));
}
}
elsif (defined $intsram_base)
{
$ua_intsram_code_base = $intsram_base;
if ((defined $sysram_base) and ($nfb eq 'NONE'))
{
$ua_intsram_data_base = sprintf("0x%08X", hex($sysram_base));
}
else
{
$ua_intsram_data_base = sprintf("0x%08X", hex($intsram_base) + hex('0x8000'));
}
}
elsif (defined $sysram_base)
{
$ua_intsram_code_base = sprintf("0x%08X", hex($sysram_base));
$ua_intsram_data_base = sprintf("0x%08X", hex($sysram_base) + hex('0x8000'));
}
# --- --- ---
my ($bl_ua_shared_sys_ram_base, $ua_maui_shared_sys_ram_base);
if (defined $sysram_base)
{
$bl_ua_shared_sys_ram_base = $sysram_base;
$ua_maui_shared_sys_ram_base = sprintf("0x%08X", hex($sysram_base) + hex($sysram_size) - hex('0x1000'));
}
else
{
&sysUtil::sysgen_die("pcore/tools/scatGenFOTA.pl: No SysRAM to put BL_UA_SHARED_SYS_RAM and UA_MAUI_SHARED_SYS_RAM!", __FILE__, __LINE__)
if ($nfb ne 'NONE');
}
# --- --- ---
my $ev_ua_rom = &layout_ua_rom_ev($nfb, $bb, $ua_rom_base, $ua_rom_size, $ua_intsram_code_base, $ua_intsram_data_base, $bl_ua_shared_sys_ram_base, $ua_maui_shared_sys_ram_base);
my $hidden_secure_mac = &layout_hidden_secure_mac($bb, $hidden_secure_mac_base);
chomp $hidden_secure_mac;
# --- --- ---
my $layout = <<"__LAYOUT";
UA_ROM $ua_rom_base $ua_rom_size
{
$ev_ua_rom
}
$hidden_secure_mac
__LAYOUT
return $layout;
}
#****************************************************************************
# subroutine: FOTA Layout :: UA_ROM :: Exec View
# input: BB chip, ram size [value]
#****************************************************************************
sub layout_ua_rom_ev
{
my ($nfb, $bb, $ua_rom_base, $ua_rom_size, $ua_intsram_code_base, $ua_intsram_data_base, $bl_ua_shared_sys_ram_base, $ua_maui_shared_sys_ram_base) = @_;
# --- --- ---
my $ua_noncached_base;
if ($nfb ne 'NONE')
{
$ua_noncached_base = sprintf("0x%08X", hex($ua_rom_base) - hex('0x200000')); # The last 2MB of UA_ROM
}
else
{
$ua_noncached_base = sprintf("0x%08X", hex($ua_rom_base) - hex('0x100000')); # The last 1MB of UA_ROM
}
# --- --- ---
# In TCM only platform (Arm7), the UA_INTSRAM_CODE and UA_INTSRAM_DATA are from MAUI. FUE may fail to link if the partition for MAUI is not suitable for FUE.
# So FUE CODE/DATA partition should be independent from MAUI
my ($ua_intsram_code_base_final, $ua_intsram_code_size_final, $ua_intsram_data_base_final, $ua_intsram_data_size_final);
if (&sysUtil::is_arm9($bb) == 1 or &sysUtil::is_arm11($bb)==1 )
{
$ua_intsram_code_base_final = $ua_intsram_code_base;
$ua_intsram_code_size_final = '0x8000';
$ua_intsram_data_base_final = $ua_intsram_data_base;
$ua_intsram_data_size_final = '0x2000';
}
else
{
$ua_intsram_code_base_final = $ua_intsram_code_base;
$ua_intsram_code_size_final = undef;
$ua_intsram_data_base_final = '+0x0';
$ua_intsram_data_size_final = undef;
}
# --- --- ---
my @ua_init_libs = split("\n", &UA_INIT_EV());
map { s/^\s+//; } @ua_init_libs;
my @ua_rom_libs = split("\n", &UA_ROM_EV());
map { s/^\s+//; } @ua_rom_libs;
my @ua_noncached_libs = split("\n", &UA_NONCACHED_EV());
map { s/^\s+//; } @ua_noncached_libs;
my @ua_rw_libs = split("\n", &UA_RW_EV());
map { s/^\s+//; } @ua_rw_libs;
my @ua_intsram_code_libs = split("\n", &UA_INTSRAM_CODE_EV());
map { s/^\s+//; } @ua_intsram_code_libs;
my @ua_intsram_data_libs = split("\n", &UA_INTSRAM_DATA_EV());
map { s/^\s+//; } @ua_intsram_data_libs;
my @bl_ua_shared_sys_ram_libs = split("\n", &BL_UA_SHARED_SYS_RAM_EV());
map { s/^\s+//; } @bl_ua_shared_sys_ram_libs;
# --- --- ---
my $template;
if (&sysUtil::is_sv5($bb) == 1)
{
$template .= &format_execution_view('UA_GFH_SECTION',
'+0x0',
undef,
["* (FUE_GFH, +First)"]);
}
$template .= &format_execution_view('UA_INIT',
'+0x0',
'0x400',
\@ua_init_libs);
$template .= &format_execution_view('UA_ROM',
'+0x0',
undef,
\@ua_rom_libs);
$template .= &format_execution_view('UA_RW',
'+0x1000',
undef,
\@ua_rw_libs);
$template .= &format_execution_view('UA_NONCACHED',
$ua_noncached_base,
undef,
\@ua_noncached_libs);
$template .= &format_execution_view('UA_CUSTOM_ZI',
'0x1000',
undef,
["*.obj (FOTA_CUSTOM_POOL)"]);
$template .= &format_execution_view('UA_BL_INFO',
'0x0',
'0x80',
["*.obj (FOTA_BL_INFO)"]);
$template .= &format_execution_view('UA_INTSRAM_CODE',
$ua_intsram_code_base_final,
$ua_intsram_code_size_final,
\@ua_intsram_code_libs);
$template .= &format_execution_view('UA_RESIDENT_PART',
'+0x0',
undef,
["*.obj (FOTA_RESIDENT_PART) ;for codes that are used to load Primary ROM image"]);
$template .= &format_execution_view('UA_INTSRAM_DATA',
$ua_intsram_data_base_final,
$ua_intsram_data_size_final,
\@ua_intsram_data_libs);
if ($nfb ne 'NONE')
{
$template .= &format_execution_view('BL_UA_SHARED_SYS_RAM',
$bl_ua_shared_sys_ram_base,
'0x2000',
\@bl_ua_shared_sys_ram_libs);
$template .= &format_execution_view('UA_MAUI_SHARED_SYS_RAM',
$ua_maui_shared_sys_ram_base,
'0x1000',
["fue_partial_fota.obj (FUE_NFB_SHARED_ZI)"]);
}
if (&sysUtil::is_sv5($bb) == 1)
{
$template .= &format_execution_view('UA_GFH_SIGNATURE_SECTION',
'+0x0',
undef,
["* (FUE_SIGNATURE_SECTION)"]);
}
chomp $template;
return $template;
}
#****************************************************************************
# subroutine: Layout :: __HIDDEN_SECURE_MAC :: Load View
# input: BB chip, ram size [value]
#****************************************************************************
sub layout_hidden_secure_mac
{
my ($bb, $base_str) = @_;
return if (&sysUtil::is_sv5($bb) == 1 or $base_str eq "");
my $layout = <<"__LAYOUT";
;=========================================================================
; This load region must be behind all the protected load region
;=========================================================================
; do NOT modify load region naming and pragma naming!
;=========================================================================
__HIDDEN_SECURE_MAC $base_str
{
__HIDDEN_SECURE_MAC_CONTENT +0x0
{
*.obj (SECURE_MAC_CONTENT)
}
__HIDDEN_SECURE_MAC +0x0
{
*.obj (SECURE_MAC_SIZE)
}
}
__LAYOUT
return $layout;
}
#****************************************************************************
# subroutine: Layout :: UA_INIT
# return: the body strings
#****************************************************************************
sub UA_INIT_EV
{
my $template = <<"__TEMPLATE";
fue_bootarm.obj (C\$\$code, +First)
fue_bootarm.obj (+RO)
*.obj (FOTA_SECINFO)
__TEMPLATE
return $template;
}
#****************************************************************************
# subroutine: Layout :: UA_ROM
# return: the body strings
#****************************************************************************
sub UA_ROM_EV
{
my $template = <<"__TEMPLATE";
*.obj (UA_HEAD, +First)
* (+RO)
libmprove610_MTKarm7_tcc.a (+RO)
__TEMPLATE
return $template;
}
#****************************************************************************
# subroutine: Layout :: UA_NONCACHED
# return: the body strings
#****************************************************************************
sub UA_NONCACHED_EV
{
my $template = <<"__TEMPLATE";
*.obj (PAGETABLE)
*.obj (NONCACHEDZI)
__TEMPLATE
return $template;
}
#****************************************************************************
# subroutine: Layout :: UA_RW
# return: the body strings
#****************************************************************************
sub UA_RW_EV
{
my $template = <<"__TEMPLATE";
* (+RW, +ZI)
libmprove610_MTKarm7_tcc.a (+RW, +ZI)
*.obj (FUE_EXT_SRAM)
__TEMPLATE
return $template;
}
#****************************************************************************
# subroutine: Layout :: UA_INTSRAM_CODE
# return: the body strings
#****************************************************************************
sub UA_INTSRAM_CODE_EV
{
my $template = <<"__TEMPLATE";
flash_mtd.obj (+RO)
flash_mtd.amd.obj (+RO)
flash_mtd.intel.obj (+RO)
*.obj (INTERNCODE) ;for codes that are used to load Primary ROM image
__TEMPLATE
return $template;
}
#****************************************************************************
# subroutine: Layout :: UA_INTSRAM_DATA
# return: the body strings
#****************************************************************************
sub UA_INTSRAM_DATA_EV
{
my $template = <<"__TEMPLATE";
fue_bootarm.obj (STACK_POOL_INTSRAM)
*.obj (INTERNZI)
__TEMPLATE
return $template;
}
#****************************************************************************
# subroutine: NFB Layout :: BL_UA_SHARED_SYS_RAM
# return: the body strings
#****************************************************************************
sub BL_UA_SHARED_SYS_RAM_EV
{
my $template = <<"__TEMPLATE";
*.obj (BL_FUE_SHARED_ZI, +First)
__TEMPLATE
return $template;
}
#****************************************************************************
# subroutine: Get TCM information
# input: BB chip
# return: ITCM: base address, size DTCM: base address size
#****************************************************************************
sub Get_TCM_info
{
my ($bb) = @_;
my ($strCODEBase, $strCODESize, $strDATABase, $strDATASize);
my %BB_INTSRAM_tbl =
( # $bb => [INTSRAM_CODE_Base, INTSRAM_CODE_Size, INTSRAM_DATA_Base, INTSRAM_DATA_Size]
'MT6235' => ["0x50000000", "0x0000C000", "0x50100000", "0x00014000"],
'MT6235B' => ["0x50000000", "0x0000C000", "0x50100000", "0x00014000"], #MT6235
'MT6236' => ["0x50000000", "0x00010000", "0x50100000", "0x0002B000"],
'MT6236B' => ["0x50000000", "0x00010000", "0x50100000", "0x0002B000"], #MT6236
'MT6268' => ["0x50000000", "0x00026000", "0x50100000", "0x0001B000"],
'MT6255' => ["0x50000000", "0x00010000", "0x50100000", "0x0002B000"],
);
if(exists $BB_INTSRAM_tbl{$bb})
{
$strCODEBase = $BB_INTSRAM_tbl{$bb}[0];
$strCODESize = $BB_INTSRAM_tbl{$bb}[1];
$strDATABase = $BB_INTSRAM_tbl{$bb}[2];
$strDATASize = $BB_INTSRAM_tbl{$bb}[3];
}
else
{
($strCODEBase, $strCODESize, $strDATABase, $strDATASize) = &sysUtil::GetIntsramInfo($bb);
}
$strCODEBase = "(kal_uint32)&Image\$\$UA_INTSRAM_CODE\$\$Base" if (&sysUtil::is_CR4($bb));
$strCODESize = "(kal_uint32)&Image\$\$UA_INTSRAM_CODE\$\$Length" if (&sysUtil::is_CR4($bb));
$strDATABase = "(kal_uint32)&Image\$\$UA_INTSRAM_DATA\$\$Base" if (&sysUtil::is_CR4($bb));
$strDATASize = "(kal_uint32)&Image\$\$UA_INTSRAM_DATA\$\$Length" if (&sysUtil::is_CR4($bb));
return ($strCODEBase, $strCODESize, $strDATABase, $strDATASize);
}
#****************************************************************************
# subroutine: Execution View Generator
# input: Region name [string], Begin [string], Length [string], Content [Array Reference]
# output: execution view body string
#****************************************************************************
sub format_execution_view
{
my ($name, $begin, $length, $ar) = @_;
my $formated_string = ' ' x 4 . $name . " $begin $length\n";
$formated_string .= ' ' x 4 . "{\n";
foreach (@$ar)
{
$formated_string .= ' ' x 9 . $_ . "\n";
}
$formated_string .= ' ' x 4 . "}\n";
return $formated_string;
}