You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1086 lines
34 KiB

package mtk_modem;
use strict;
use File::Basename;
use Exporter;
use vars qw(@ISA @EXPORT @EXPORT_OK);
@ISA = qw(Exporter);
@EXPORT = qw(Get_MD_X_From_Bind_Sys_Id Get_MD_YY_From_Image_Type Parse_MD_Struct Check_MD_Info get_modem_file_mapping get_modem_name);
@EXPORT_OK = qw(Get_MD_X_From_Bind_Sys_Id Get_MD_YY_From_Image_Type Parse_MD_Struct Check_MD_Info get_modem_file_mapping get_modem_name);
# availible yy for specified x, the yy value is not used at this moment
our %MTK_MODEM_MAP_X_TO_YY =
(
1 => "2g wg tg lwg ltg sglte ultg ulwg ulwtg ulwcg ulwctg unlwtg unlwctg",
2 => "2g wg tg lwg ltg sglte ultg ulwg ulwtg ulwcg ulwctg",
3 => "2g 3g ulwcg ulwctg",
5 => "2g wg tg lwg ltg sglte"
);
our %MTK_MODEM_MAP_YY_TO_IMAGE_TYPE =
(
"2g" => 0x01,
"3g" => 0x02,
"wg" => 0x03,
"tg" => 0x04,
"lwg" => 0x05,
"ltg" => 0x06,
"sglte" => 0x07,
"ultg" => 0x08,
"ulwg" => 0x09,
"ulwtg" => 0x0A,
"ulwcg" => 0x0B,
"ulwctg" => 0x0C,
"unlwtg" => 0x0D,
"unlwctg" => 0x0E
);
# input: bind_sys_id
# output: x
sub Get_MD_X_From_Bind_Sys_Id
{
my $input = shift @_;
if (exists $MTK_MODEM_MAP_X_TO_YY{$input})
{
return $input;
}
elsif ($input == 0)
{
return 1;
}
else
{
die "Invalid modem bind_sys_id = $input";
}
}
# input: image_type
# output: yy
sub Get_MD_YY_From_Image_Type
{
my $input = shift @_;
my $output = "";
foreach my $key (keys %MTK_MODEM_MAP_YY_TO_IMAGE_TYPE)
{
if ($MTK_MODEM_MAP_YY_TO_IMAGE_TYPE{$key} == $input)
{
$output = $key;
}
}
if ($output eq "")
{
die "Invalid modem image_type = $input";
}
return $output;
}
# input: aaa/bbb.c
# output: bbb.c
sub Get_Basename
{
my ($tmpName) = @_;
my $baseName;
$baseName = $1 if ($tmpName =~ /.*\/(.*)/);
return $baseName;
}
# get modem header struct from modem image content
sub Parse_MD_Struct
{
my ($ref_hash, $parse_md_file) = @_;
my $buffer;
my $length1 = 188; # modem image rear
my $length2 = 172;
my $length3 = 128; # modem.img project name
my $length4 = 36; # modem.img flavor
my $length5 = 64; # modem.img verno
my $whence = 0;
my $md_file_size = -s $parse_md_file;
my $pad_size = 0;
open(MODEM, "< $parse_md_file") or die "Can NOT open file $parse_md_file\n";
binmode(MODEM);
seek(MODEM, 0, $whence) or die;
read(MODEM, $buffer, 4) or die;
my $magic = unpack("I", $buffer);
if ($magic == 0x58881688)
{
# found IMG_HDR_T
read(MODEM, $buffer, 4) or die;
my $dsize = unpack("I", $buffer);
seek(MODEM, 4 + 4 + 32 + 4 + 4 + 4, $whence) or die;
read(MODEM, $buffer, 4) or die;
my $hdr_size = unpack("I", $buffer);
$pad_size = $md_file_size - $dsize - $hdr_size;
}
seek(MODEM, $md_file_size - $pad_size - 4, $whence) or die;
read(MODEM, $buffer, 4) or die;
my $size = unpack("L", $buffer);
if (($size < $length2) or ($size > $md_file_size))
{
# sanity test for struct size
}
else
{
$length1 = $size;
seek(MODEM, $md_file_size - $pad_size - $length3 - $length4 - $length5 - $length1, $whence) or die "Can NOT seek to the position of modem image rear in \"$parse_md_file\"!\n";
read(MODEM, $buffer, $length3 + $length4 + $length5 + $length2) or die "Failed to read the rear of the file \"$parse_md_file\"!\n";
($ref_hash->{"project_name"}, $ref_hash->{"flavor"}, $ref_hash->{"verno"}, $ref_hash->{"check_header"}, $ref_hash->{"header_verno"}, $ref_hash->{"product_ver"}, $ref_hash->{"image_type"}, $ref_hash->{"platform"}, $ref_hash->{"build_time"}, $ref_hash->{"build_ver"}, $ref_hash->{"bind_sys_id"}) = unpack("A128 A36 A64 A12 L L L A16 A64 A64 L", $buffer);
}
if ($ref_hash->{'check_header'} ne "CHECK_HEADER")
{
#print "!!!" . $ref_hash->{'check_header'} . "!!!\n";
warn "Reading from MODEM failed! No CHECK_HEADER info!\n";
delete $ref_hash->{"project_name"};
delete $ref_hash->{"flavor"};
delete $ref_hash->{"verno"};
delete $ref_hash->{"check_header"};
delete $ref_hash->{"header_verno"};
delete $ref_hash->{"product_ver"};
delete $ref_hash->{"image_type"};
delete $ref_hash->{"platform"};
delete $ref_hash->{"build_time"};
delete $ref_hash->{"build_ver"};
delete $ref_hash->{"bind_sys_id"};
close(MODEM);
return 0;
}
elsif ($ref_hash->{"header_verno"} < 2)
{
delete $ref_hash->{"project_name"};
delete $ref_hash->{"flavor"};
delete $ref_hash->{"verno"};
}
elsif ($ref_hash->{"header_verno"} >= 3)
{
read(MODEM, $buffer, 4*5) or die "Failed to read the rear of the file \"$parse_md_file\"!\n";
($ref_hash->{"mem_size"}, $ref_hash->{"md_img_size"}, $ref_hash->{"rpc_sec_mem_addr"}, $ref_hash->{"dsp_img_offset"}, $ref_hash->{"dsp_img_size"}) = unpack("L L L L L", $buffer);
}
close(MODEM);
return 1;
}
sub Check_MD_Info
{
my $ref_hash = shift @_;
my $md_id = shift @_;
my $MD_IMG = shift @_;
my $debug = shift @_;
#######################################
# Check if MODEM file exists
#######################################
print "\$MD_IMG = $MD_IMG\n";
die "[MODEM CHECK FAILED]: The file \"$MD_IMG\" does NOT exist!\n" if (! -e $MD_IMG);
#######################################
# Read mode(2G/3G), debug/release flag, platform info, project info, serial number, etc. from modem.img
#######################################
my $res = &Parse_MD_Struct($ref_hash, $MD_IMG);
if ($res != 1)
{
die;
}
my $MD_IMG_DEBUG = $ref_hash->{"product_ver"};
my $MD_IMG_MODE = $ref_hash->{"image_type"};
my $MD_IMG_PLATFORM = $ref_hash->{"platform"};
my $MD_IMG_PROJECT_ID = $ref_hash->{"build_ver"};
my $MD_IMG_SERIAL_NO = $ref_hash->{"bind_sys_id"};
#######################################
# Output debug information
#######################################
if ($debug)
{
print "*** Info from $md_id modem image ***\n\n";
print "modem image is $MD_IMG\n";
print "\$MD_IMG_DEBUG = $MD_IMG_DEBUG [" . sprintf("0x%08x",$MD_IMG_DEBUG) . "]\n";
print "\$MD_IMG_MODE = $MD_IMG_MODE [" . sprintf("0x%08x",$MD_IMG_MODE) . "]\n";
print "\$MD_IMG_PLATFORM = $MD_IMG_PLATFORM\n";
print "\$MD_IMG_PROJECT_ID = $MD_IMG_PROJECT_ID\n";
print "\$MD_IMG_SERIAL_NO = $MD_IMG_SERIAL_NO [" . sprintf("0x%08x",$MD_IMG_SERIAL_NO) . "]\n";
}
return 0;
}
# get modem image name for _x_yy_z part from modem image content
sub get_modem_suffix
{
my $ref_header = shift @_;
my $flag_force = shift @_;
my $naming_string;
my $MD_HEADER_VERNO = $ref_header->{"header_verno"};
my $MD_IMG_SERIAL_NO = $ref_header->{"bind_sys_id"};
my $MD_IMG_MODE = $ref_header->{"image_type"};
if (($flag_force == 2) || (($flag_force != 1) && ($MD_HEADER_VERNO == 2)))
{
# "*_x_yy_z"
$naming_string = "_" . Get_MD_X_From_Bind_Sys_Id($MD_IMG_SERIAL_NO);
$naming_string .= "_" . Get_MD_YY_From_Image_Type($MD_IMG_MODE);
#if ((exists $ref_header->{"mem_size"}) && ($ref_header->{"mem_size"} > 90*1024*1024))
#{
# $naming_string .= "_" . "s";
#}
#else
#{
$naming_string .= "_" . "n";
#}
}
elsif (($flag_force == 1) || (($flag_force != 2) && ($MD_HEADER_VERNO == 1)))
{
if (($MD_IMG_SERIAL_NO == 1) || ($MD_IMG_SERIAL_NO == 0))
{
# as is
}
elsif ($MD_IMG_SERIAL_NO == 2)
{
$naming_string = "_sys2";
}
else
{
die "Invalid modem bind_sys_id = $MD_IMG_SERIAL_NO";
}
}
else
{
die "Invalid modem header_verno = $MD_HEADER_VERNO";
}
return $naming_string;
}
sub get_modem_name
{
my $ref_option = shift @_;
my $bind_sys_id = shift @_;
my $flag_force;
my $image_type;
if (exists $ref_option->{"MTK_MD" . $bind_sys_id . "_SUPPORT"})
{
if ($ref_option->{"MTK_MD" . $bind_sys_id . "_SUPPORT"} eq "modem_2g")
{
$image_type = 1;
$flag_force = 1;
}
elsif ($ref_option->{"MTK_MD" . $bind_sys_id . "_SUPPORT"} eq "modem_3g")
{
$image_type = 2;
$flag_force = 1;
}
else
{
$image_type = $ref_option->{"MTK_MD" . $bind_sys_id . "_SUPPORT"};
$flag_force = 2;
}
}
elsif ($bind_sys_id == 1)
{
if ($ref_option->{"MTK_MODEM_SUPPORT"} eq "modem_2g")
{
$image_type = 1;
$flag_force = 1;
}
elsif ($ref_option->{"MTK_MODEM_SUPPORT"} eq "modem_3g")
{
$image_type = 2;
$flag_force = 1;
}
}
my %temp_feature = ("bind_sys_id" => $bind_sys_id, "image_type" => $image_type, "header_verno" => $flag_force);
my $naming_string = "modem" . &get_modem_suffix(\%temp_feature, $flag_force) . ".img";
return $naming_string;
}
sub set_modem_name
{
my $ref_hash = shift @_;
my $ref_array = shift @_;
my $over_method = shift @_;
my $over_base = shift @_;
my $over_suffix = shift @_;
my $over_ext = shift @_;
foreach my $file (@$ref_array)
{
my $basename;
my $dirname;
my $extname;
($basename, $dirname, $extname) = fileparse($file, qr/\.[^.]*/);
if ($over_method == 0)
{
# add suffix in basename
$basename = $over_base if ($over_base ne "*");
$extname = $over_ext if ($over_ext ne "*");
}
elsif ($over_method == 1)
{
# add suffix in filename
$basename .= $extname;
$extname = "";
}
elsif ($over_method == 2)
{
# no change
$over_suffix = "";
}
$ref_hash->{$file} = $basename . $over_suffix . $extname;
}
}
sub find_modem_bin
{
my $ref_hash_filelist = shift @_;
my $ref_hash_feature = shift @_;
my $path_of_bin = shift @_;
my $modem_bin_file;
my $modem_bin_link;
$ref_hash_feature->{"TYPE_OF_BIN"} = 0;
my @wildcard_list_0 = &find_modem_glob($path_of_bin . "*_MDBIN_*.bin");
if (scalar @wildcard_list_0 == 1)
{
$modem_bin_link = $wildcard_list_0[0];
$modem_bin_file = $modem_bin_link;
}
elsif (scalar @wildcard_list_0 == 0)
{
my @wildcard_list_1 = &find_modem_glob($path_of_bin . "*_PCB01_*.bin");
if (scalar @wildcard_list_1 == 1)
{
my $wildcard_file = $wildcard_list_1[0];
if ((! -d $wildcard_file) && (-e $wildcard_file))
{
$modem_bin_link = $wildcard_file;
$ref_hash_feature->{"TYPE_OF_BIN"} |= 0b00000001;
}
if ((-d $wildcard_file) && (-e $wildcard_file . "/ROM"))
{
$modem_bin_link = $wildcard_file . "/ROM";
$ref_hash_feature->{"TYPE_OF_BIN"} |= 0b00000010;
}
}
elsif (scalar @wildcard_list_1 == 0)
{
if (-e $path_of_bin . "modem_sys2.img")
{
$modem_bin_link = $path_of_bin . "modem_sys2.img";
}
if (-e $path_of_bin . "modem.img")
{
$modem_bin_link = $path_of_bin . "modem.img";
}
if (-e $path_of_bin . "cp.rom")
{
$modem_bin_link = $path_of_bin . "cp.rom";
}
}
else
{
print "[ERROR] More than one modem images are found: " . join(" ", @wildcard_list_1) . "\n";
}
if (-e $path_of_bin . "modem.img")
{
$modem_bin_file = $path_of_bin . "modem.img";
$ref_hash_feature->{"TYPE_OF_BIN"} |= 0b00000100;
}
else
{
$modem_bin_file = $modem_bin_link;
}
}
else
{
print "[ERROR] More than one modem images are found: " . join(" ", @wildcard_list_0) . "\n";
}
return ($modem_bin_file, $modem_bin_link);
}
sub find_modem_mak
{
my $ref_hash_filelist = shift @_;
my $ref_hash_feature = shift @_;
my $path_of_mak = shift @_;
my $modem_mak_pattern = "*.mak";
my $modem_mak_file;
my @wildcard_list = &find_modem_glob($path_of_mak . $modem_mak_pattern);
foreach my $wildcard_file (@wildcard_list)
{
if ($wildcard_file =~ /\bMMI_DRV_DEFS\.mak/)
{
}
elsif ($wildcard_file =~ /~/)
{
$modem_mak_file = $wildcard_file;
}
elsif ($modem_mak_file eq "")
{
$modem_mak_file = $wildcard_file;
}
else
{
print "[WARNING] Unknown project makefile: " . $wildcard_file . " or " . $modem_mak_file . "\n";
}
}
return $modem_mak_file;
}
sub get_modem_file_mapping
{
my $ref_hash_filelist = shift @_;
my $ref_hash_feature = shift @_;
my $ref_hash_option = shift @_;
my $project_root = shift @_;
my $type_of_load = shift @_;
my $branch_of_ap = shift @_;
my $path_of_bin;
my $path_of_database;
my $path_of_allinone;
my $modem_bin_file;
my $modem_bin_link;
my $modem_bin_prefix;
my $modem_bin_suffix;
my $modem_mak_file;
my @checklist_of_general;
my @checklist_of_dsp_bin;
my @checklist_of_append;
my @checklist_of_remain;
my $rule_of_rename = 2;
if (($branch_of_ap eq "") or ($branch_of_ap =~ /KK/))
{
$rule_of_rename = 2;
}
elsif ($branch_of_ap =~ /ALPS\.(JB|JB2)\./)
{
$rule_of_rename = 1;
}
elsif ($branch_of_ap =~ /ALPS\.(ICS|GB)\d*\./)
{
$rule_of_rename = 1;
}
else
{
$rule_of_rename = 2;
}
$project_root =~ s/\/$//;
if ($type_of_load == 0)
{
$path_of_bin = $project_root . "/" . "bin/";
}
else
{
$path_of_bin = $project_root . "/";
}
($modem_bin_file, $modem_bin_link) = &find_modem_bin($ref_hash_filelist, $ref_hash_feature, $path_of_bin);
$modem_mak_file = &find_modem_mak($ref_hash_filelist, $ref_hash_feature, $path_of_bin);
if (($modem_bin_file eq "") or ($modem_bin_link eq ""))
{
die "The modem bin is not found";
}
elsif (! -e $modem_bin_file)
{
die "The file " . $modem_bin_file . " does NOT exist!";
}
elsif ($ref_hash_feature->{"TYPE_OF_BIN"} == 0b00000100)
{
# BACH
$modem_bin_suffix = "";
# hard code for PMS
$ref_hash_feature->{"bind_sys_id"} = 1;
if ($ref_hash_option)
{
$ref_hash_option->{"PURE_AP_USE_EXTERNAL_MODEM"} = "yes";
if ($modem_bin_link =~ /modem_sys2\.img/)
{
$ref_hash_option->{"MT6280_SUPER_DONGLE"} = "no";
}
else
{
$ref_hash_option->{"MT6280_SUPER_DONGLE"} = "yes";
}
}
}
else
{
my $res = &Parse_MD_Struct($ref_hash_feature, $modem_bin_file);
if ($res == 1)
{
$modem_bin_prefix = "md" . $ref_hash_feature->{"bind_sys_id"};
$modem_bin_suffix = &get_modem_suffix($ref_hash_feature, $rule_of_rename);
$ref_hash_feature->{"suffix"} = $modem_bin_suffix;
print "Modem bin file is " . $modem_bin_file . "\n";
if ($ref_hash_option)
{
$ref_hash_option->{"MTK_MD" . $ref_hash_feature->{"bind_sys_id"} . "_SUPPORT"} = $ref_hash_feature->{"image_type"};
}
}
else
{
$ref_hash_feature->{"TYPE_OF_BIN"} = 0b00001000;
}
}
if ($ref_hash_filelist)
{
if ($ref_hash_feature->{"TYPE_OF_BIN"} == 0b00000100)
{
# BACH
die "Unknown modem spec";
}
elsif ($ref_hash_feature->{"TYPE_OF_BIN"} == 0b00001000)
{
# MAUI DSDA
die "Unknown modem spec";
}
elsif (($ref_hash_feature->{"image_type"} >= 0x08) and ($ref_hash_feature->{"image_type"} <= 0x0C))
{
# UMOLY
&set_modem_name($ref_hash_filelist, [$modem_bin_file], 0, $modem_bin_prefix . "bin", "", ".img");
if (1)
{
my @wildcard_list_2 = &find_modem_glob($path_of_bin . "*DSP*.bin");
my @wildcard_list;
foreach my $file (@wildcard_list_2)
{
if ($file =~ /\bcatcher_/)
{
}
else
{
push(@wildcard_list, $file)
}
}
if (scalar @wildcard_list != 1)
{
die scalar @wildcard_list . " unexpected dsp bin: " . join(" ", @wildcard_list);
}
my $filename = basename($wildcard_list[0]);
&set_modem_name($ref_hash_filelist, [$path_of_bin . $filename], 0, $modem_bin_prefix . "dsp", "", ".img");
}
if (-e $path_of_bin . "md1arm7.img")
{
&set_modem_name($ref_hash_filelist, [$path_of_bin . "md1arm7.img"], 0, $modem_bin_prefix . "arm7", "", ".img");
}
if ($type_of_load == 0)
{
$path_of_database = $project_root . "/" . "dhl/database/";
}
else
{
$path_of_database = $project_root . "/";
}
foreach my $file (&find_modem_glob($path_of_database . "MDDB*.EDB"))
{
if ($file =~ /MDDB\.[LP]_/)
{
}
else
{
push(@checklist_of_general, $file);
}
}
foreach my $file (&find_modem_glob($path_of_database . "DbgInfo_*"))
{
if ($file =~ /DbgInfo_[LP]_/)
{
}
else
{
push(@checklist_of_append, $file);
}
}
push(@checklist_of_general, $path_of_database . "catcher_filter.bin") if (-e $path_of_database . "catcher_filter.bin");
push(@checklist_of_general, $path_of_database . "em_filter.bin") if (-e $path_of_database . "em_filter.bin");
push(@checklist_of_general, $path_of_database . "mdm_layout_desc.dat") if (-e $path_of_database . "mdm_layout_desc.dat");
push(@checklist_of_general, $path_of_bin . "*.elf");
foreach my $file (&find_modem_glob($path_of_database . "catcher_filter_*.bin"))
{
my $filename = basename($file);
my $catcher_suffix = $filename;
$catcher_suffix =~ s/catcher_filter(_\S+)\.bin/$1/;
&set_modem_name($ref_hash_filelist, [$file], 0, "catcher_filter", $modem_bin_suffix . $catcher_suffix, ".bin");
}
foreach my $file (&find_modem_glob($path_of_database . "MDDB*.XML"))
{
push(@checklist_of_general, $file);
}
foreach my $file (&find_modem_glob($path_of_database . "MDDB*.XML.GZ"))
{
my $filename = basename($file);
$filename =~ s/\.XML\.GZ$//;
&set_modem_name($ref_hash_filelist, [$file], 0, $filename, $modem_bin_suffix, ".XML.GZ");
}
if ($type_of_load == 0)
{
$path_of_allinone = $project_root . "/" . "bin/md_all_in_one/";
}
else
{
$path_of_allinone = $project_root . "/";
}
if (-e $path_of_allinone . "single_bin_modem.bin")
{
$ref_hash_filelist->{$path_of_allinone . "single_bin_modem.bin"} = "single_bin_modem.bin";
}
if (-e $path_of_bin . "MCF_OTA_FILES.tar.gz")
{
$ref_hash_filelist->{$path_of_bin . "MCF_OTA_FILES.tar.gz"} = "MCF_OTA_FILES.tar.gz";
}
$ref_hash_feature->{"Android.mk"} = &gen_android_mk_v2();
}
elsif (($ref_hash_feature->{"image_type"} >= 1) and ($ref_hash_feature->{"image_type"} <= 7))
{
# MOLY or C2K
if ($ref_hash_feature->{"bind_sys_id"} == 3)
{
# C2K
my $filename = basename($modem_bin_file);
&set_modem_name($ref_hash_filelist, [$path_of_bin . "./" . $filename], 0, "modem", $modem_bin_suffix, ".img");
&set_modem_name($ref_hash_filelist, [$modem_bin_file], 0, $modem_bin_prefix . "img", "", ".img");
$ref_hash_feature->{"Android.mk"} = &gen_android_mk_v1();
}
elsif (index($ref_hash_feature->{"platform"}, "MT6570") == 0)
{
# MOLY WR8 for MT6570
my $filename = basename($modem_bin_file);
&set_modem_name($ref_hash_filelist, [$path_of_bin . "./" . $filename], 0, $modem_bin_prefix . "bin", "", ".img");
&set_modem_name($ref_hash_filelist, [$modem_bin_file], 0, $modem_bin_prefix . "img", "", ".img");
$ref_hash_feature->{"Android.mk"} = &gen_android_mk_v2();
}
else
{
# MOLY
&set_modem_name($ref_hash_filelist, [$modem_bin_file], 0, "modem", $modem_bin_suffix, ".img");
$ref_hash_feature->{"Android.mk"} = &gen_android_mk_v1();
}
if ($type_of_load == 0)
{
if (-d $project_root . "/" . "dhl/database")
{
$path_of_database = $project_root . "/" . "dhl/database/";
}
elsif (-d $project_root . "/" . "tst/database/")
{
$path_of_database = $project_root . "/" . "tst/database/";
}
else
{
$path_of_database = $project_root . "/" . "bin/";
}
}
else
{
$path_of_database = $project_root . "/";
}
push(@checklist_of_append, $path_of_database . "BPLGUInfoCustom*");
if (1)
{
my @wildcard_list = &find_modem_glob($path_of_database . "MDDB*");
foreach my $file (@wildcard_list)
{
if ($file =~ /\.EDB$/)
{
push(@checklist_of_general, $file);
}
else
{
push(@checklist_of_append, $file);
}
}
}
push(@checklist_of_append, $path_of_database . "BPMdMetaDatabase_*");
push(@checklist_of_append, $path_of_database . "DbgInfo*");
push(@checklist_of_general, $path_of_database . "catcher_filter.bin") if (-e $path_of_database . "catcher_filter.bin");
push(@checklist_of_general, $path_of_database . "em_filter.bin") if (-e $path_of_database . "em_filter.bin");
push(@checklist_of_general, $path_of_database . "mdm_layout_desc.dat") if (-e $path_of_database . "mdm_layout_desc.dat");
push(@checklist_of_general, $path_of_database . "mcddll.dll") if (-e $path_of_database . "mcddll.dll");
push(@checklist_of_dsp_bin, $path_of_bin . "*DSP*.bin") if (&find_modem_glob($path_of_bin . "*DSP*.bin"));
foreach my $file (@checklist_of_dsp_bin)
{
my @wildcard_list = &find_modem_glob($file);
if (scalar @wildcard_list == 1)
{
&set_modem_name($ref_hash_filelist, \@wildcard_list, 0, "dsp", $modem_bin_suffix, "*");
}
else
{
die scalar @wildcard_list . " unexpected dsp bin: " . join(" ", @wildcard_list);
}
}
# C2K
my $path_of_fsm;
my $path_of_rom;
my $path_of_obj = $path_of_bin;
$path_of_obj =~ s/\/build\/.*$/\/obj\//i;
if ($type_of_load == 2)
{
$path_of_fsm = $path_of_bin . "fsm_files/images/";
$path_of_rom = $path_of_bin . "lib/";
$path_of_rom =~ s/\/build\//\/mtk_rel\//i;
}
else
{
$path_of_fsm = $path_of_bin;
$path_of_rom = $path_of_bin;
}
if (-e $path_of_rom . "boot.rom")
{
push(@checklist_of_general, $path_of_rom . "boot.rom");
}
else
{
my @wildcard_list = &find_modem_glob($path_of_rom . "*_BOOT_*.bin");
&set_modem_name($ref_hash_filelist, \@wildcard_list, 0, "boot", $modem_bin_suffix, "rom");
}
push(@checklist_of_general, $path_of_fsm . "fsm_rf_df.img") if (-e $path_of_fsm . "fsm_rf_df.img");
push(@checklist_of_general, $path_of_fsm . "fsm_rw_df.img") if (-e $path_of_fsm . "fsm_rw_df.img");
push(@checklist_of_general, $path_of_fsm . "fsm_cust_df.img") if (-e $path_of_fsm . "fsm_cust_df.img");
if (-e $path_of_bin . "catcher_filter.bin")
{
push(@checklist_of_general, $path_of_bin . "catcher_filter.bin");
}
elsif (-e $path_of_bin . "bin/catcher_filter.bin")
{
push(@checklist_of_general, $path_of_bin . "bin/catcher_filter.bin");
}
elsif (-e $path_of_obj . "catcher_filter.bin")
{
push(@checklist_of_general, $path_of_obj . "catcher_filter.bin");
}
}
else
{
die "Unknown modem spec";
}
foreach my $file (@checklist_of_general)
{
my @wildcard_list = &find_modem_glob($file);
&set_modem_name($ref_hash_filelist, \@wildcard_list, 0, "*", $modem_bin_suffix, "*");
}
foreach my $file (@checklist_of_append)
{
my @wildcard_list = &find_modem_glob($file);
&set_modem_name($ref_hash_filelist, \@wildcard_list, 1, "*", $modem_bin_suffix, "*");
}
foreach my $file (@checklist_of_remain)
{
my @wildcard_list = &find_modem_glob($file);
&set_modem_name($ref_hash_filelist, \@wildcard_list, 2, "*", "", "*");
}
if ($modem_mak_file ne "")
{
my @wildcard_list = &find_modem_glob($modem_mak_file);
&set_modem_name($ref_hash_filelist, \@wildcard_list, 0, "modem", $modem_bin_suffix, "*");
}
my $path_of_ims = $path_of_bin;
my @checklist_of_ims;
foreach my $dir ("init_rc", "sepolicy", "makefile", "libs")
{
if (-d $path_of_ims . $dir)
{
&find_all_files(\@checklist_of_ims, $path_of_ims, $dir);
}
}
foreach my $file (@checklist_of_ims)
{
$ref_hash_filelist->{$path_of_ims . $file} = $file;
}
}
}
sub find_modem_cfg
{
my $ref_hash_filelist = shift @_;
my $path_of_bin = shift @_;
my $READ_HANDLE;
my @files = &find_modem_glob($path_of_bin . "*.cfg");
foreach my $file (@files)
{
if (open($READ_HANDLE, "<$file"))
{
my @lines = <$READ_HANDLE>;
close $READ_HANDLE;
foreach my $line (@lines)
{
if ($line =~ /^\s*-\s*file:\s*(\S+)/)
{
push(@$ref_hash_filelist, $path_of_bin . $1) if ($ref_hash_filelist);
}
}
}
}
return @files;
}
sub find_modem_glob
{
my @dirs = @_;
my @result;
foreach my $dir (@dirs)
{
$dir =~ s/([\[\]\(\)\{\}\^])/\\$1/g;
push(@result, glob $dir);
}
return @result;
}
sub find_all_files
{
my $ref_list = shift @_;
my $root = shift @_;
my $sub = shift @_;
$root =~ s/\/$//;
my $path = $root;
my $prefix = "";
if ($sub ne "")
{
$path = $root . "/" . $sub;
$prefix = $sub . "/";
}
my $DIR_HANDLE;
my @list;
if (opendir($DIR_HANDLE, $path))
{
@list = readdir($DIR_HANDLE);
closedir($DIR_HANDLE);
}
my @dirs;
foreach my $file (@list)
{
if (($file eq ".") || ($file eq ".."))
{
}
elsif (-d $path . "/" . $file)
{
push(@dirs, $prefix . $file);
}
else
{
if ($ref_list)
{
push(@$ref_list, $prefix . $file);
}
}
}
foreach my $dir (@dirs)
{
&find_all_files($ref_list, $root, $dir)
}
}
sub gen_android_mk_v1
{
my $text = '
LOCAL_PATH := $(call my-dir)
MTK_MODEM_LOCAL_PATH := $(LOCAL_PATH)
MTK_MODEM_MDDB_FILES :=
MTK_MODEM_FIRMWARE_FILES :=
MTK_MODEM_VENDOR_FIRMWARE_FILES :=
MTK_MODEM_PARTITION_FILES :=
MTK_MODEM_MAP_X_1_TO_YY := 2g wg tg lwg ltg sglte ultg ulwg ulwtg ulwcg ulwctg
MTK_MODEM_MAP_X_3_TO_YY := 2g 3g ulwcg ulwctg
##### INSTALL MODEM FIRMWARE #####
$(foreach x,1,\
$(if $(filter-out 0,$(strip $(MTK_MD$(x)_SUPPORT))),\
$(foreach yy,$(MTK_MODEM_MAP_X_$(x)_TO_YY),\
$(foreach z,n,\
$(if $(wildcard $(MTK_MODEM_LOCAL_PATH)/modem_$(x)_$(yy)_$(z).img),\
$(eval MTK_MODEM_VENDOR_FIRMWARE_FILES += modem_$(x)_$(yy)_$(z).img)\
$(if $(filter l%g sglte ul%g,$(yy)),\
$(eval MTK_MODEM_VENDOR_FIRMWARE_FILES += dsp_$(x)_$(yy)_$(z).bin)\
)\
$(if $(filter yes,$(strip $(MTK_MDLOGGER_SUPPORT))),\
$(eval MTK_MODEM_FIRMWARE_FILES += catcher_filter_$(x)_$(yy)_$(z).bin)\
)\
$(if $(wildcard $(MTK_MODEM_LOCAL_PATH)/em_filter_$(x)_$(yy)_$(z).bin),\
$(eval MTK_MODEM_FIRMWARE_FILES += em_filter_$(x)_$(yy)_$(z).bin)\
)\
$(if $(wildcard $(MTK_MODEM_LOCAL_PATH)/armv7_$(x)_$(yy)_$(z).bin),\
$(eval MTK_MODEM_VENDOR_FIRMWARE_FILES += armv7_$(x)_$(yy)_$(z).bin)\
)\
)\
)\
)\
)\
)
$(foreach x,3,\
$(if $(filter-out 0,$(strip $(MTK_MD$(x)_SUPPORT))),\
$(foreach yy,$(MTK_MODEM_MAP_X_$(x)_TO_YY),\
$(foreach z,n,\
$(if $(wildcard $(MTK_MODEM_LOCAL_PATH)/modem_$(x)_$(yy)_$(z).img),\
$(eval MTK_MODEM_VENDOR_FIRMWARE_FILES += modem_$(x)_$(yy)_$(z).img)\
)\
$(if $(wildcard $(MTK_MODEM_LOCAL_PATH)/boot_$(x)_$(yy)_$(z).rom),\
$(eval MTK_MODEM_VENDOR_FIRMWARE_FILES += boot_$(x)_$(yy)_$(z).rom)\
)\
$(if $(wildcard $(MTK_MODEM_LOCAL_PATH)/fsm_rf_df_$(x)_$(yy)_$(z).img),\
$(eval MTK_MODEM_VENDOR_FIRMWARE_FILES += fsm_rf_df_$(x)_$(yy)_$(z).img)\
)\
$(if $(wildcard $(MTK_MODEM_LOCAL_PATH)/fsm_rw_df_$(x)_$(yy)_$(z).img),\
$(eval MTK_MODEM_VENDOR_FIRMWARE_FILES += fsm_rw_df_$(x)_$(yy)_$(z).img)\
)\
$(if $(wildcard $(MTK_MODEM_LOCAL_PATH)/fsm_cust_df_$(x)_$(yy)_$(z).img),\
$(eval MTK_MODEM_VENDOR_FIRMWARE_FILES += fsm_cust_df_$(x)_$(yy)_$(z).img)\
)\
$(if $(wildcard $(MTK_MODEM_LOCAL_PATH)/catcher_filter_$(x)_$(yy)_$(z).bin),\
$(eval MTK_MODEM_FIRMWARE_FILES += catcher_filter_$(x)_$(yy)_$(z).bin)\
)\
)\
)\
)\
)
########INSTALL MODEM DATABASE########
$(foreach x,1 3,\
$(if $(filter-out 0,$(strip $(MTK_MD$(x)_SUPPORT))),\
$(foreach yy,$(MTK_MODEM_MAP_X_$(x)_TO_YY),\
$(eval MTK_MODEM_DATABASE_FROM := $(wildcard $(MTK_MODEM_LOCAL_PATH)/BPLGUInfoCustomAppSrcP_*_$(x)_$(yy)_*))\
$(if $(strip $(MTK_MODEM_DATABASE_FROM)),,\
$(eval MTK_MODEM_DATABASE_FROM := $(wildcard $(MTK_MODEM_LOCAL_PATH)/BPLGUInfoCustomApp_*_$(x)_$(yy)_*))\
)\
$(eval MTK_MODEM_MDDB_FILES += $(notdir $(MTK_MODEM_DATABASE_FROM)))\
$(eval MTK_MODEM_MDDB_FILES += $(notdir $(wildcard $(MTK_MODEM_LOCAL_PATH)/DbgInfo_*_$(x)_$(yy)_*)))\
$(eval MTK_MODEM_MDDB_FILES += $(notdir $(wildcard $(MTK_MODEM_LOCAL_PATH)/MDDB*_$(x)_$(yy)_*)))\
$(eval MTK_MODEM_MDDB_FILES += $(notdir $(wildcard $(MTK_MODEM_LOCAL_PATH)/BPMdMetaDatabase_*_$(x)_$(yy)_*)))\
$(eval MTK_MODEM_MDDB_FILES += $(notdir $(wildcard $(MTK_MODEM_LOCAL_PATH)/mdm_layout_desc_$(x)_$(yy)_*)))\
$(eval mddb_check_wildcard := $(wildcard $(MTK_MODEM_LOCAL_PATH)/MDDB_*_$(x)_$(yy)_* $(MTK_MODEM_LOCAL_PATH)/MDDB.C2K.META_*_$(x)_$(yy)_*))\
$(if $(filter 0 1,$(words $(mddb_check_wildcard))),,\
$(info More than one MDDB files are found: $(mddb_check_wildcard))\
$(info Please only keep the latest one)\
$(error check-modem)\
)\
)\
)\
)
########INSTALL MODEM PARTITION########
ifeq ($(strip $(MTK_SINGLE_BIN_MODEM_SUPPORT)),yes)
MTK_MODEM_MDDB_FILES :=
MTK_MODEM_FIRMWARE_FILES :=
MTK_MODEM_VENDOR_FIRMWARE_FILES :=
MTK_MODEM_FILTER_FILES :=
else
MTK_MODEM_PARTITION_FILES += $(if $(wildcard $(MTK_MODEM_LOCAL_PATH)/md1img.img),md1img.img)
MTK_MODEM_PARTITION_FILES += $(if $(wildcard $(MTK_MODEM_LOCAL_PATH)/md1dsp.img),md1dsp.img)
MTK_MODEM_PARTITION_FILES += $(if $(wildcard $(MTK_MODEM_LOCAL_PATH)/md1arm7.img),md1arm7.img)
MTK_MODEM_PARTITION_FILES += $(if $(wildcard $(MTK_MODEM_LOCAL_PATH)/md3img.img),md3img.img)
endif
$(foreach item,$(MTK_MODEM_FIRMWARE_FILES),$(eval $(call mtk-install-modem,$(item),$(TARGET_OUT_VENDOR_ETC)/firmware)))
$(foreach item,$(MTK_MODEM_VENDOR_FIRMWARE_FILES),$(eval $(call mtk-install-modem,$(item),$(TARGET_OUT_VENDOR)/firmware)))
$(foreach item,$(MTK_MODEM_MDDB_FILES),$(eval $(call mtk-install-modem,$(item),$(TARGET_OUT_VENDOR_ETC)/mddb)))
$(foreach item,$(MTK_MODEM_PARTITION_FILES),$(eval $(call mtk-install-modem,$(item),$(PRODUCT_OUT))))
ifneq ($(strip $(MTK_MODEM_APPS_INCLUDE_FIRST)),yes)
include $(sort $(wildcard $(LOCAL_PATH)/makefile/inst_*.mk))
MTK_MODEM_APPS_INCLUDE_FIRST := yes
endif
MTK_MODEM_DATABASE_FILES := $(MTK_MODEM_INSTALLED_MODULES)
';
return $text;
}
sub gen_android_mk_v2
{
my $text = '
LOCAL_PATH := $(call my-dir)
MTK_MODEM_LOCAL_PATH := $(LOCAL_PATH)
MTK_MODEM_MDDB_FILES :=
MTK_MODEM_FIRMWARE_FILES :=
MTK_MODEM_FILTER_FILES :=
MTK_MODEM_MAP_X_1_TO_YY := 2g wg tg lwg ltg sglte ultg ulwg ulwtg ulwcg ulwctg unlwtg unlwctg
MTK_MODEM_MAP_X_3_TO_YY := 2g 3g ulwcg ulwctg
##### INSTALL MODEM FIRMWARE #####
$(foreach x,1 3,\
$(if $(filter-out 0,$(strip $(MTK_MD$(x)_SUPPORT))),\
$(foreach yy,$(MTK_MODEM_MAP_X_$(x)_TO_YY),\
$(foreach z,n,\
$(if $(wildcard $(MTK_MODEM_LOCAL_PATH)/catcher_filter_$(x)_$(yy)_$(z).bin),\
$(eval MTK_MODEM_FIRMWARE_FILES += catcher_filter_$(x)_$(yy)_$(z).bin)\
)\
$(if $(wildcard $(MTK_MODEM_LOCAL_PATH)/em_filter_$(x)_$(yy)_$(z).bin),\
$(eval MTK_MODEM_FIRMWARE_FILES += em_filter_$(x)_$(yy)_$(z).bin)\
)\
$(eval MTK_MD$(x)_FILTER_FILES += $(wildcard $(MTK_MODEM_LOCAL_PATH)/catcher_filter_$(x)_$(yy)_$(z).bin))\
$(eval MTK_MD$(x)_EM_FILTER_FILES += $(wildcard $(MTK_MODEM_LOCAL_PATH)/em_filter_$(x)_$(yy)_$(z).bin))\
)\
)\
)\
)
########INSTALL MODEM DATABASE########
$(foreach x,1 3,\
$(if $(filter-out 0,$(strip $(MTK_MD$(x)_SUPPORT))),\
$(foreach yy,$(MTK_MODEM_MAP_X_$(x)_TO_YY),\
$(eval MTK_MODEM_MDDB_FILES += $(notdir $(wildcard $(MTK_MODEM_LOCAL_PATH)/DbgInfo_*_$(x)_$(yy)_*)))\
$(eval MTK_MODEM_MDDB_FILES += $(notdir $(wildcard $(MTK_MODEM_LOCAL_PATH)/MDDB*_$(x)_$(yy)_*)))\
$(eval MTK_MODEM_MDDB_FILES += $(notdir $(wildcard $(MTK_MODEM_LOCAL_PATH)/BPMdMetaDatabase_*_$(x)_$(yy)_*)))\
$(eval MTK_MODEM_MDDB_FILES += $(notdir $(wildcard $(MTK_MODEM_LOCAL_PATH)/mdm_layout_desc_$(x)_$(yy)_*)))\
$(eval MTK_MD$(x)_MDDB_FILES += $(wildcard $(MTK_MODEM_LOCAL_PATH)/MDDB_*_$(x)_$(yy)_*.EDB))\
$(eval MTK_MD$(x)_MDDBMETAODB_FILES += $(wildcard $(MTK_MODEM_LOCAL_PATH)/MDDB.META*_$(x)_$(yy)_*.XML))\
$(eval MTK_MD$(x)_MDDBMETAODB_FILES += $(wildcard $(MTK_MODEM_LOCAL_PATH)/MDDB.META*_$(x)_$(yy)_*.XML.GZ))\
$(eval MTK_MD$(x)_DBGINFO_DSP_FILES += $(wildcard $(MTK_MODEM_LOCAL_PATH)/DbgInfo_DSP_*_$(x)_$(yy)_*))\
$(eval MTK_MD$(x)_DBGINFO_FILES += $(filter-out $(MTK_MODEM_LOCAL_PATH)/DbgInfo_DSP_%,$(wildcard $(MTK_MODEM_LOCAL_PATH)/DbgInfo_*_$(x)_$(yy)_*)))\
$(eval MTK_MD$(x)_META_FILES += $(wildcard $(MTK_MODEM_LOCAL_PATH)/MDDB.META_*_$(x)_$(yy)_*.EDB))\
$(eval MTK_MD$(x)_META_FILES += $(wildcard $(MTK_MODEM_LOCAL_PATH)/BPMdMetaDatabase_*_$(x)_$(yy)_*))\
$(eval MTK_MD$(x)_M_LAYOUT_FILES += $(wildcard $(MTK_MODEM_LOCAL_PATH)/mdm_layout_desc_$(x)_$(yy)_*.dat))\
$(eval mddb_check_wildcard := $(wildcard $(MTK_MODEM_LOCAL_PATH)/MDDB_*_$(x)_$(yy)_* $(MTK_MODEM_LOCAL_PATH)/MDDB.C2K.META_*_$(x)_$(yy)_*))\
$(if $(filter 0 1,$(words $(mddb_check_wildcard))),,\
$(info More than one MDDB files are found: $(mddb_check_wildcard))\
$(info Please only keep the latest one)\
$(error check-modem)\
)\
)\
)\
)
########INSTALL MODEM FILTER########
$(foreach x,1,\
$(if $(filter-out 0,$(strip $(MTK_MD$(x)_SUPPORT))),\
$(foreach yy,$(MTK_MODEM_MAP_X_$(x)_TO_YY),\
$(foreach z,n,\
$(eval custom_filter_wildcard := $(wildcard $(MTK_MODEM_LOCAL_PATH)/catcher_filter_$(x)_$(yy)_$(z)_*.bin))\
$(eval MTK_MODEM_FILTER_FILES += $(notdir $(custom_filter_wildcard)))\
$(foreach f,$(custom_filter_wildcard),\
$(eval k := md$(x)_filter_$(patsubst $(MTK_MODEM_LOCAL_PATH)/catcher_filter_$(x)_$(yy)_$(z)_%.bin,%,$(f)))\
$(eval MTK_MD1_CUSTOM_FILTER_RULES += $(f):$(k))\
)\
)\
)\
)\
)
########INSTALL MODEM PARTITION########
ifeq ($(strip $(MTK_SINGLE_BIN_MODEM_SUPPORT)),yes)
MTK_MD1_SINGLEBIN_FILES += $(wildcard $(MTK_MODEM_LOCAL_PATH)/single_bin_modem.bin)
MTK_MD1_IMG_FILES += $(wildcard $(MTK_MODEM_LOCAL_PATH)/md1bin.img)
MTK_MD1_DSP_FILES += $(wildcard $(MTK_MODEM_LOCAL_PATH)/md1dsp.img)
MTK_MD3_IMG_FILES += $(wildcard $(MTK_MODEM_LOCAL_PATH)/md3img.img)
MTK_MODEM_MDDB_FILES :=
MTK_MODEM_FIRMWARE_FILES :=
MTK_MODEM_FILTER_FILES :=
else
ifneq ($(wildcard $(MTK_MODEM_LOCAL_PATH)/md1bin.img),)
$(eval $(call mtk-install-mdimg,md1bin.img,$(PRODUCT_OUT),md1img.img))
endif
ifneq ($(wildcard $(MTK_MODEM_LOCAL_PATH)/md1dsp.img),)
$(eval $(call mtk-install-mdimg,md1dsp.img,$(PRODUCT_OUT),md1dsp.img))
endif
ifneq ($(wildcard $(MTK_MODEM_LOCAL_PATH)/md3img.img),)
$(eval $(call mtk-install-mdimg,md3img.img,$(PRODUCT_OUT),md3img.img))
endif
endif#MTK_SINGLE_BIN_MODEM_SUPPORT
MTK_MODEM_MCF_OTA_FILES += $(wildcard $(MTK_MODEM_LOCAL_PATH)/MCF_OTA_FILES.tar.gz)
########DEFINE MODEM MODULE########
$(foreach item,$(MTK_MODEM_FIRMWARE_FILES),$(eval $(call mtk-install-modem,$(item),$(TARGET_OUT_VENDOR_ETC)/firmware)))
$(foreach item,$(MTK_MODEM_MDDB_FILES),$(eval $(call mtk-install-modem,$(item),$(TARGET_OUT_VENDOR_ETC)/mddb)))
$(foreach item,$(MTK_MODEM_FILTER_FILES),$(eval $(call mtk-install-modem,$(item),$(TARGET_OUT_VENDOR_ETC)/firmware/customfilter)))
########DEFINE APPS MODULE########
ifneq ($(strip $(MTK_MODEM_APPS_INCLUDE_FIRST)),yes)
include $(sort $(wildcard $(LOCAL_PATH)/makefile/inst_*.mk))
MTK_MODEM_APPS_INCLUDE_FIRST := yes
endif
MTK_MODEM_DATABASE_FILES := $(MTK_MODEM_INSTALLED_MODULES)
';
return $text;
}
return 1;