blob: 832b8e662250c186346686bdc59d0f750bc80951 [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) 2006
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#* Filename:
38#* ---------
39#* cfgGen.pl
40#*
41#* Project:
42#* --------
43#*
44#*
45#* Description:
46#* ------------
47#* This script generates the CFG file for flash tool for SV5
48#*
49#* Author:
50#* -------
51#* Claudia Lo (mtk01876)
52#*
53#****************************************************************************/
54
55#****************************************************************************
56# Included Modules
57#****************************************************************************
58use strict;
59#****************************************************************************
60# Constants
61#****************************************************************************
62my $CFGGEN_VERNO = " m0.14";
63 # m0.14, add infomake.log
64 # m0.13, Make bin_list's content be an actual file
65 # m0.12, Add cmdScript.bin for MT6290
66 # m0.11, Support to add dsp bin if finding it in both flashtool.txt and bin folder
67 # m0.10, Remove FOTA input
68 # m0.09, Support Multibin by flashtool.txt from ldsGen
69 # m0.08, Support MDSYS binding chip name
70 # v0.28, Generate FS region by default
71 # m0.07, Support Guardian on linux
72 # m0.06, Fix parameters reversed in gen_external_memory_setting()
73 # m0.05, Support path and filename case sensitive on Linux (bypass sign path)
74 # m0.04, Support GCC temporarily
75 # m0.03, Add temp folder for the one
76 # m0.02 , Skip GCC temporarily
77 # m0.01 , Support MT6280
78 # v0.27 , Support VIVA in im_maker.ini
79 # v0.26 , Add Makefile optiion hash to gen_flash_info()
80 # v0.25 , Support VIVA - use scatter file of flashtool version to be input
81 # v0.24 , Support 6250
82 # v0.23 , Compare bin string in the same letter
83 # v0.22 , Add Makefile optiion hash to gen_external_memory_setting()
84 # v0.21 , Support MT6922
85 # v0.20 , Fix parsing MakeFile
86 # v0.19 , Remove $$ to support Perl v5.12
87 # v0.18 , CFG Gen re-structure to split into cfgGen.pl, cfgGen_EMI.pl, and cfgGen_flash.pl
88 # Parse pre-compiled custom_EMI.c to support compile options
89 # Support MT6256
90 # Support sign feature
91 # Support case-insensitive .bin/.IM extensions
92 # v0.17 , To support MT6255
93 # v0.16 , Rename custom_flash.c into custom_flash.h due to re-structure
94 # v0.15 , Support custom_FeatureConfig.h
95 # v0.14 , Generate Load_Address for BL and EXT_BL for IM_Maker.ini
96 # v0.13 , Add FS regions to cfg file for WISE MMI projects
97 # v0.12 , Generate EMI settings from CFG file under BB folder for those chips which do not support Auto-Gen
98 # v0.11 , Modify CardDL ini to generate BOOT_CERT region when BOOT_CERT is enabled, even if BOOT_CERT binary does not exist
99 # v0.10 , Modify CardDL ini to ensure Bootloader section always exists before Ext-Bootloader section
100 # v0.09 , Modify CardDL ini to add DSP regions and Serial Flash type, and to remove SECURE_RO_ME and SECURE_RO_S from ini files
101 # v0.08 , Remove SECURE_RO_S from cfg
102 # v0.07 , To support SV5 ROOT_CERT
103 # v0.06 , To support SV5 CFG file generation with EMI configurations
104 # v0.04 , To support Card DL ini gen
105 # v0.05 , Fix the issue that when Secure is turned on, binaries should be generated in the bin folder
106 # v0.03 , To support eMMC Booting
107 # v0.02 , Remove MT6255
108 # v0.01 , Remove SV5_DEV option and enable SV5 on all MT6276/MT6251/MT6255/MT6256 platforms
109 # v0.00 , initial version
110
111#****************************************************************************
112# Input Parameters and Global Variables
113#****************************************************************************
114my $ACTION = $ARGV[0]; # 1: cfg file for SV5; 2: ini file for Card DL
115my $BUILD_PATH = $ARGV[1];
116my $MAUI_BIN = $ARGV[2];
117my $BL_BIN = $ARGV[3];
118my $MAKEFILE = $ARGV[4];
119my $BB_PATH = $ARGV[5];
120my $SCATTER = $ARGV[6];
121my $CC_CMD = $ARGV[7];
122my $VIA_CMD = $ARGV[8];
123my $OPTION_TMP = $ARGV[9];
124my $NET_PATH = $ARGV[10];
125my $TMP_FOLDER = $ARGV[11];
126my $INFOMAKE_PATH = $ARGV[12];
127my $ACT_SIGN = $ARGV[13];
128my $CUSTOM_MEM_DEV_H = $BB_PATH . "/custom_MemoryDevice.h";
129my $CUSTOM_FEATURE_CONFIG_H = $BB_PATH . "/custom_FeatureConfig.h";
130my $SCATTER_FLASH = $SCATTER;
131$SCATTER_FLASH =~ s/\.txt/_flashtool\.txt/;
132$SCATTER = $SCATTER_FLASH if(-e $SCATTER_FLASH);
133
134my $DebugPrint = 1;
135
136print "BUILD_PATH: $BUILD_PATH, MAUI_BIN: $MAUI_BIN, BL_BIN: $BL_BIN, MAKEFILE: $MAKEFILE, BB_PATH: $BB_PATH, SCATTER: $SCATTER, CC_CMD=$CC_CMD, VIA_CMD=$VIA_CMD, OPTION_TMP=$OPTION_TMP, Temp folder=$TMP_FOLDER\n" if ($DebugPrint == 1);
137
138# --- --- ---
139my %BBtbl_SV5 =
140 (
141 'MT6280' => 1,
142 'MT6290' => 1,
143 );
144
145#****************************************************************************
146# 1 >>> parse Project Make File
147#****************************************************************************
148my %MAKEFILE_OPTIONS;
149my $keyname;
150
151&error_handler("$MAKEFILE: NOT exist!", __FILE__, __LINE__) if (!-e $MAKEFILE);
152
153if ($MAKEFILE =~ /make\/(\w+)_(\w+).mak/i) {
154 $MAKEFILE_OPTIONS{'MODE'} = uc($2);
155}
156
157open (FILE_HANDLE, "<$MAKEFILE") or &error_handler("$MAKEFILE: file error!", __FILE__, __LINE__);
158while (<FILE_HANDLE>) {
159 if ((/^([^\#]*)\#?.*/) && ($1 =~ /^(\w+)\s*=\s*(.*\S)\s*$/))
160 {
161 $MAKEFILE_OPTIONS{lc($1)} = uc($2);
162 $MAKEFILE_OPTIONS{uc($1)} = uc($2);
163 }
164}
165close (FILE_HANDLE);
166my $PLATFORM = $MAKEFILE_OPTIONS{'platform'};
167$PLATFORM .= "_".$MAKEFILE_OPTIONS{'MDSYS'} if(exists $MAKEFILE_OPTIONS{MDSYS} and $MAKEFILE_OPTIONS{MDSYS} !~/none/i);
168my $COMPILER = $MAKEFILE_OPTIONS{'compiler'};
169
170#****************************************************************************
171# 2 >>> parse Scatter File
172#****************************************************************************
173
174my (%LoadView, %ExecView);
175&ParseScatterFile($SCATTER, \%LoadView, \%ExecView);
176
177#****************************************************************************
178# 3 >>> get custom_FeatureConfig.h configurations
179#****************************************************************************
180my %FEATURE_CONFIG_H_Value;
181
182open (FEATURE_CONFIG_H_HANDLE, "<$CUSTOM_FEATURE_CONFIG_H") or &error_handler("$CUSTOM_FEATURE_CONFIG_H: file error!", __FILE__, __LINE__);
183while (<FEATURE_CONFIG_H_HANDLE>) {
184 if (/^#define\s+(\w+)\s+\((\w*)\)/ || /^#define\s+(\w+)\s+(\w*)/)
185 {
186 my $option = $1;
187 my $value = $2;
188
189 &error_handler("$CUSTOM_FEATURE_CONFIG_H: $option redefined in custom_FeatureConfig.h!", __FILE__, __LINE__) if defined($FEATURE_CONFIG_H_Value{$option});
190 if ((!defined $value) or ($value eq ''))
191 {
192 $FEATURE_CONFIG_H_Value{$option} = 'TRUE';
193 }
194 else
195 {
196 $FEATURE_CONFIG_H_Value{$option} = $value;
197 }
198 }
199}
200close (FEATURE_CONFIG_H_HANDLE);
201
202#****************************************************************************
203# 4 >>> get all binary list
204#****************************************************************************
205my (%bin_list, $bin_file);
206
207### For projects that contains more than 1 binary, the output binaries are under .bin folder
208my $tmp_bin_folder = $BUILD_PATH . "/" . $MAUI_BIN;
209if (opendir(TMP_DIR, $tmp_bin_folder))
210{
211 $BUILD_PATH = $BUILD_PATH . "/" . $MAUI_BIN;
212}
213closedir(TMP_DIR);
214print "BIN folder: $BUILD_PATH\n" if ($DebugPrint == 1);
215
216opendir(BIN_DIR, $BUILD_PATH) or die "cannot open build folder $BUILD_PATH!";
217while (defined($bin_file = readdir(BIN_DIR)))
218{
219 next if(!-f "$BUILD_PATH\/$bin_file");
220 ### binary files are those without extentions (e.g. .txt, .cfg), or with only .bin extention
221 if ($bin_file =~ /\./)
222 {
223 if ($bin_file =~ /\.bin$/i)
224 {
225 $bin_list{$bin_file} = 'NONE';
226 }
227 elsif ($bin_file =~ /\.IM$/i)
228 {
229 $bin_list{$bin_file} = 'FS';
230 }
231 }
232 else
233 {
234 $bin_list{$bin_file} = 'NONE';
235 }
236}
237closedir(BIN_DIR);
238
239### handle exception: BOOT_CERT might not contain binary
240my $boot_cert_bin_exist = 'FALSE';
241foreach (keys %bin_list)
242{
243 if (/BOOT_CERT/)
244 {
245 $boot_cert_bin_exist = 'TRUE';
246 last;
247 }
248}
249if ($boot_cert_bin_exist eq 'FALSE')
250{
251 $bin_list{'BOOT_CERT'} = 'NONE';
252}
253
254### Sort bin_list according to scatter file sequence
255my @sorted_bin_list;
256
257# Handle BOOTLOADER first
258foreach (keys %bin_list) # handle exception: for NFB projects, scatter file may not contain BOOTLOADER and EXT_BOOTLOADER
259{
260 my $cur_bin = $_;
261 if (uc($cur_bin) eq uc($BL_BIN))
262 {
263 my $bl_in_scat = 'FALSE';
264 foreach (keys %LoadView)
265 {
266 if ($_ eq 'BOOTLOADER')
267 {
268 $bl_in_scat = 'TRUE';
269 last;
270 }
271 }
272 if ($bl_in_scat eq 'FALSE')
273 {
274 push @sorted_bin_list, $cur_bin;
275
276 ### ROOT_CERT always lies behind BL; does not have binary; depending on custom_MemoryDevice.h option
277 if ((&config_query_sv5($PLATFORM) == 1) and (defined $MAKEFILE_OPTIONS{'secure_support'} and $MAKEFILE_OPTIONS{'secure_support'} eq 'TRUE') and (defined $FEATURE_CONFIG_H_Value{ROOT_KEY_MANAGEMENT_ENABLE} and $FEATURE_CONFIG_H_Value{ROOT_KEY_MANAGEMENT_ENABLE} eq 'TRUE'))
278 {
279 push @sorted_bin_list, "ROOT_CERT";
280 }
281 }
282 }
283}
284
285# Handle EXT_BOOTLOADER secondly
286foreach (keys %bin_list) # handle exception: for NFB projects, scatter file may not contain BOOTLOADER and EXT_BOOTLOADER
287{
288 my $cur_bin = $_;
289 if (uc($cur_bin) eq 'EXT_BOOTLOADER')
290 {
291 my $extbl_in_scat = 'FALSE';
292 foreach (keys %LoadView)
293 {
294 if ($_ eq 'EXT_BOOTLOADER')
295 {
296 $extbl_in_scat = 'TRUE';
297 last;
298 }
299 }
300 if ($extbl_in_scat eq 'FALSE')
301 {
302 push @sorted_bin_list, $cur_bin;
303 }
304 }
305}
306
307foreach (sort {$LoadView{$a}->{'seq'} <=> $LoadView{$b}->{'seq'}} keys %LoadView)
308{
309 my $scat_key = $_;
310
311 ### Some binaries have different names as the one in scatter file
312 if ($scat_key eq 'ROM')
313 {
314 if ($BUILD_PATH =~ /$MAUI_BIN/) # multiple binary files under MAUI_BIN folder
315 {
316 }
317 else
318 {
319 $scat_key = $MAUI_BIN;
320 }
321 }
322 elsif ($scat_key eq 'BOOTLOADER')
323 {
324 $scat_key = $BL_BIN;
325 }
326 elsif($scat_key =~ /DSP/)
327 {
328 map {$scat_key =$_ if($_ =~ /dsp/i)} keys %bin_list;
329 }
330
331 foreach my $temp (keys %bin_list)
332 {
333 if (uc($scat_key) eq uc($temp))
334 {
335 push @sorted_bin_list, $temp;
336
337 if ($scat_key eq $BL_BIN)
338 {
339 ### ROOT_CERT always lies behind BL; does not have binary; depending on custom_MemoryDevice.h option
340 if ((&config_query_sv5($PLATFORM) == 1) and (defined $MAKEFILE_OPTIONS{'secure_support'} and $MAKEFILE_OPTIONS{'secure_support'} eq 'TRUE') and (defined $FEATURE_CONFIG_H_Value{ROOT_KEY_MANAGEMENT_ENABLE} and $FEATURE_CONFIG_H_Value{ROOT_KEY_MANAGEMENT_ENABLE} eq 'TRUE'))
341 {
342 push @sorted_bin_list, "ROOT_CERT";
343 }
344 }
345 last;
346 }
347 }
348}
349
350if ($DebugPrint == 1)
351{
352 foreach (@sorted_bin_list)
353 {
354 print "bin: $_\n";
355 }
356}
357
358#****************************************************************************
359# 5 >>> generate the output cfg file for SV5
360#****************************************************************************
361my $BOARD_VER = $MAKEFILE_OPTIONS{'board_ver'};
362my $CFG_FILE = $BUILD_PATH . "/" . $BOARD_VER . "\.cfg";
363if ($ACTION == 1)
364{
365 ### Only generate CFG file for SV5
366 if ((defined &config_query_sv5($PLATFORM)) and (&config_query_sv5($PLATFORM) == 1))
367 {
368 require "pcore/tools/cfgGen_EMI.pl";
369
370 open (CFG_FILE, ">$CFG_FILE") or &error_handler("$CFG_FILE: file error!", __FILE__, __LINE__);
371
372 print CFG_FILE &gen_general_setting();
373 print CFG_FILE &gen_boot_region_setting($PLATFORM);
374 print CFG_FILE &gen_control_block_region_setting();
375 print CFG_FILE &gen_main_region_setting();
376 print CFG_FILE &gen_fs_region_setting();
377 print CFG_FILE &gen_external_memory_setting($BB_PATH, $BOARD_VER, $PLATFORM, $CC_CMD, $VIA_CMD, $OPTION_TMP, $TMP_FOLDER, \%MAKEFILE_OPTIONS);
378 print "$CFG_FILE is generated\n";
379
380 ### Sign
381 if ($ACT_SIGN eq "-sign")
382 {
383 my $CFG_FILE_NET_PATH = $CFG_FILE;
384 $CFG_FILE_NET_PATH =~ s/^\.\///;
385 print "CFG_FILE_NET_PATH = $NET_PATH/$CFG_FILE_NET_PATH\n";
386 if($^O eq "MSWin32")
387 {
388 system("\\\\mbjsap101\\Guardian_Programs\\Guardian\\bin\\Debug\\Guardian.exe $NET_PATH\\$CFG_FILE_NET_PATH");
389 }
390 else
391 {
392 system("/proj/wcp1sm/Guardian $NET_PATH/$CFG_FILE_NET_PATH");
393 }
394 }
395 }
396}
397
398#****************************************************************************
399# 6 >>> generate the output ini file for Card DL
400#****************************************************************************
401my $INI_FILE = $BB_PATH . "/IM_Maker.ini";
402
403if ($ACTION == 2)
404{
405 &error_handler("Not support generating IM_Maker.ini under GCC!", __FILE__, __LINE__) if($COMPILER eq "GCC");
406 ### Only generate ini file for Card DL
407 if ((defined $MAKEFILE_OPTIONS{'card_download'}) and ($MAKEFILE_OPTIONS{'card_download'} ne 'NONE'))
408 {
409 require "pcore/tools/cfgGen_flash.pl";
410
411 open (INI_FILE, ">$INI_FILE") or &error_handler("$INI_FILE: file error!", __FILE__, __LINE__);
412
413 print INI_FILE &gen_flash_info($BB_PATH, $BOARD_VER, $PLATFORM, \%MAKEFILE_OPTIONS);
414 print INI_FILE &gen_general_setting_for_ini();
415 print INI_FILE &gen_bin_info();
416 print "$INI_FILE is generated\n";
417 }
418}
419
420exit;
421
422
423#****************************************************************************
424# subroutine: SCHEME Configure Routines :: Query :: SV5 Family
425# input: BB chip
426# Output: whether this chip enables SV5
427#****************************************************************************
428sub config_query_sv5
429{
430 my ($bb) = @_;
431 return $BBtbl_SV5{$bb};
432}
433
434#****************************************************************************
435# subroutine: gen_general_setting
436# return: General Setting
437#****************************************************************************
438sub gen_general_setting
439{
440 my $template = <<"__TEMPLATE";
441############################################################################################################
442#
443# General Setting
444#
445############################################################################################################
446
447general:
448 config_version : alpha # config file version ("alpha", "beta" is used before SQC done.)
449 # After SQC done, the version should be "1" for the first release version.
450 platform: $PLATFORM # It is used for tool to identify the right setting for specific target
451
452__TEMPLATE
453}
454
455#****************************************************************************
456# subroutine: gen_boot_region_setting
457# return: Boot Region Setting
458#****************************************************************************
459sub gen_boot_region_setting
460{
461 my ($bb) = @_;
462 my $boot_region_list;
463 $boot_region_list .= " - file: cmdScript.bin\n" if($bb eq "MT6290");
464 ### Boot Region includes all binaries with naming with BOOTLOADER or BL
465 foreach (@sorted_bin_list)
466 {
467 if (/BOOTLOADER/ or /DSP_BL/)
468 {
469 $bin_list{$_} = 'BOOT';
470 $boot_region_list .= " - file: " . $_ . "\n";
471 }
472 elsif ($_ eq 'ROOT_CERT')
473 {
474 $bin_list{$_} = 'BOOT';
475 $boot_region_list .= " - file: ROOT_CERT\n";
476 }
477 }
478 chomp $boot_region_list;
479
480 my $template = <<"__TEMPLATE";
481############################################################################################################
482#
483# Boot Region Setting
484#
485############################################################################################################
486
487boot_region:
488 alignment: block # block[default], page(NAND:2K/512B, NOR: 1KB, eMMC: 512B, SF: 256B)
489 rom:
490$boot_region_list
491
492__TEMPLATE
493}
494
495#****************************************************************************
496# subroutine: gen_control_block_region_setting
497# return: Control Block Region Setting
498#****************************************************************************
499sub gen_control_block_region_setting
500{
501 my $cbr_region_list;
502
503 ### Control Block Region includes all binaries with naming with SECURE_RO
504 foreach (@sorted_bin_list)
505 {
506 if (/SECURE_RO/)
507 {
508 next if ($_ eq 'SECURE_RO_S');
509 $bin_list{$_} = 'CBR';
510 $cbr_region_list .= " - file: " . $_ . "\n";
511 }
512 }
513 chomp $cbr_region_list;
514
515 my $template = <<"__TEMPLATE";
516############################################################################################################
517#
518# Control Block Region Setting
519#
520############################################################################################################
521
522control_block_region:
523 rom:
524$cbr_region_list
525
526__TEMPLATE
527}
528
529#****************************************************************************
530# subroutine: gen_main_region_setting
531# return: Main Region Setting
532#****************************************************************************
533sub gen_main_region_setting
534{
535 my $main_region_list;
536
537 ### Main Region includes all other binaries
538 foreach (@sorted_bin_list)
539 {
540 next if ($_ eq 'SECURE_RO_S');
541 if ($bin_list{$_} eq 'NONE')
542 {
543 $main_region_list .= " - file: " . $_ . "\n";
544 }
545 }
546 chomp $main_region_list;
547
548 my $template = <<"__TEMPLATE";
549############################################################################################################
550#
551# Main Region Setting
552#
553############################################################################################################
554
555main_region:
556 alignment: block # block[default], page(NAND:2K/512B, NOR: 1KB, eMMC: 512B, SF: 256B)
557 rom:
558$main_region_list
559
560__TEMPLATE
561}
562
563#****************************************************************************
564# subroutine: gen_fs_region_setting
565# return: File System Region Setting
566#****************************************************************************
567sub gen_fs_region_setting
568{
569 my $fs_region_list;
570 ### File System Region includes all IM files
571 foreach (keys %bin_list)
572 {
573 if ($bin_list{$_} eq 'FS')
574 {
575 $fs_region_list .= " - file: " . $_ . "\n";
576 }
577 }
578 chomp $fs_region_list;
579
580 my $template = <<"__TEMPLATE";
581############################################################################################################
582#
583# File System Region Setting
584#
585############################################################################################################
586
587file_system_region:
588 rom:
589$fs_region_list
590
591__TEMPLATE
592}
593
594#****************************************************************************
595# subroutine: gen_general_setting_for_ini
596# return: General Setting
597#****************************************************************************
598sub gen_general_setting_for_ini
599{
600 my $base_dir = $BUILD_PATH;
601 $base_dir =~ s/^\.\///;
602
603 my $template = <<"__TEMPLATE";
604[General Setting]
605Base_Directory=$base_dir
606
607__TEMPLATE
608}
609
610#****************************************************************************
611# subroutine: gen_bin_info
612# return: Binary information
613#****************************************************************************
614sub gen_bin_info
615{
616 my $bin_str;
617 my $res_bin = 1; # Resource Bin such as LANG_PACK_ROM, CUSTPACK_ROM, JUMP_TABLE
618 my $cust_bin = 1; # all other binaries
619
620 ### Parse scatter file to find binaries sequentially
621 foreach (@sorted_bin_list)
622 {
623 next if (/SECURE_RO/); # SECURE_RO regions cannot be updated, so skip them
624 if (uc($_) eq uc($BL_BIN)) # [Bootloader] region represents BL bin
625 {
626 my $load_address;
627 if (defined $LoadView{'BOOTLOADER'}->{'begin'})
628 {
629 $load_address = "Load_Address=$LoadView{'BOOTLOADER'}->{'begin'}";
630 }
631 $bin_str .= <<"__TEMPLATE";
632[Bootloader]
633File=$BL_BIN
634$load_address
635
636__TEMPLATE
637 }
638 elsif (/EXT_BOOTLOADER/) # [Ext-Bootloader] region represents the region with naming as EXT_BOOTLOADER
639 {
640 my $load_address;
641 if (defined $LoadView{'EXT_BOOTLOADER'}->{'begin'})
642 {
643 $load_address = "Load_Address=$LoadView{'EXT_BOOTLOADER'}->{'begin'}";
644 }
645 $bin_str .= <<"__TEMPLATE";
646[Ext-Bootloader]
647File=$_
648$load_address
649
650__TEMPLATE
651 }
652 elsif (($_ eq $MAUI_BIN) or ($_ eq 'ROM')) # [Primary MAUI] region represents the ROM region
653 {
654 my $load_addr = ($LoadView{'ROM'}->{'begin'} =~ /\+/) ? "0x0" : $LoadView{'ROM'}->{'begin'};
655 $bin_str .= <<"__TEMPLATE";
656[Primary MAUI]
657File=$_
658Load_Address=$load_addr
659
660__TEMPLATE
661 }
662 elsif ($_ eq 'SECONDARY_ROM') # [Secondary MAUI] region represents the SECONDARY_ROM region
663 {
664 $bin_str .= <<"__TEMPLATE";
665[Secondary MAUI]
666File=$_
667Load_Address=$LoadView{$_}->{'begin'}
668
669__TEMPLATE
670 }
671 elsif ($_ eq 'THIRD_ROM') # [Third MAUI] region represents the THIRD_ROM region
672 {
673 $bin_str .= <<"__TEMPLATE";
674[Third MAUI]
675File=$_
676Load_Address=$LoadView{$_}->{'begin'}
677
678__TEMPLATE
679 }
680 elsif ($_ eq 'VIVA') # [VIVA] region represents the VIVA region
681 {
682 $bin_str .= <<"__TEMPLATE";
683[VIVA]
684File=$_
685Load_Address=$LoadView{$_}->{'begin'}
686
687__TEMPLATE
688 }
689 elsif ($_ eq 'BOOT_CERT') # [Boot Cert] region represents the BOOT_CERT region
690 {
691 $bin_str .= <<"__TEMPLATE";
692[Boot Cert]
693File=$_
694Load_Address=$LoadView{$_}->{'begin'}
695
696__TEMPLATE
697 }
698 elsif (/DEMAND_PAGING/) # [Demand Paging] region represents the DEMAND_PAGING_ROMx region
699 {
700 $bin_str .= <<"__TEMPLATE";
701[Demand Paging]
702File=$_
703Load_Address=$LoadView{$_}->{'begin'}
704
705__TEMPLATE
706 }
707 elsif (($_ eq 'LANG_PACK_ROM') or ($_ eq 'CUSTPACK_ROM') or ($_ eq 'JUMP_TABLE')) # [Resource Binx] region represents Resource Bin regions (MBA)
708 {
709 $bin_str .= <<"__TEMPLATE";
710[Resource Bin$res_bin]
711File=$_
712Load_Address=$LoadView{$_}->{'begin'}
713
714__TEMPLATE
715 $res_bin++;
716 }
717 elsif ($_ eq 'DSP_BL') # [DSP-Bootloader] region represents DSP Bootloader region
718 {
719 $bin_str .= <<"__TEMPLATE";
720[DSP-Bootloader]
721File=$_
722Load_Address=$LoadView{$_}->{'begin'}
723
724__TEMPLATE
725 }
726 elsif ($_ eq 'DSP_ROM') # [DSP MAUI] region represents DSP main binary
727 {
728 $bin_str .= <<"__TEMPLATE";
729[DSP MAUI]
730File=$_
731Load_Address=$LoadView{$_}->{'begin'}
732
733__TEMPLATE
734 }
735 else # [Customer Binx] region represents all other regions
736 {
737 $bin_str .= <<"__TEMPLATE";
738[Customer Bin$cust_bin]
739File=$_
740Load_Address=$LoadView{$_}->{'begin'}
741
742__TEMPLATE
743 $cust_bin++;
744 }
745 }
746
747 my $template = <<"__TEMPLATE";
748$bin_str
749__TEMPLATE
750}
751
752#****************************************************************************
753# subroutine: parse_region_string
754# input: reference to %LoadView or %ExecView ; Region Name start address string
755# return: %LoadView ; key = RegionName , value = hash ref , begin , attr , length
756#****************************************************************************
757my $sequence = 0;
758sub parse_region_string
759{
760 my ($hash_ref, $string) = @_;
761 my %tmp;
762
763 if ($string =~ m/(\S+)\s+(\S+)\s+OVERLAY\s+(\S+)/)
764 {
765 #print 'PATTERN1', "\t", $1, "\t", $2, "\t", 'OVERLAY', "\t", $3 , "\n";
766 $tmp{'seq'} = ++$sequence;
767 $tmp{'attr'} = "OVERLAY";
768 $tmp{'begin'} = $2;
769 $tmp{'length'} = $3;
770 $hash_ref->{$1} = \%tmp;
771 }
772 elsif ($string =~ m/(\S+)\s+(\S+)\s+FIXED\s+(\S+)/)
773 {
774 #print 'PATTERN1', "\t", $1, "\t", $2, "\t", 'FIXED', "\t", $3, "\n";
775 $tmp{'seq'} = ++$sequence;
776 $tmp{'attr'} = "FIXED";
777 $tmp{'begin'} = $2;
778 $tmp{'length'} = $3;
779 $hash_ref->{$1} = \%tmp;
780 }
781 elsif ($string =~ m/(\S+)\s+(\S+)\s+(\S+)/)
782 {
783 #print 'PATTERN3', "\t", $1, "\t", $2, "\t", $3, "\n";
784 $tmp{'seq'} = ++$sequence;
785 $tmp{'begin'} = $2;
786 $tmp{'length'} = $3;
787 $hash_ref->{$1} = \%tmp;
788 }
789 elsif ($string =~ m/(\S+)\s+(\S+)/)
790 {
791 #print 'PATTERN4', "\t", $1, "\t", $2, "\n";
792 $tmp{'seq'} = ++$sequence;
793 $tmp{'begin'} = $2;
794 $hash_ref->{$1} = \%tmp;
795 }
796 elsif ($string =~ m/(\S+)/)
797 {
798 print 'PATTERN5-Fake scatter' , "\t", $1 , "\n";
799 $tmp{'seq'} = ++$sequence;
800 $tmp{'begin'} = undef;
801 $hash_ref->{$1} = \%tmp;
802 }
803 else
804 {
805 warn "UNKNOWN PATTERN : $string";
806 }
807}
808
809#****************************************************************************
810# subroutine: parse_scatter_file_structure
811# return: %LoadView , %ExecView
812#****************************************************************************
813sub parse_scatter_file_structure
814{
815 my ($Scat_Content, $LoadView_href, $ExeView_href) = @_;
816 my $last_line_no;
817 my $text_line;
818 my $view=0; #counter , 1 = load view , 2 = exec view
819 foreach my $file_line_no (sort {$a <=> $b} keys %$Scat_Content)
820 {
821 $text_line = $Scat_Content->{$file_line_no};
822 if ($text_line =~ m/{/)
823 {
824 if ($view > 1)
825 {
826 &error_handler("$SCATTER: Unrecognizable view at $file_line_no!", __FILE__, __LINE__);
827 }
828 $view++;
829 if (not defined $last_line_no)
830 {
831 &error_handler("$SCATTER: No region name detected before $file_line_no!", __FILE__, __LINE__);
832 }
833 &parse_region_string( ($view == 1) ? $LoadView_href : $ExeView_href , $Scat_Content->{$last_line_no} );
834 }
835 elsif ($text_line =~ m/}/)
836 {
837 $view--;
838 if ($view < 0)
839 {
840 &error_handler("$SCATTER: Unrecognizable view at $file_line_no!", __FILE__, __LINE__);
841 }
842 }
843 $last_line_no = $file_line_no;
844 }
845}
846
847sub ParseScatterFile
848{
849 my ($SCATTER, $LoadView_href, $ExeView_href) = @_;
850 my %Scat_Content;
851 open (SCAT_HANDLE, "<$SCATTER") or &error_handler("$SCATTER: file error!", __FILE__, __LINE__);
852 while (<SCAT_HANDLE>) {
853 if (/ALIGN/) { $Scat_Content{$.} = $_; }
854 if (/\(.+\)/) {next;}
855 if (/;/) {s/;.*//;}
856 if (/{/ or /}/ or /\S+/) { $Scat_Content{$.} = $_; }
857 }
858 close (SCAT_HANDLE);
859
860 &parse_scatter_file_structure(\%Scat_Content, $LoadView_href, $ExeView_href);
861
862 if ($DebugPrint == 1)
863 {
864 foreach (sort {$LoadView{$a}->{'seq'} <=> $LoadView{$b}->{'seq'}} keys %LoadView)
865 {
866 printf("Load View %d: $_\n", $LoadView{$_}->{'seq'});
867 }
868 }
869}
870
871#****************************************************************************
872# subroutine: error_handler
873# input: $error_msg: error message
874#****************************************************************************
875sub error_handler
876{
877 my ($error_msg, $file, $line_no) = @_;
878
879 my $final_error_msg = "CFGGEN ERROR: $error_msg at $file line $line_no\n";
880 print $final_error_msg;
881 die $final_error_msg;
882}
883