MTK6577+Android 编译之 preloader
开发环境:虚拟机+Ubuntu14.04
MTK6577 采用的内存芯片为 H9TP32A4GDMCPR,包括 4GB 的 eNAND 和 512MB
的 LPDDR2,先升级为 H9TP32A8JDMCPR,包括 4GB 的 eNAND 和 1GB 的 LPDDR2
先来看 MTK 源代码树概观图:
由图 1 可知编译的入口是 makeMtk 文件,其采用 perl 语言编写的,包装了编译
命令,下面来看编译系统的概述:
图 1
1 / 10
编译命令./mk r pr,时间约为 20s
图 2
(1) 编译后发现有更新的文件有 EBR1、MBR、preloader_hsimobile77_ics2.bin 和
MT6577_Android_scatter_emmc.txt
(2) 编 译 后 有 更 新 的 log 文 件 有 hsimobile77_ics2_check-dep 、
hsimobile77_ics2_custgen、hsimobile77_ics2_preloader、hsimobile77_ics2_ptgen
和 MT6577_Android_scatter_emmc.txt。
1. hsimobile77_ics2_check-dep
内容如下:
2014/08/19 08:52:58 custgening...
LOG: out/target/product/hsimobile77_ics2_custgen.log
==> [OK]
2014/08/19 08:52:59
Check-dep 指 check feature dependency,表示检查功能的依赖,此文件没有具体
的内容,只是说编译信息见 hsimobile77_ics2_custgen.log 文件
2. hsimobile77_ics2_custgen
用./mk custgen 命令编译时 log 文件也是这个。
内容如下:
make[1]: Entering directory `/home/cw6577'
done
make[1]: Leaving directory `/home/cw6577'
2 / 10
根据这些信息具体不知道做了哪些工作,custgen 指 generate customization source,
表 示 生 成 客 户 自 定 义 的 source , 这 部 分 后 面 再 学 习 相 关 的
《Android_Build_System_for_customer》文档。
3. hsimobile77_ics2_ptgen
ptgen : 生 成 分 区 设 置 数 据 头 文 件 (partition_define.h) 和 分 散 加 载 文 件
(MT6577_Android_scatter_emmc.txt)(generate partition setting header&scatter file)
下面我们来看 partition_define.h 和 MT6577_Android_scatter_emmc.txt 文件是由
\mediatek\build\tools\ptgen\MT6577\ptgen.pl 生 成 的 , 通 过
hsimobile77_ics2_ptgen 文件中下面的内容可以判断:
*******************Arguments*********************
Version=3.3 ChangeHistory:3.3 Support Shared SD Card
PLATFORM = MT6577;
PROJECT = hsimobile77_ics2;
LCA_PRJ = no;
PAGE_SIZE = 4K;
EMMC_SUPPORT= yes;
LDVT_SUPPORT= no;
TARGET_BUILD_VARIANT= ;
MTK_EMMC_OTP_SUPPORT= ;
MTK_SHARED_SDCARD=no;
SHEET_NAME=emmc
SCAT_NAME=mediatek/source/misc/MT6577_Android_scatter_emmc.txt
*******************Arguments*********************
……………………..
START=0xFFFF00a8,
SIZE=21504, DL_=0,
Partition=BMTPOOL,
REGION =USER,RESERVE = 0
Partition_Index=0,
string
string
ne
ne
at
at
of
of
uninitialized
There are 19 Partition totally!.
Use
mediatek/build/tools/ptgen/MT6577/ptgen.pl line 563.
Use
mediatek/build/tools/ptgen/MT6577/ptgen.pl line 563.
……………………..
Generate mediatek/source/misc/MBR bin file
Generate mediatek/source/misc/EBR1 bin file
**********Ptgen Done********** ^_^
uninitialized
in
in
value
value
Ptgen modified or Generated files list:
mediatek/source/misc/MT6577_Android_scatter_emmc.txt
3 / 10
mediatek/custom/hsimobile77_ics2/common/partition_define.h
mediatek/config/hsimobile77_ics2/configs/EMMC_partition_size.mk
/out/MBR EBR1 EBR2
图 3
那具体是怎么生成这些文件的呢?继续:
(1) partition_define.h
ptgen.pl 中有下面一些语句语句:
my
=
"mediatek/build/tools/ptgen/$PLATFORM/partition_table_$PLATFORM.xls"; # excel
file name
$PART_TABLE_FILENAME
$PARTITION_DEFINE_H_NAME
my
"mediatek/custom/$PROJECT/common/partition_define.h";
像 C 语言一样,表示定义一个变量 PARTITION_DEFINE_H_NAME,并初始化。
=
通 过 这 行 语 句 可 以 知 道 分 区 信 息 从 \mediatek\build\tools\ptgen\MT6577\
partition_table_MT6577.xls 文件中获取,下面给出此文件的内容:
4 / 10
但是 partition_define.h 比图 4 的 18 个分区多了 EBR1 分区。这个分区应该也是
ptgen.pl 生成的,但具体怎么生成还不知道。
图 4
(2) MT6577_Android_scatter_emmc.txt
my $SCAT_NAME_DIR
$PLATFORM = $ENV{MTK_PLATFORM};
= "mediatek/source/misc/"; #
if ($EMMC_SUPPORT eq "yes")
{
$SCAT_NAME
=
$SCAT_NAME_DIR
.
$PLATFORM ."_Android_scatter_emmc.txt" ;
}else{
$SCAT_NAME = $SCAT_NAME_DIR . $PLATFORM ."_Android_scatter.txt" ;
}
可知知道,如果\mediatek\config\hsimobile77_ics2\ ProjectConfig.mk 文件中有:
MTK_EMMC_SUPPORT=yes
则会有 SCAT_NAME=mediatek/source/misc/MT6577_Android_scatter_emmc.txt
此文件内容可见 http://blog.csdn.net/loongembedded/article/details/37591369
具体是怎么生成的,需要去研究 ptgen.pl 源代码。
(3) EMMC_partition_size.mk
内容如下,给出了分区的大小信息
ifeq ($(MTK_EMMC_SUPPORT),yes)
BOARD_SECROIMAGE_PARTITION_SIZE:=5M
BOARD_SYSTEMIMAGE_PARTITION_SIZE:=512M
BOARD_CACHEIMAGE_PARTITION_SIZE:=512M
BOARD_USERDATAIMAGE_PARTITION_SIZE:=511M
BOARD_FATIMAGE_PARTITION_SIZE:=0M
5 / 10
endif
4. hsimobile77_ics2_preloader
编译生成 prloader 镜像文件的主要流程如下:
生成的 preloader_hsimobile77_ics2.bin 先是放在\mediatek\source\preloader\bin
目 录 下 , 然 后 依 次 拷 贝 到 \out\Download\flash 、
\out\target\product\hsimobile77_ics2 目录下。
图 5
(1) 编译 preloader 的主要工作
##############################################################
# Main Flow
#
build_preloader;
post_process;
6 / 10
dump_build_info;
copy_binary;
下面我们通过此文件的内容来学习编译 preloader 涉及的一些动作:
(2) 生成 custom_emi.c 文件
mediatek/custom/hsimobile77_ics2/preloader/custom_emi.c
图 6
----------------------------------------------------------------------------------------------------------------
Os = linux
mediatek/custom/hsimobile77_ics2/preloader/inc/custom_MemoryDevice.h
mediatek/build/tools/emigen/MT6577/MemoryDeviceList_MT6577.xls
MT6577
mediatek/custom/hsimobile77_ics2/preloader/inc/custom_emi.h
mediatek/custom/hsimobile77_ics2/preloader/custom_emi.c
mediatek/custom/hsimobile77_ics2/preloader/MTK_Loader_Info.tag
H9TP32A4GDMCPR
7 / 10
可以判断出编译的时候是从 custom_MemoryDevice.h 中下面的内容
#define CS_PART_NUMBER[0]
KMSJS000KM_B308
H9TP32A4GDMCPR
//
知道我们设备采用的 EMMC+DDR2 是 H9TP32A4GDMCPR 的
=
$REGION_TABLE_FILENAME
----------------------------------------------------------------------------------------------------------------
先来看 ptgen.pl 下面的内容:
my
"mediatek/build/tools/emigen/$PLATFORM/MemoryDeviceList_$PLATFORM.xls";
#eMMC region information
此文件含三个页面:
MT6577(page one):配置 Flash Vendor Id 对应的硬件参数。
NAND(page two):
emmc_region(pagethree)
…………………………..
my $EMMC_REGION_SHEET_NAME = "emmc_region";
my $emmc_sheet;
my $region_name;
……………………………..
my
Spreadsheet::ParseExcel->new()->Parse($REGION_TABLE_FILENAME);
$EMMC_RegionBook
=
=
find
get_sheet($EMMC_REGION_SHEET_NAME,$EMMC_RegionBook) ;
my
$error_msg="Ptgen
CAN
NOT
sheet=$EMMC_REGION_SHEET_NAME in $REGION_TABLE_FILENAME\n";
$emmc_sheet
unless ($emmc_sheet)
{
print $error_msg;
die $error_msg;
}
可 以 知 道 ptgen 会 在 MemoryDeviceList_MT6577.xls 中 看 能 否 找 到 名 为
emmc_region 的子页面,然后从中获取信息并生成 emmc_region.xls 文件,再接
着打开 custom_MemoryDevice.h 文件获取到 H9TP32A4GDMCPR,然后用此值来
和 emmc_region.xls 文件里的值对比,找到之后输出下面的 log 信息
----------------------------------------------------------------------------------------------------------------
1
num is 0, nandID is
mt6577[1][scan_idx]EQ null, 7
[2][scan_idx]EQ null, 6
8 / 10