[Android6.0][MTK6737] 启动流程分析

https://blog.csdn.net/dearsq/article/details/79494930

 

OS:Android6.0 
Hardware:MTK6737

 


一、启动流程概览
1. BootRom
2. Preloader
3. LK
4. Kernel
5. Android


二、Bootloader 引导
2.1 preloader 启动过程
2.1.1 preloader 的功能
preloader 中的硬件部分
2.1.2 preloader 启动代码


2.2 LK 启动过程
2.2.1 LK 中的上电情景
2.2.2 LK 中的充电情景
2.2.3 LK 中的其他启动模式
2.2.4 LK 启动代码

 


三、Linux 内核启动
3.1 zImage 解压
3.2 start_kernel 启动
3.3 rest_init 调用 kernel_init

 

 

 

 


一、启动流程概览

 

1. BootRom

固化在 CPU 内部。 
负责从外部的存储器中加载 Preloader。 
负责 USB Download。

 

2. Preloader

属于 Bootloader 的第一部分。 
负责 MTK Licensed 
负责 基础 Module 的 初始化,比如 eMMC,PLL,DRAM 等。 
负责 加载 LittleKernel(LK)

 

3. LK

属于 Bootloader 的第二部分。 
负责 设备的初始化。 
负责 加载 Linux Kernel。 
支持 fastboot 更新。

 

4. Kernel

负责 设备初始化 / 内核初始化。 
负责 引导启动内核态 init 进程。

 

5. Android

负责 引导启动用户态 init 进程。 
负责 Zygote 启动。 
负责 Framework 初始化等。

以上基本可以化为三个部分:Bootloader(Preloader+LK)、Kernel、Android。 
后面我们深入代码逐个分析。

 

二、Bootloader 引导

Bootloader 部分主要功能包括 设置处理器和内存频率、指定调试信息端口、可引导的存储设备等。完成可执行环境创建后,把 software 装载到内存并执行。除了装载 software ,外部工具也可以和 bootloader 握手,指示设备进入不同的操作模式(比如 USB 下载模式和 META 模式)。就算没有外部工具的握手,也可以通过自定义按键,使 bootloader 进入这些模式。

由于不同芯片商对 arm core 封装差异比较大,所以不同的 arm 处理器,对于上电引导都是由特定处理器芯片厂商自己开发的程序,这个上电引导程序通常比较简单,会初始化硬件,提供下载模式等,然后才会加载通常的 bootloader (uboot)。

对于 MTK 平台,其 bootloader 分为两个部分 
1. preloader ,依赖平台 
2. LK(little kernel),作用和 uboot 类似,依赖操作系统,负责引导 linux 系统和 Android 框架

我们结合前面的那张图,更加详细的看一下启动过程中 Bootloader 部分的动作: 
1. 设备上电,BootROM 开始运行。 
2. BootROM 初始化软件堆栈 (SoftwareStack)、通信端口和可引导存储设备(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 kernel 和 ramdisk 
8. u-boot 跳转到 linux kernel 并执行。

 

2.1 preloader 启动过程

 

2.1.1 preloader 的功能


负责在芯片组平台准备好可执行环境
如果检测到外部工具,会试图通过 uart 或者 usb 与外部工具握手
从 NAND/EMMC 加载 u-boot ,并跳转到 u-boot
使用工具握手,设备能够触发进入下载模式来下载需要的镜像,或是进入工厂/测试模式,比如 META 模式和 ATE 工厂模式,在这些模式下可以测试模块,或是通过传递引导参数给 U-Boot 和 linux kernel 来校准设备 (device calibration)

 


preloader 中的硬件部分

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

UART 模块 
用于调试或是 META 模式下的握手。 
默认情况下 UART4 初始化波特率为 9216000bps ,用于调试信息输出。 
UART1 初始化为 115200bps 和作为 UART META 默认端口。不过 UART1 也可以被作为调试或者是 UART META 端口。

计时器 timer 模块 
用于计算硬件模块所需要的延时或是超时时间。

内存模块 
preloader 由 bootROM 加载和芯片组内部的 SRAM 中执行,因为外部的 DRAM 还没有初始化。 
接下来 preloader 采用内置的内存设置来初始化 DRAM,这样 u-boot 就可以被加载到 DRAM 中并执行。

GPIO

PMIC

RTC 
当通过 power 按键开机后,preloader 拉高 RTC 的 PWBB 来保持设备一直有电,并继续引导 u-boot。 
RTC alarm 可能是设备开机的启动源,这种情况,设备不需要按 power 按键就可以自启动。

USB

NAND

MSDC 
pre-loader 可以从 NAND Flash 或者是 EMMC 中加载 u-boot,两种选其一

 

2.1.2 preloader 启动代码

代码流程如下图:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值