[MT6765]Preloader_流程分析--基于android 10

2024-06-17 07:32

本文主要是介绍[MT6765]Preloader_流程分析--基于android 10,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

preloader运行流程–基于MT6765

启动流程简介

  • ARM架构中,EL0/EL1是必须实现,EL2/EL3是选配,ELx跟层级对应关系:
EL0 -- appEL1 -- Linux kernel 、lkEL2 -- hypervisor(虚拟化)EL3 -- ARM trust firmware 、pre-loader
  • 1.设备上电起来后,跳转到BootROM(不是flash)中的bootcode中执行把preloader加载起到ISRAM, 因为当前DRAM(RAM分SRAM跟DRAM,简单来说SRAM就是cache,DRAM就是普通内存)还没有准备好,所以要先把pre-loaderload到芯片内部的ISRAM(Internal SRAM)中。

  • 2.preloder的主要工作是初始化环境,包括c环境,timer,gpio,pmic,uart,i2c等以及装载LK镜像至DRAM中,建立起最基本的运行环境,最重要的就是初始化DRAM

  • 3.如果实现了ATF,preloader加载完lk分区后,还会加载tee分区,在设置好环境后,会先跳转到EL3。

  • 4.EL3回到lk,执行lk流程,preloader流程结束。

  • 5.若平台未实现EL3(atf),pre-loader直接加载lk:
    image

  • 6.若平台实现EL3,则需要先加载完ATF再由ATF去加载lk:
    image

下载功能

preloader除了具有启动功能之外,还具有下载功能。首先还是需要明确的是mtk芯片都的有个boot rom,如果没有这个rom那么,那么程序是无法被下载到nandflash中的,然后此时的flash上是为空的,没有任何数据的。系统在上电之后它会检测是启动模式还是下载模式,如果是下载模式,它会初始化一个usb的串口,将preloader加载到内部的SRAM中,跳转到preloader中去执行,初始化好flash和外部RAM之后,依次将preloader、lk、kernel、android下载到nand flash中去。

初始化详细流程

  • vendor\mediatek\proprietary\bootable\bootloader\preloader\platform\mt6765\link_descriptor.ld :
    链接器脚本link_descriptor.ld定义了preloader的入口函数
OUTPUT_ARCH(arm)ENTRY(_start)
  • vendor\mediatek\proprietary\bootable\bootloader\preloader\platform\mt6765\src\init\init.S:init.S定义了_start,并跳转到main执
.globl _start
_start:b resethandler
/** 设置svc32模式* 禁止中断fiq&irq* clear BSS* setup stack* 跳转main执行*/        ......
entry :LDR r0, =bldr_args_addr  B   main
  • vendor\mediatek\proprietary\bootable\bootloader\preloader\platform\mt6765\src\core\main.c :

void main(u32 *arg)
{struct bldr_command_handler handler;u32 jump_addr, jump_arg;/* get the bldr argument */p_bldr_param = &bldr_param;memcpy((void *)p_bldr_param, (void *)*arg, sizeof(bl_param_t));mtk_uart_init(UART_SRC_CLK_FRQ, CFG_LOG_BAUDRATE);bldr_pre_process();   //必要的硬件初始化bldr_handshake(&handler);  //usb/uart握手,没深入看#if !CFG_FPGA_PLATFORM   //CFG_FPGA_PLATFORM :=0   进行一些安全检查/* security check */device_APC_dom_setup();
#endif#if CFG_ATF_SUPPORTtrustzone_pre_init(); //trustzone初始化BOOTING_TIME_PROFILING_LOG("trustzone pre init");
#endif#if (defined(MTK_AB_OTA_UPDATER) && !CFG_DRAM_CALIB_OPTIMIZATION) 
//在启用CFG_DRAM_CALIB_OPTIMIZATION时,在这里调用ab_ota_boot_check来尽可能早地检测ota引导状态ab_ota_boot_check();
#endif#if !(CFG_BYPASS_LOAD_IMG_FORCE_ATF)  //条件为真/* Do not load ATF, lk, load by JTAG */if (0 != bldr_load_images(&jump_addr)) { //jump_addr = 0 应该会失败pal_log_err("%s Second Bootloader Load Failed\n", MOD);
#if !CFG_BYPASS_EMIgoto error;
#endif}
#elsejump_addr = CFG_UBOOT_MEMADDR; //跳转到uboot地址
#endifBOOTING_TIME_PROFILING_LOG("load images");bldr_post_process(); //检测电池是否插上,并且初始化bootarg
#ifdef SLTmt_usb_phy_recover(); //USB PHY的recover配置
#endif#if CFG_ATF_SUPPORT  //条件为真trustzone_post_init(); //trustzone初始化2,初始化atf_boot_arg /*初始化所有的安全相关环境。*/
#endif#if CFG_BOOT_ARGUMENT_BY_ATAG   //条件为真jump_arg = (u32)&(g_dram_buf->boottag);
#elsejump_arg = (u32)&bootarg;
#endif/* 64S3,32S1,32S1 (MTK_ATF_BOOT_OPTION = 0)* re-loader jump to LK directly and then LK jump to kernel directly *//*设置向lk传递参数的地址*/
#if CFG_ATF_SUPPORT/*支持ATF,跳转到EL3,然后再跳转到lk*/pal_log_info("%s Others, jump to ATF\n", MOD);bldr_jump64(jump_addr, jump_arg, sizeof(boot_arg_t));
#else/*跳转到lk*/bldr_jump(jump_addr, jump_arg, sizeof(boot_arg_t));
#endiferror:  platform_error_handler();
}
  • platform/mt6765/default.mak:定义了很多宏,分析main函数时可在里面查询。
