## 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流程结束。
2、下载流程
preloader除了具有启动功能之外,还具有下载功能。首先还是需要明确的是mtk芯片都的有个boot rom,如果没有这个rom那么,那么程序是无法被下载到nandflash中的,然后此时的flash上是为空的,没有任何数据的。系统在上电之后它会检测是启动模式还是下载模式,如果是下载模式,它会初始化一个usb的串口,将preloader加载到内部的SRAM中,跳转到preloader中去执行,初始化好flash和外部RAM之后,依次将preloader、lk、kernel、android下载到nand flash中去。
二、主要流程**void main(u32 *arg){…..mtk_uart_init(UART_SRC_CLK_FRQ,CFG_LOG_BAUDRATE);/*初始化平台环境,比如Timer、PLL、UART、PMIC、Memory、BootableStorage等。*/bldr_pre_process();/*和外部工具通过UART或者USB方式握手,确定启动模式。*/bldr_handshake(&handler);/*安全相关的初始化*/#if CFG_ATF_SUPPORTtrustzone_pre_init();#endif/*加载LK镜像到DRAM中(SecureBoot)*/if (0 != bldr_load_images(&jump_addr)){print("%s Second Bootloader Load Failed\n", MOD);goto error;}/*初始化所有的环境。*/bldr_post_process();/*初始化所有的安全相关环境。*/#if CFG_ATF_SUPPORTtrustzone_post_init();#endif/*设置向lk传递参数的地址*/#if CFG_BOOT_ARGUMENT_BY_ATAGjump_arg = (u32)&(g_dram_buf->boottag);#elsejump_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));#endiferror: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_addrB   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){ …../* 重要的硬件初始化timer,pll, uart... */platform_pre_init();/* 平台初始化*/platform_init();/* 分区初始化*/part_init();  part_dump();/* 初始化安全库*/sec_lib_init();/* 将log输出到dram*/log_buf_ctrl(1);…..}void platform_pre_init(void){/* 初始化计时器*/mtk_timer_init();/* init boot time */g_boot_time = get_timer(0);/* 初始化串口*/mtk_uart_init(UART_SRC_CLK_FRQ,CFG_LOG_BAUDRATE);/*初始化GPIO*/mt_gpio_init();clk_buf_all_on();//初始化PMICwrappwrap_init_preloader();//初始化i2ci2c_hw_init();check_charger_boost_status();//打开长按重启功能PMIC_enable_long_press_reboot();platform_core_handler();}void platform_init(void){/* check DDR-reserve mode */check_ddr_reserve_status();/* init watch dog, will enable AP watch dog*/mtk_wdt_init();/*init kpd PMIC mode support*/set_kpd_pmic_mode();enable_PMIC_kpd_clock();/*初始化boot参数:  memset((void *)&(g_dram_buf->bootarg),0, sizeof(boot_arg_t));*/init_dram_buffer();ram_console_init();ram_console_reboot_reason_save(g_rgu_status);/*初始化devicestoreage */ret =boot_device_init();#ifCFG_REBOOT_TESTmtk_wdt_sw_reset();while(1);#endif/* 传递默认dram信息给LK*/  }(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){/*获取启动设备,为得到分区在ROM中的地址做准备*/if (NULL == (bootdev = blkdev_get(CFG_BOOT_DEV))) {print("%scan't find boot device(%d)\n", MOD, CFG_BOOT_DEV);/* FIXME, shouldchange to global error code */return -1;}………#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_SUPPORTaddr = CFG_ATF_ROM_MEMADDR;ret = bldr_load_tee_part("tee1", bootdev, &addr,0, &size);……bldr_load_bootimg_header("boot",bootdev, &addr, 0, &size);#endifreturn 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) {//print("[%s] bdev(%d) read error(%s)\n", MOD, bdev->type, part->name);return -1;}if (part_hdr->info.magic == PART_MAGIC){/* 加载带分区头的image*/part_hdr->info.name[31] = '\0';……maddr = part_hdr->info.maddr;dsize = part_hdr->info.dsize;mode = part_hdr->info.mode;src += sizeof(part_hdr_t);memcpy(part_info + part_num, part_hdr, sizeof(part_hdr_t));part_num++;} else {//print("[%s] %s image doesn'texist\n", MOD, part->name);return -1;}/*设置if (maddr == PART_HEADER_DEFAULT_ADDR) {maddr = *addr;#ifCFG_ATF_SUPPORT} else if (mode == LOAD_ADDR_MODE_BACKWARD){maddr = tee_get_load_addr(maddr);#endif}**3、跳转到LK
(1)bldr_post_process():内部其实是执行platform_post_init(),其主要作用是检查电池是否存在,确定要传给lk的参数。**voidplatform_post_init(void){#ifCFG_BATTERY_DETECT/*检查电池是否存在,不存在就一直等待 */…..#endifplatform_parse_bootopt();/*设置要传递给lk的参数,在platform.c中定义*/platform_set_boot_args();}(2) bldr_jump(jump_addr,jump_arg, sizeof(boot_arg_t)):执行init.s中定义的jump,实现跳转到lk执行,跳转地址即为0x41E00000。.globl jumpjump: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){/*初始化tee模块*/tee_sec_config();……/*执行init.s中定义的jumparch64*/jumparch64(addr, arg1, arg2, trustzone_get_atf_boot_param_addr());}jumparch64: 先jump到el3,然后再回到lk。

mtk preloader流程简介相关推荐

  1. mtk LK流程简介

    mtk LK流程简介 一.LK简介 Lk的主要功能: 1.初始化硬件模块,比如时钟,中断,UART,USB,LCD,PMIC,eMMC等.打开MMU,使能I/D-cache,加速lk执行,显示logo ...

  2. A4. MTK开机流程

    preloader流程: 路径: vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6761/src/core/ ...

  3. QT程序启动加载流程简介

    1. QT应用程序启动加载流程简介 1.1      QWS与QPA启动客户端程序区别 1.1.1   QWS(Qt Window System)介绍 QWS(Qt Windows System)是Q ...

  4. 【Android 安装包优化】资源混淆 ( 资源混淆效果 | APK 构建流程简介 | 资源 ID 组成 )

    文章目录 一.资源混淆效果 二.APK 构建流程简介 三.资源 ID 组成 四.参考资料 一.资源混淆效果 资源混淆 , 将资源名称与目录进行混淆 , 提高了反编译的难度 , 同时也减小了 APK 文 ...

  5. SLAM:SLAM相机简介、SLAM五步流程简介(VO+BEO+LCD+M)之详细攻略

    SLAM:SLAM相机简介.SLAM五步流程简介(VO+BEO+LCD+M)之详细攻略 目录 SLAM相机 1.单目相机 2.双目Stereo相机 3.深度相机/RGB-D相机 SLAM五步流程

  6. MDM9x35MDM9x35启动流程简介

    1.前言.... 3 1.1编写背景... 3 1.2概述... 3 1.3定义与缩写... 3 1.4参考资料... 4 2.启动流程.... 4 2.1子系统.处理器及启动地址... 4 2.2启 ...

  7. Spark架构与作业执行流程简介

    2019独角兽企业重金招聘Python工程师标准>>> Spark架构与作业执行流程简介 博客分类: spark Local模式 运行Spark最简单的方法是通过Local模式(即伪 ...

  8. Recovery 流程简介

    Recovery 流程简介 Adroid 系统中的 Recovery 模式主要为用户提供了 OTA 升级和恢复出厂设置两大功能,用户可以通过 setting 中的系统软件更新和恢复出厂设置来进入到 r ...

  9. gitlab工作流程简介

    gitlab工作流程简介 新建项目流程 创建/导入项目 可以选择导入github.bitbucket项目,也可以新建空白项目,还可以从SVN导入项目 建议选择private等级 初始化项目 1.本地克 ...

最新文章

  1. Mybatis的各种查询功能
  2. 为什么静态方法在Java中不能是抽象的
  3. Java中sql_Java中sql都有哪些
  4. 嵌入式成长轨迹23 【Linux应用编程强化】【Linux下的C编程 下】【Linux GUI编程】...
  5. 金字塔型php的9x9乘法口诀表,python中打印金字塔和九九乘法表的几种方法
  6. Android 四大组件学习之Service五
  7. Linux基础入门(详细版)
  8. 原来黑客长这样(中国大陆篇)
  9. python 典型相关分析_CCA典型关联分析原理与Python案例
  10. 微信小程序企业号注册
  11. 英语的句号在c语言中是什么意思,英语标点符号的用法
  12. 校园APP开发的优势和特点
  13. mysql单机qps能到多少_单机Qps上限是多少?
  14. 文献检索、整理、归纳
  15. Android Studio 修改 Java 语言版本到 1.8
  16. JAVA标准异常分两大类_java异常分类
  17. 用python :输入 20 个整数,统计其中正数、负数和零的个数
  18. jiegputo matlab转置,matlab实现用免疫克隆算法求二元函数的最优值(附源码)
  19. 【Unity3D插件】Glow插件分享《边缘发光插件》
  20. 世界各国面积排名国家国土面积 (万平方公里)

热门文章

  1. Linux环境下Arm端源码编译OpenCV+ncnn目标检测模型实例运行调试完整实践记录
  2. webservice使用总结
  3. 如何解决error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file
  4. 一种通过刷写替换boot的方法
  5. JAVA的枚举定义和使用
  6. 【研究生版】《漫漫邮子路(五)--我的研究生之路--吕林输》
  7. js 月份间隔计算器_JAVASCRIPT做计算器
  8. PHP 算出字符串中中文个数
  9. 90后创业,是无奈之举还是不甘现状?创业必看!
  10. SGU103 The traffic lights 绞脑题