MTK67xx+Android启动----pre-loader

Bootloader能够准备一个至关重要的执行环境和引导linux操作系统及Android框架(framework)。

bootloader主要包括设置处理器和内存的频率、调试信息端口、可引导的存储设备等等。在可执行环境创建好之后,接下来把software装载到内存并执行。除了装载software,一个外部工具也能和bootloader握手(handshake),可指示设备进入不同的操作模式,比如USB下载模式和META模式。就算没有外部工具的握手,通过外部任何组合或是客户自定义按键,bootloader也能够进入这些模式。

 

因为bootloader的一部分和系统有关,所以MTK为了不同的应用将它分为两部分的bootloader:

(1)  第1部分bootloader,也就是MTK内部(in-house)的pre-loader,这部分依赖平台。(flash_tool 二次烧写的引导)

(2)  第2部分bootloader,也就是u-boot,这部分依赖操作系统,负责引导linux操作系统和Android框架。

 

  1.  Pre-loader源代码

   1.1源代码目录

(1)  Pre-loader的代码在alps\vendor\mediatek\proprietary\bootable\bootloader

Pre-loader核心和平台驱动源码。

 

(2)  xxx\mediatek\custom\<project>\preloader

依赖于平台自定义文件的部分(platform dependent customization),比如EMI(external memory interface,外部存储器接口)设置。

 

Inc文件夹:

1)     cust_bldr.h

pre-loader的一些定制的特征,比如是从SDMMC还是NAND启动、调试口选择(UART1或是UART4)和波特率的配置等宏定义。

 

2)     cust_msdc.h

MSDC的自定义,比如包括MSDC的时钟频率、命令锁存跳变沿(上升沿或是下降沿)、数据锁存的跳变沿、高速或是全速模式等等。

 

3)     cust_nand.h

定义了所支持的NAND FLASH信息,比如FLASH ID、多少块、一块多少页等信息,但这些被注释掉了,主要定义了默认的访问时间等

 

4)     cust_rtc.h

RTC年月日的默认设置。

 

5)     cust_sec_ctl.h

一些安全设置的定义,比如包括了项目名称(比如cust)、平台名称(MT6577)、S-Boot的一些属性等。

 

6)     cust_usb.h.h

USB设置的宏定义,包括USB制造商、USB供应商ID(VID)、USB识别码ID(PID)等。

 

7)     custom_emi.h

扩展存储器接口的寄存器和设置的结构体定义。

 

8)     custom_MemoryDevice.h

定了采用的内存设备类型,比如H9TP32A4GDMCPR。

 

9)     mt6762_emi.h

mt6762内存的一些函数原型,如:

extern voidmt6762_set_emi (void);

extern voidmt6762_256M_mem_setting (void);

 

10)  mt6762_emi_reg.h

内存控制寄存器的宏定义。

 

11)  mt6762_memory.h

内存的一些设置,比如用于内存测试的大小、E1和E2内存的大小和一些函数原型。

 

12)  mt6762_nfi.h

nfi是Nand Flash Interface的缩写,和cust_nand.h内容一样。

 

(3)  xxx\mediatek\source\preloader

开发工具,例如building、trace32 cmm文件等,pre-loader对象和镜像二进制输出文件

 

1.2  编译命令

1)Pre-loader的编译命令:

  • 脚本编译          cd ./vendor/mediatek/proprietary/bootable/bootloader/preloader

                                ./build.sh 2>&1 | tee preloader_build.log

  • 或者先全编译一次后模块   mmm vendor/mediatek/proprietary/bootable/bootloader/preloader:pl
  • 直接编译        make -j8 pl 2>&1 |  tee pl.log

                                           生成在./out/target/product/k62v1_64_bsp/obj/PRELOADER_OBJ/bin

 2)lk

  • 全编译后      mmm vendor/mediatek/proprietary/bootable/bootloader/lk:clean-lk       

       mmm vendor/mediatek/proprietary/bootable/bootloader/lk:lk

  • 直接编译     make -j4 lk 2>&1 | tee lk_build.log

3)kernel

mmm kernel-4.9:clean-kernel 

make -j8 kernel  bootimage

 

android平台提供了三个命令用于编译,这3个命令分别为: 
1. make: 不带任何参数则是编译整个系统; 
make MediaProvider: 单个模块编译,会把该模块及其依赖的其他模块一起编译(会搜索整个源代码来定位MediaProvider模块所使用的Android.mk文件,还要判断该模块依赖的其他模块是否有修改); 
2. mmm packages/providers/MediaProvider: 编译指定目录下的模块,但不编译它所依赖的其它模块; 
3. mm: 编译当前目录下的模块,它和mmm一样,不编译依赖模块; 
4. mma: 编译当前目录下的模块及其依赖项 
以上三个命令都可以用-B选项来重新编译所有目标文件。
 

2.     bootloader的工作流程

 

2.1  bootloader正常的启动流程

先来看启动流程图:

2.1  bootloader正常的启动流程

先来看启动流程图:

 

图1

正常启动的主要工作如下:

(1)  设备上电后,Boot ROM开始运行。

(2)  BootROM初始化软件堆栈(software stack)、通信端口和可引导存储设备(比如NAND/EMMC)。

(3)  BootROM从存储器中加载pre-loader到内部SRAM(ISRAM)中,因为这时候还没有初始化外部的DRAM。