CFG_BYPASS_EMI :=0# DRAM Calibration Optimization:
# DRAM calib data will be stored to storage device to enhance DRAM init speed.
CFG_DRAM_CALIB_OPTIMIZATION :=1# no load ATF/LK, and force booting to ATF
CFG_BYPASS_LOAD_IMG_FORCE_ATF :=0CFG_USB_DOWNLOAD :=1
CFG_LOG_LEVEL :=3# image loading options
####################################################################For Normal Boot
CFG_LOAD_UBOOT :=1
#For Dummy AP
CFG_LOAD_MD_ROM :=0
CFG_LOAD_MD_RAMDISK :=0
CFG_LOAD_MD_DSP :=0
CFG_LOAD_MD3_ROM :=0
#For SLT and Dummy AP
CFG_LOAD_AP_ROM :=0
CFG_BOOT_ARGUMENT_BY_ATAG := 1#For CTP
CFG_LOAD_CONN_SYS :=0
#For SLT
CFG_LOAD_SLT_MD :=0
CFG_LOAD_SLT_SCP :=0
CFG_LOAD_SLT_MD32 :=0
CFG_LOAD_SLT_SSPM :=0

main重点函数分析

bldr_pre_process详细分析

  • bldr_pre_process()函数完成各种的平台硬件(timer,pmic,gpio,wdt,dram,i2c,usb,emmc,pll,rtc,uart…)初始化工作,接下来看详细流程。
  • bldr_pre_process()
    • platform_safe_mode(1, CFG_EMERGENCY_DL_TIMEOUT_MS);
    • platform_pre_init();
      • mtk_timer_init(); --timer
      • mt_pll_init(); --pll
      • mt_gpio_init(); --gpio
      • set_to_uart_mode(); --uart
      • pwrap_init_preloader(); //retry 3 times for pmic wrapper init
      • i2c_hw_init(); --i2c
      • show_devinfo_debug_info(); -log
      • enable_devinfo_dcm();
      • mt_pll_post_init(); --post pll init
      • ab_ota_boot_check(); --detect ota boot status
      • PMIC_enable_long_press_reboot(); --长按重启
    • platform_init();
      • lastpc_init();
      • rtc_init(); --rtc
      • pmic_init_setting(); --pmic setting
      • check_ddr_reserve_status(); --check DDR-reserve mode
      • mtk_wdt_init(); --看门狗初始化
      • set_kpd_pmic_mode(); --init kpd PMIC mode support
      • rtc_bbpu_power_on(); --bbpu指baseband power-up,调用该函数锁存RTC的PWBB来保持设备的一直供电,power键抬起也不会关机
      • enable_PMIC_kpd_clock(); --Enable PMIC Kpd clk
      • mtk_detect_key(KPD_DL_KEY1); --Vol Up detected. Log Keep on.
      • mt_mem_init(); --DRAM校准 src/driver/memory.c
        • mt_set_emi(void); src/driver/tb_emi.c
          • Init_DRAM(…); tb_dramc_pi_main.c
            • vDramCalibrationAllChannel§; tb_dramc_pi_main.c
              • vPrintCalibrationResult§; tb_dramc_pi_calibration_api.c --需要打开PRINT_CALIBRATION_SUMMARY才能看到打印结果
                • mcSHOW_DBG_MSG((“All Pass.\n”)); DDR校准通过
      • init_dram_buffer(); --DRAM buffer
      • ram_console_init();
      • boot_device_init(); --If CFG_DRAM_CALIB_OPTIMIZATION is disabled or not defined, booting storage device needs to be initialized after DRAM initialization. --emmc
      • platform_emergency_download(CFG_EMERGENCY_DL_TIMEOUT_MS);–检测是否进入emergency下载模式
      • trng_calib_2nd_round(g_trng_buf, TRNG_CALIB_BUF_SIZE); --trng calibration
      • mt_usb11_phy_savecurrent(); --make sure usb11 in power saving mode
      • bootarg.dram_rank_num = get_dram_rank_nr();
      • get_dram_rank_size(bootarg.dram_rank_size);
      • get_orig_dram_rank_info(&bootarg.orig_dram_info);
      • setup_mblock_info(&bootarg.mblock_info, &bootarg.orig_dram_info, &bootarg.lca_reserved_mem);
      • reserve_dramc_dummy_read(); --保存DRAM信息到bootarg中
    • part_init(); --启动设备分区初始化
    • part_dump(); –
    • sec_lib_init(); --初始化security lib
    • rpmb_program_key();
    • rpmb_program_key(); rpmb 分区 ,与tee相关

