接触到一个新的平台最终要的一件事莫过于搞清楚如何boot起系统,那就要弄清楚系统开机各阶段的具体工作内容。这里最好的指导就是高通的启动guide。
对于系统的镜像和启动阶段我已经做了简单的介绍,详见:
镜像和启动阶段的说明
那今天我就以电源为例,简单的跟一下系统启动多个阶段的主要内容。从高通的文档可以看到,大部分平台,启动阶段分为PBL,XBL_SC(SBL),UEFI(XBL core, ABL), Kernel, Android ,这几个阶段(XBL 现在又被叫做 eXtended Boot Loader, ABL 叫做 application Bootloader或者aboot,加载boot.img,并启动linux kernel进而启动用户操作系统),这些阶段和镜像并不是一一对应的。一图胜千言,code boot flow明确定义了代码执行的物理器件:
代码的运行物理环境分别未:ROM,IMEM(TME internal memory/主要是进行校验的,确保进镜像的完整性和安全性),DDR。所涉及的阶段定义和工作大致作用如下:
PBL
Primary boot loader.是在soc的集成rom上运行,主要作用是进行自检。出厂自带,无code,无镜像。
XBL_SC
eXtensible boot loader system controller.
有个比较核心的内容:XBL SC – The boot loader loads the XBL config settings image from the storage。xbl_config.elf 的主要内容:
应对xbl_sc的改动,UEFI、XBL RAM dump、XBL Device Tree Configurations有了单独分区或者文件。
有两处地方可以进行ODM的客制化,XBL Device Tree Configurations 或者UEFI中进行。针对,着两个地方,分别做说明:
1. XBL Configure 和XBL Device Tree
The XBL DeviceTree feature supports the following DeviceTree blobs:
pre_ddr-soc.dtb contains the configuration that is loaded before DDR is initialized
and is expected to be platform-independent (XBL SC).
platform.dtb contains the DeviceTree configuration (XBL SC and UEFI). //进行产品配置
对应的device tree编译结果可以会被包含在xbl_config.elf中,xbl_config.elf可以被xbl_sc或者UEFI运行时使用。
那么,如何定制device tree,并且生成对应的配置节点,并打包到xbl_config.elf中?
常言道,工欲善其事必先利其器。工具:编译脚本,高通 Android的整体编译都是依赖一套脚本。
而通常,QC会开发一套编译命令集,将我们需要的编译的规则统一,简单一个命令就可以解决问题。举个例子,amss的编译,只需要一个命令,就可以生成如下的目标文件:
aop.img dsp.img keymaster.img shrm.img xbl.img
aop_config.img featenabler.img modem.img tz.img xbl_config.img
cpucp.img hyp.img multiimgqti.img uefi.img xbl_ramdump.img
devcfg.img imagefv.img qupfw.img uefisecapp.img
仔细观察代码,可以看到生成xbl_config.img的脚本位于modem目录下,一块WWAN的板子,核心是从 WWAN开始。
amss/MPSS.DE.3.1.1/modem_proc/core/boot/scripts/xblconfig/GenConfigImage.py..能看到最后是流转到了create_xbl_config.json. 文件中会明确告诉你,需要打包哪些配置文件(dtsi);
All XBL DeviceTree files and tools exist under one directory :
amss/BOOT.MXF.2.0/boot_images/boot/Settings/...
总结一下
4490平台在xbl中的改变和针对开机需要进行的必要修改:
- 高通提供了一套脚本,用于生成xbl_config.elf , 并且配置方法是投过dtsi进行
- 针对开机,能够进行的Device Tree修改内容主要涉及,SW/Hardware两个方面,细节内容如下:
- Boot-common software settings
- Settings\SW\Core\Boot\boot.dtsi
- PMIC hardware settigs
- 这个是硬件有关的设定,会在某个具体的soc目录下面,e.g:./Clarence/Core/PMIC/pmic.dtsi
- 有关reset定义:PM_WARM_RESET/PM_HARD_RESET/PM_SHUTDOWN/
- USB hardware settings
- GPIO hardware settings
- Storage hardware settings
- Boot-common software settings
硬件部分需要结合自己硬件选型进行。特别是一些需要开机阶段特殊设定的模块。
UEFI
这个阶段,就已经很接近要去加载boot.img,并进入linux kernel的执行阶段了。这个阶段主要涉及两个分区镜像uefi.elf 和abl.elf. 看下架构:
XBL Core
XBL core contains chipset-specific core protocols (drivers) and core applications(such as charging). XBL core is part of the non-HLOS boot_images code.
ABL
Abl(application bootloader) contains chipset-independent applications such as fastboot. ABL is part of the open source Linux Android source tree on Code Aurora Forum. ABL source is BSDlicensed.
Android bootloader,代码位于asop端,QcomModulePkg/Application/LinuxLoader/LinuxLoader.c
这里面可以进行有关内容的配置,例如,在命令行生成器中添加内核启动的不同参数。
LK(little kernel) device drivers are moved into the XBL core. Leveraging drivers from XBL core reduces code duplication. The Linux loader and fastboot functionality are refactored as stand-alone UEFI applications. Customers transitioning from LK need to ensure that their LK modifications are ported to XBL Core and ABL.
总结一下
UEFI一共有如下的几个阶段,UEFI的结束也就标志着Linux内核的开始。
- SEC (Pre-Pi //这是个什么概念?)阶段
- First UEFI code to execute
- Setup MMU
- Parse platform config file
- Set up Hands off Blocks
- Decompress FW volume
- Load DXE core
- ./boot/QcomPkg/XBLCore/ModuleEntryPoint.S :CEntryPoint
- DXE阶段 Driver execution environment
- Load up drivers
- Using Apriori.
- ./boot/QcomPkg/XBLCore/Sec.c :LoadDxeCoreFromFv
- BDS阶段 Boot Device selection
- Check for Hotkey / BDS menu
- Enable platform security
- Bootloader processing
- ./boot/QcomPkg/Tools/sym.cmm : \\&ModName\AutoGen\ProcessModuleEntryPointList
- OS Loader阶段 LinuxLoader
- LinuxLoader launched
- ExitBootService called by LinuxLoader
- End of UEFI
- Start of Kernel : LinuxLoader做为一个UEFI_APPLICATION 应用被加载,入口函数为LinuxLoaderEntry
Kernel
一切物理资源的管理者。
Android
我们的各种应用的依赖和基础,提供各种功能接口。