preloader流程 基於MTK平台

2021-08-17 03:09:23 字數 3745 閱讀 6333

(1)裝置上電起來後,跳轉到boot rom(不是flash)中的bootcode中執行把pre-loader載入起到isram, 因為當前dram(ram分sram跟dram,簡單來說sram就是cache,dram就是普通記憶體)還沒有準備好,所以要先把pre-loaderload到晶元內部的isram(internal sram)中。(2

)preloder的主要工作是初始化環境,包括c環境,timer,gpio,pmic,uart,i2c等以及裝載lk映象至dram中。

(3)如果實現了atf,preloader載入完lk分割槽後,還會載入tee分割槽,在設定好環境後,會先跳轉到el3。

(4)el3回到lk,執行lk流程,preloader流程結束。

二、主要流程

void main(u32 *arg)

/*初始化所有的環境。*/

bldr_post_process();

/*初始化所有的安全相關環境。*/

#if cfg_atf_support

trustzone_post_init();

#endif

/*設定向lk傳遞引數的位址*/

#if cfg_boot_argument_by_atag

jump_arg = (u32)&(g_dram_buf->boottag);

#else

jump_arg = (u32)&bootarg;

#endif

#if cfg_atf_support

……/*支援atf,跳轉到el3,然後再跳轉到lk*/

bldr_jump64(jump_addr,jump_arg, sizeof(boot_arg_t));

#else

/*跳轉到lk*/

bldr_jump(jump_addr,jump_arg, sizeof(boot_arg_t));

#endif

error:

platform_error_handler();

}三、詳細流程

1、初始化(1

)link_descriptor.ld

檔案路徑:

/vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6735

在該檔案中定義了入口,會跳轉到

_start

中執行:

init.s

檔案路徑:

vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6735/src/init

在該檔案中會執行_start,然後跳轉到resethandler執行,主要作用是配置c執行環境(暫存器、堆疊、bss等)   bss靜態記憶體段(未初始化)、資料段(初始化)、堆段、棧段

以及設定cpu為管理模式,關中斷。

結束後會跳轉到main開始執行:

檔案路徑:

/vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6735/src/core

初始化外部dram的timer、時鐘、uart、emi(dram防靜電干擾)。

bldr_pre_process()完成各種的平台硬體(timer,pmic,gpio,wdt...)初始化工作。

static void bldr_pre_process(void)

void platform_pre_init(void)

void platform_init(void)

(4)bldr_handshake(&handler):

uart

、usb

握手測試

(保證可以通訊)。

bldr_load_images(&jump_addr)

:將各個分割槽載入進入

dram,

主要是lk

分割槽。(1)

static int bldr_load_images(u32 *jump_addr)

………#elifcfg_load_uboot

/* 這個值是乙個固定值,確定了

lk載入的目的位址,定義在

default.mak

中cfg_uboot_memaddr  :=0x41e00000 */

addr = cfg_uboot_memaddr;/*在

rom中找到lk分割槽,並載入到

dram

中addr位置

*/ ret = bldr_load_part("lk", bootdev, &addr,&size);

if (ret)

return ret;

*jump_addr = addr;

#endif

/*如果支援

atf,在載入

lk後還會載入

tee分割槽

*/#if cfg_atf_support

addr = cfg_atf_rom_memaddr;

ret = bldr_load_tee_part("tee1", bootdev, &addr,0, &size);

…… bldr_load_bootimg_header("boot",bootdev, &addr, 0, &size);

#endif

return ret;}(

2)bldr_load_part

最終會執行:

part_load(bdev, part, addr, 0, size);

指定讀取的偏移量,檢索分割槽頭是否正確,如果正確則開始載入分割槽,載入分割槽的**:

intpart_load(blkdev_t *bdev, part_t *part, u32 *addr, u32 offset, u32 *size){/*

檢索分割槽頭

. */

if (blkdev_read(bdev, src,sizeof(img_hdr_t), (u8*)hdr, part->part_id) != 0)

if (part_hdr->info.magic == part_magic) else

/*設定

if (maddr == part_header_default_addr) else if (mode == load_addr_mode_backward)

voidplatform_post_init(void)

(2) bldr_jump(jump_addr,jump_arg, sizeof(boot_arg_t)):執行

init.s

中定義的

jump,

實現跳轉到

lk執行,跳轉位址即為

如果支援

atf就執行

bldr_jump64(jump_addr,jump_arg, sizeof(boot_arg_t))

:bldr_jump64

最主要是執行:

trustzone_jump(addr, arg1, arg2)

void trustzone_jump(u32 addr, u32 arg1,u32 arg2)

jumparch64: 先jump到el3,然後再回到lk。

基於MT6261行車記錄儀

說起行車記錄儀,大首先想到的就是汽車駕駛途中,被開啟用於記錄道路情況的拍攝儀器。其實手機上現在也有客戶要求做這個功能,我不知道客戶是本著大功能小裝置的理念還是真的是手機市場真有這種巨大需求,自身就遇到這個特殊的需求。平台 mt6261 要求 實現行車記錄儀功能,並分為可設定的一分鐘 五分鐘 三十分鐘...

基於androidO的gralloc 流程分析

1.gralloc hal 層邏輯分析 alloc device alloc alloc device t dev,intw,inth,int format,int usage,buffer handle t phandle,int pstride 其中幾個usage 的理解 1 hal pixel...

基於gitlab專案建立流程

1 在本地建立乙個資料夾名為demo裡面進行框架的搭建以及基礎類的開發 2 在本地建立.gitignore檔案,內容如下,表示這些檔案不上傳到git target project out intellij idea idea iws iml ipr src test src main scala m...