preloader流程----基于MTK平台

一、流程简介 1、启动流程
(1)设备上电起来后,跳转到Boot ROM(不是flash)中的中执行把pre-加载起到ISRAM,因为当前DRAM(RAM分SRAM跟DRAM,简单来说SRAM就是cache,DRAM就是普通内存)还没有准备好,所以要先把pre-到芯片内部的ISRAM( SRAM)中 。
(2)的主要工作是初始化环境,包括c环境,timer,gpio,pmic,uart,i2c等以及装载LK镜像至DRAM中 。
(3)如果实现了ATF,加载完lk分区后,还会加载tee分区,在设置好环境后,会先跳转到EL3 。
(4)EL3回到lk,执行lk流程,流程结束 。
2、下载流程
除了具有启动功能之外,还具有下载功能 。首先还是需要明确的是mtk芯片都的有个boot rom,如果没有这个rom那么,那么程序是无法被下载到中的,然后此时的flash上是为空的,没有任何数据的 。系统在上电之后它会检测是启动模式还是下载模式,如果是下载模式,它会初始化一个usb的串口,将加载到内部的SRAM中,跳转到中去执行,初始化好flash和外部RAM之后,依次将、lk、、下载到nand flash中去 。
二、主要流程
void main(u32 *arg)
{…..
(,);
/*初始化平台环境,比如Timer、PLL、UART、PMIC、、等 。*/
();
/*和外部工具通过UART或者USB方式握手,确定启动模式 。*/
(&);
/*安全相关的初始化*/
#if
();
#endif
/*加载LK镜像到DRAM中()*/
if (0 != (&)){
print("%sLoad \n", MOD);
goto error;
/*初始化所有的环境 。*/
();
/*初始化所有的安全相关环境 。*/
#if
();
#endif
/*设置向lk传递参数的地址*/
#if _ATAG
= (u32)&(->);
#else
= (u32)&;
#endif
#if
……
/*支持ATF,跳转到EL3,然后再跳转到lk*/
(,, ());
#else
/*跳转到lk*/
(,, ());
#endif
error:
er();
三、详细流程
1、初始化
(1).ld
文件路径:////////
在该文件中定义了入口,会跳转到中执行:
2)init.s
文件路径:
////////src/init
在该文件中会执行,然后跳转到执行,主要作用是配置c运行环境(寄存器、堆栈、BSS等)BSS静态内存段(未初始化)、数据段(初始化)、堆段、栈段
以及设置cpu为管理模式,关中断 。
结束后会跳转到main开始执行:
(3)main.c
文件路径:
/////////src/core
初始化外部DRAM的timer、时钟、UART、EMI(DRAM防静电干扰) 。
()完成各种的平台硬件(timer,pmic,gpio,wdt...)初始化工作 。
void (void)
{ …..
/* 重要的硬件初始化timer,pll, uart... */
();
/* 平台初始化*/
();
/* 分区初始化*/
();
();
/* 初始化安全库*/
();
/* 将log输出到dram*/
(1);
…..
void (void)
/* 初始化计时器*/
();
/* init boot time */
= (0);
/* 初始化串口*/
(,);
/*初始化GPIO*/
();
();
//初始化
();
//初始化i2c
();
();
//打开长按重启功能
();
【preloader流程----基于MTK平台】r();
void (void)
/* check DDR- mode */
atus();
/* init watch dog, willAP watch dog*/
();
/*init kpd PMIC mode */
();
k();
/*初始化boot参数: ((void *)&(->),0, ());*/
();
();
();
/*初始化 */
ret =();
#
();
while(1);
#endif
/* 传递默认dram信息给LK*/
(4)(&): UART、USB握手测试(保证可以通信) 。
2、加载Lk到DRAM
(&):将各个分区加载进入DRAM,主要是lk分区 。
(1) int (u32 *){