(4)  BootROM跳转到pre-loader的入口处并执行。

(5)  Pre-loader初始化DRAM和加载U-Boot到RAM中。

(6)  Pre-loader跳转到U-Boot中并执行,然后U-Boot做一些初始化,比如显示的初始化等。

(7)  U-Boot从存储器中加载引导镜像(boot image),包括linux内核和ramdisk(Android呢?)

(8)  U-Boot跳转到linux内核并执行。

 

2.2  bootloader正常的下载流程

先来看正常的下载流程图:

 

图2

正常的下载主要工作如下:

(1)  设备上电后,Boot ROM开始运行。

(2)  BootROM初始化软件堆栈(software stack)、通信端口和可引导存储设备(比如NAND/EMMC)。

(3)  BootROM通过UART/USB和flash工具握手。

(4)  BootROM通过UART下载pre-loader镜像到NAND flash/EMMC中,然后重启。

(5)  BootROM加载pre-loader到内部SRAM汇总,因为DRAM还没有初始化。

(6)  BootROM跳转到pre-loader并执行。

(7)  Pre-loader初始化DRAM和通过USB与flash工具握手。

(8)  Pre-loader通过USB下载其余镜像文件,比如U-Boot、boot image、recovery image、android system image、user data到NAND FLASH/EMMC中。

 

 

2.3  Bootloader备用的下载流程(emergency download procedure)

(1)  设备上电后,Boot ROM开始运行。

(2)  BootROM初始化软件堆栈(software stack)、通信端口和可引导存储设备(比如NAND/EMMC)。

(3)  BootROM在emergency DL按键按下后,通过USB和flash工具握手。

(4)  BootROM通过USB把指定的镜像文件下载到NAND FLASH/EMMC中。

 

 

3.     pre-loader的功能

pre-loader是MTK内置的loader,它的主要功能如下:

(1)  负责在芯片组平台(chipset platform)上准备好可执行的环境

(2)  如果外部工具有效,它会试图通过UART或是USB来和外部工具握手。

(3)  从NAND/EMMC加载U-Boot,并跳转到U-Boot。

(4)  使用工具握手,设备能够触发进入下载模式来下载需要的镜像,或是进入工厂/测试模式,比如META模式和ATE工厂模式,在这些模式下可以测试模块,或是通过传递引导参数给U-Boot和linux内核来校准设备(device calibration)

 

对于安全的执行环境,安全引导程序会检查(checking)或是查证(verification),这样能够保护我们的芯片被攻击(hacked)。

 

4.     Bootloader硬件环境

当设备上电后,bootloaders被加载到不同的内存区域并执行,如下图所示:

 

 

图3

Pre-loader在芯片内部系统(chipset’s internal system)RAM的0Xc2010000位置开始执行,U-Boot在外部RAM的0x01E00000处执行。当bootloaders执行时,初始化多种硬件模块来创建一个可执行的环境,具体是哪些硬件模块,下面有详细的描述。

 

4.1  pre-loaders中涉及的硬件部分

当系统启动时,芯片组(chipset)内部的可引导ROM开始执行,并从可引导存储设备(NAND/EMMC等等)上拷贝pre-loader。所以,需要通过初始化一些硬件模块来为软件创造必要的可执行环境(essential execution environment),所有这些硬件模块在接下来描述。

(1)  PLL模块

1)     PLL模块用于调整处理器和外部内存的频率。

2)     在PLL模块初始化后,处理器和外部内存的频率可由26MHZ/26MHZ增加到1GHZ/192MHZ。

(2)  UART模块

1)     UART模块用于调试或是META模式下的握手。

2)     默认情况下,UART4初始化波特率为9216000bps和用于调试信息的输出,UART1初始化为115200bps和作为UART META魔兽端口。但也可以使用UART1作为调试或是UART META端口。

 

(3)  计时器(timer)模块

这是个基本的模块,用来计算硬件模块所需要的延时或是超时时间。

 

(4)  内存模块

1)     Pre-loader由boot ROM加载和在芯片组内部的SRAM中执行,因为外部的DRAM还没有初始化。

2)     为了准备软件整个可执行环境,pre-loader采用内置的内存设置来初始化DRAM(DRAM is initialized upon pre-loader built-inmemory settigns)。这样,U-Boot就能够被加载到DRAM中并执行。

 

(5)  GPIO模块

(6)  PMIC模块

为了提供一些基本的硬件功能,比如控制外设电源,pre-loader初始化上层模块(upper modules)。

 

(7)  RTC模块

1)     当通过power按键开机后,pre-loader拉高RTC的PWBB来保持设备一直有电(keep the device alive)和继续引导U-Boot。

2)     RTC闹钟(alarm)有可能是设备开机的启动源,对于这种情况,设备部需要按power按键就可自动启动。

 

(8)  USB模块

当USB线插入时,它初始化来和外部工具通信,比如用于升级系统的下载工具或是META模式触发器的META工具。

 

(9)  NAND模块

(10) MSDC模块

Pre-loader可以从NAND flash或是EMMC中加载U-Boot,这两者只能选择其中一种来启动。

 

5.     Pre-loader的过程(procedure)和流程(flow)

如下图:

 

图4

具体的源代码后面再分析了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值