bldr_load_images详细分析

  • bldr_load_images()函数主要完成工作是加载lk到DRAM中,用于后续preloader跳转。
    • bldr_load_part(…)
      • bldr_load_part(“MD1_ROM”, bootdev, &addr, &size); 加modem分区到DRAM
      • ldr_load_part(“MD1_RAMDISK”, bootdev, &addr, &size);
      • bldr_load_part(“AP_ROM”, bootdev, &addr, &size);
      • bldr_load_part_lk(bootdev, &addr, &size); 加载lk到SRAM,lk入口地址设置为CFG_UBOOT_MEMADDR
      • bldr_load_tee_part(“tee_a”, bootdev, &addr, 0, &size); 如果支持ATF,在加载lk后还会加载tee分区,tee_entry_addr设置为CFG_ATF_ROM_MEMADDR

bldr_post_process详细分析

  • bldr_post_process()函数主要检测电池是否插上,并且初始化bootarg
    • lastpc_init();
    • hw_check_battery(); --normal boot电池检测
    • pl_close_pre_chr_led(); --关闭pre charger led
    • pl_charging(1); --使能强制充电模式
    • if (hw_check_battery()) --循环检测电池是否存在
    • pl_charging(0); --关闭使能强制充电模式
    • platform_set_boot_args(); --设置bootarg,作为传参给lk

preloader阶段调试

串口设置

  • 路径:platform/mt6765/default.mak
CFG_UART_COMMON :=1
CFG_LOG_BAUDRATE :=921600
CFG_EVB_UART_CLOCK :=26000000
CFG_FPGA_UART_CLOCK :=12000000
CFG_META_BAUDRATE :=115200
CFG_UART_LOG :=UART1
CFG_UART_META :=UART1

打印启动时间

  • 路径:platform/mt6765/makefile.mak
打开调试时间戳,查看每个阶段的运行时间
在platform/<platform>/makefile.mak中添加
C_OPTION += -DPL_PROFILING

镜像说明

platform/mt6765/default.mak :

10 CFG_BOOT_DEV :=BOOTDEV_SDMMC

Android.mk:

 12 PRELOADER_UFS_HEADER_BLOCK := $(LOCAL_PATH)/platform/$(MTK_PLATFORM_DIR)/headerblock_for_ota_fastboot_ufs13 PRELOADER_EMMC_HEADER_BLOCK := $(LOCAL_PATH)/platform/$(MTK_PLATFORM_DIR)/headerblock_for_ota_fastboot_emmc15 ifeq ("$(CFG_BOiOT_DEV)", "BOOTDEV_UFS")16   PRELOADER_HEADER_BLOCK := $(LOCAL_PATH)/platform/$(MTK_PLATFORM_DIR)/headerblock_for_ota_fastboot_ufs17 else18   ifeq ("$(CFG_BOOT_DEV)", "BOOTDEV_SDMMC")19     PRELOADER_HEADER_BLOCK := $(LOCAL_PATH)/platform/$(MTK_PLATFORM_DIR)/headerblock_for_ota_fastboot_emmc20   endif21 endif

