mtk preloader流程簡介

2021-09-05 09:59:14 字數 3872 閱讀 7938

## mtk preloader流程簡介

**一、preloader流程簡介

1、啟動流程

(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中執行:**

entry(_start)

**2)init.s

檔案路徑:

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

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

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

.globl _start

_start:

b resethandler

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

entry :

ldr r0, =bldr_args_addr

b main

**(3)main.c

檔案路徑:

/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握手測試(保證可以通訊)。

**2、載入lk到dram

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)

**3、跳轉到lk

(1)bldr_post_process():內部其實是執行platform_post_init(),其主要作用是檢查電池是否存在,確定要傳給lk的引數。**

voidplatform_post_init(void)

(2) bldr_jump(jump_addr,jump_arg, sizeof(boot_arg_t)):執行init.s中定義的jump,實現跳轉到lk執行,跳轉位址即為0x41e00000。

.globl jump

jump:

mov r4, r1 /* r4 argument */

mov r5, r2 /* r5 argument */

mov pc, r0 /* jump to addr */

如果支援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。

gkENGINE HDR流程簡析

個人比較喜歡看圖說話。這裡簡單的用圖和文字說明一下gkengine hdr渲染流程中的關鍵步驟。如果要一步一步的解析,光是解釋rt的建立,釋放,紋理格式的選用。可能就需要一整天。如果再設計到框架搭建,shader的實際處理,可能幾天都不夠。所以這裡就不詳細進行 層面的講解了。不過這裡列舉幾個非常關鍵...

CEGUI渲染流程簡析

粗略分析了cegui的渲染流程,總結一下供日後參考。cegui版本是0.7.5,opengl渲染器。首先在cegui裡面每張,每個字元都是乙個quad,每個quad由2個三角面組成,包括6個頂點的座標,顏色,紋理座標,是傳送給gpu的最基礎的渲染單元。要注意的是,cegui並不侷限於quad,它可以...

python 簡析程式控制流程

python程式中語句執行的順序包括3種基本控制結構 順序結構 選擇結構 迴圈結構。1 順序結構 程式中語句執行的基本順序按各語句出現位置的先後次序執行,稱為順序結構,參見下圖。先執行語句塊1,再執行語句塊2,最後執行語句塊3。三者是順序執行關係。2 選擇結構 選擇結構可以根據條件來控制 的執行分支...