mtk preloader学習ノート

6670 ワード

1.preloader生成プロセス、mediatek/buid/makemtk.mkファイルを参照
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にジャンプして実行される.