mtk preloader学習ノート
6670 ワード
1.preloader生成プロセス、mediatek/buid/makemtk.mkファイルを参照
mediatek/source/preloader/build.sh生成を実行します.
2.build.shに
function build_preloader ()
{
...
make
.....
}
3.mediatek/source/preloader/Makefileファイルのmakeコマンドを実行します.
この文は最終的に次のように解釈されます.
arm-eabi-ldツールを使用してldファイルと組み合わせて最終elfを生成します.最初の行/home/chyl 411/android/alps/mediatek/source/preloader/out/assembly.oはassembly.sファイルを指します.
4.assembly.sソースはmediatekplatformmt 6573preloadersrcinitディレクトリの下にあります.
最終的にはC_Main実行に移行します.ソースコードは同じディレクトリの下にあります.
5.C_Mainの初期化後、ubootをDRAMにコピーし、UBOOTコマンドモードにジャンプします.
JumpCmd関数は、ステップ4のコードでUBOOT_IMG_ADDRにジャンプして実行される.
preloader:
...
$(hide) cd $(PRELOADER_WD) && \
(./build.sh $(PROJECT) $(ACTION) $(DEAL_STDOUT) && \
cd $(MKTOPDIR) && \
$(call chkImgSize,$(ACTION),$(PROJECT),$(SCATTER_FILE),$(PRELOADER_IMAGES),$(DEAL_STDOUT),&&) \
$(SHOWRSLT) $$? $(MODULE_LOG) || \
$(SHOWRSLT) $$? $(MODULE_LOG))
...
mediatek/source/preloader/build.sh生成を実行します.
2.build.shに
function build_preloader ()
{
...
make
.....
}
3.mediatek/source/preloader/Makefileファイルのmakeコマンドを実行します.
all: $(ALL)
# ELF Generation
#
$(D_BIN)/$(PL_IMAGE_NAME).elf:
$(LD) --gc-sections -Bstatic -T$(MTK_PATH_PLATFORM)/link_descriptor.ld \
$(wildcard $(D_OBJ)/*) $(SECURITY_LIB) -Map system.map -o $(D_BIN)/$(PL_IMAGE_NAME).elf
@$(OBJCOPY) ${OBJCFLAGS} $(D_BIN)/$(PL_IMAGE_NAME).elf -O binary $(D_BIN)/$(PL_IMAGE_NAME).bin
cat $(MTK_PATH_CUSTOM)/MTK_Loader_Info.tag >> $(D_BIN)/$(PL_IMAGE_NAME).bin
この文は最終的に次のように解釈されます.
arm-eabi-ld --gc-sections -Bstatic -T/home/chyl411/android/alps/mediatek/platform/mt6573/preloader/link_descriptor.ld \
/home/chyl411/android/alps/mediatek/source/preloader/out/assembly.o
/home/chyl411/android/alps/mediatek/source/preloader/out/...
...............
/home/chyl411/android/alps/mediatek/platform/mt6573/preloader/src/SecLib.a -Map system.map -o /home/chyl411/android/alps/mediatek/source/preloader/bin/preloader_( )_gb.elf。
arm-eabi-ldツールを使用してldファイルと組み合わせて最終elfを生成します.最初の行/home/chyl 411/android/alps/mediatek/source/preloader/out/assembly.oはassembly.sファイルを指します.
4.assembly.sソースはmediatekplatformmt 6573preloadersrcinitディレクトリの下にあります.
....
entry :
/* Disable watch dog timer & Init CP15 setting */
BL primary_sys_init
B C_Main
....
.globl JumpCmd
JumpCmd:
MOV pc, r0
最終的にはC_Main実行に移行します.ソースコードは同じディレクトリの下にあります.
5.C_Mainの初期化後、ubootをDRAMにコピーし、UBOOTコマンドモードにジャンプします.
void C_Main (void)
{
SYS_BOOT_REASON reason;
g_boot_mode = NORMAL_BOOT;
// pre-process
pl_sys_init();
// check boot reason
#ifdef ENABLE_POWER_ON_VIBRATOR
reason=pl_check_boot_reason();
#else
pl_check_boot_reason();
#endif
//boot security tactics
pl_security_init();
// clear SGX core clock
pl_operate_clock();
#ifdef ENABLE_POWER_ON_VIBRATOR
if(reason == BR_POWER_KEY){
*(volatile unsigned short *)0x7002F7B0 |= 1 << 0 | 6 << 4;
gpt4_busy_wait_ms (100);
*(volatile unsigned short *)0x7002F7B0 &= ~(1 << 0);
}
#endif
// check cable in or not and charge type
meta_detection_via_usb();
#ifndef CFG_UART_HANDSHAKE_DISABLE
//via UART to detect tool
meta_detection_via_uart ();
#endif
pl_security_check();
// post process
pl_post_process ();
// do other function
pl_do_other_function();
// load u-boot image to DRAM
pl_load_uboot_image ();
// jump to DRAM to run u-boot image
pl_print_title ("Jump U-Boot");
JumpCmd ((UBOOT_IMG_ADDR));
while (1);
}
JumpCmd関数は、ステップ4のコードでUBOOT_IMG_ADDRにジャンプして実行される.