build_preloader.mk:

 17   INSTALLED_PRELOADER_TARGET := $(PRODUCT_OUT)/preloader_$(PRELOADER_TARGET_PRODUCT).bin18   BUILT_PRELOADER_TARGET := $(PRELOADER_OUT)/bin/preloader_$(PRELOADER_TARGET_PRODUCT).bin20   TARGET_PRELOADER := $(PRODUCT_OUT)/preloader.img-------------------------preloader_k62v1_64_bsp.img start----------------------------------49 ifneq ($(INSTALLED_PRELOADER_TARGET),$(BUILT_PRELOADER_TARGET))50 $(INSTALLED_PRELOADER_TARGET): $(BUILT_PRELOADER_TARGET) | $(ACP)51         $(copy-file-to-target)52 endif
-------------------------preloader_k62v1_64_bsp.bin end-----------------------------------------------------------preloader.bin start----------------------------------54 $(PRELOADER_BIN): $(INSTALLED_PRELOADER_TARGET)55         $(hide) mkdir -p $(dir $@)56         $(hide) cp -f $< $@
-------------------------preloader.bin end-----------------------------------------------------------preloader.img start----------------------------------58 $(TARGET_PRELOADER): PRIVATE_INSTALLED_PRELOADER_TARGET := $(INSTALLED_PRELOADER_TARGET)59 $(TARGET_PRELOADER): $(INSTALLED_PRELOADER_TARGET) $(PRELOADER_DIR)/tools/gen-preloader-img.py60 ifneq ("$(wildcard $(PRELOADER_HEADER_BLOCK))","")61         cat $(PRELOADER_HEADER_BLOCK) $(PRIVATE_INSTALLED_PRELOADER_TARGET) > $@62 else63         $(hide) $(PRELOADER_DIR)/tools/gen-preloader-img.py $< $@64 endif
-------------------------preloader.img end-----------------------------------------------------------preloader_ufs.img start----------------------------------66 ifeq (,$(PL_MODE))67 ifneq ($(wildcard $(PRELOADER_UFS_HEADER_BLOCK)),)68 preloader pl: $(PRODUCT_OUT)/preloader_ufs.img69 $(PRODUCT_OUT)/preloader_ufs.img: $(PRELOADER_UFS_HEADER_BLOCK) $(INSTALLED_PRELOADER_TARGET)70         $(hide) mkdir -p $(dir $@)71         $(hide) cat $^ > $@7273 endif-------------------------preloader_emmc.img start----------------------------------74 ifneq ($(wildcard $(PRELOADER_EMMC_HEADER_BLOCK)),)75 preloader pl: $(PRODUCT_OUT)/preloader_emmc.img76 $(PRODUCT_OUT)/preloader_emmc.img: $(PRELOADER_EMMC_HEADER_BLOCK) $(INSTALLED_PRELOADER_TARGET)77         $(hide) mkdir -p $(dir $@)78         $(hide) cat $^ > $@7980 endif81 endif-------------------------preloader_ufs.img preloader_emmc.img end----------------------------------

从以上代码可得知:

镜像说明
preloader_k62v1_64_bsp.bin适配平台的烧录文件,直接从BUILT_PRELOADER_TARGET中拷贝而来
preloader.bin等同于preloader_k62v1_64_bsp.bin
preloader.img根据在platform/mt6765/default.mak中的配置,目前是在preloader_k62v1_64_bsp.bin基础上增加emmc启动帧头,用于ota升级,等同于preloader_emmc.img
preloader_ufs.img在preloader_k62v1_64_bsp.bin基础上增加ufs启动帧头,用于启动介质为ufs时的ota升级
preloader_emmc.img在preloader_k62v1_64_bsp.bin基础上增加emmc启动帧头,用于启动介质为emmc时的ota升级

这篇关于[MT6765]Preloader_流程分析--基于android 10的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068819

相关文章

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号