我的NPI项目之设备系统启动(九) -- 高通平台启动阶段和功能详解

接触到一个新的平台最终要的一件事莫过于搞清楚如何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中的改变和针对开机需要进行的必要修改:

  1. 高通提供了一套脚本,用于生成xbl_config.elf , 并且配置方法是投过dtsi进行
  2. 针对开机,能够进行的Device Tree修改内容主要涉及,SW/Hardware两个方面,细节内容如下:
    1. Boot-common software settings
      1. Settings\SW\Core\Boot\boot.dtsi
    2. PMIC hardware settigs
      1. 这个是硬件有关的设定,会在某个具体的soc目录下面,e.g:./Clarence/Core/PMIC/pmic.dtsi
      2. 有关reset定义:PM_WARM_RESET/PM_HARD_RESET/PM_SHUTDOWN/
    3. USB hardware settings
    4. GPIO hardware settings
    5. Storage hardware 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内核的开始。

  1. SEC (Pre-Pi //这是个什么概念?)阶段
    1. First UEFI code to execute 
    2. Setup MMU
    3. Parse platform config file
    4. Set up Hands off Blocks
    5. Decompress FW volume
    6. Load DXE core
    7. ./boot/QcomPkg/XBLCore/ModuleEntryPoint.S :CEntryPoint
  2. DXE阶段 Driver execution environment
    1. Load up drivers
    2. Using Apriori.
    3. ./boot/QcomPkg/XBLCore/Sec.c :LoadDxeCoreFromFv
  3. BDS阶段 Boot Device selection
    1. Check for Hotkey / BDS menu
    2. Enable platform security
    3. Bootloader processing
    4. ./boot/QcomPkg/Tools/sym.cmm : \\&ModName\AutoGen\ProcessModuleEntryPointList
  4. OS Loader阶段 LinuxLoader
    1. LinuxLoader launched
    2. ExitBootService called by LinuxLoader
    3. End of UEFI 
    4. Start of Kernel : LinuxLoader做为一个UEFI_APPLICATION 应用被加载,入口函数为LinuxLoaderEntry

Kernel

一切物理资源的管理者。

Android

我们的各种应用的依赖和基础,提供各种功能接口。

项目的导入通常分为以下五个阶段: 1. 规划阶段:在这个阶段项目团队将定义项目的目标和目标,并制定详细的项目计划。他们会评估项目的可行性,确定项目的约束条件和风险,并确定所需的资源和时间表。此外,团队还将建立项目管理的组织结构和沟通渠道,以确保项目的顺利进行。 2. 准备阶段:在这个阶段,团队将执行项目计划的各项任务。这包括获取所需的资源和设备,建立与相关利益相关者的合作关系,编制详细的工作计划,制定项目的质量标准和检查点,并培训相关的团队成员。 3. 实施阶段:在这个阶段,团队将按照之前制定的计划开始执行项目。这包括执行项目中的各个任务和活动,监控项目的进展,并进行必要的修正。团队还将与相关利益相关者合作,确保项目按时、按质量要求完成。 4. 收尾阶段:在这个阶段项目团队将完成项目的所有工作,并准备进行项目的验收和交付。他们将评估项目的结果,并与相关利益相关者一起确认项目的成功和满意度。团队还会编写项目总结报告,总结项目的经验教训,并进行项目团队的解散和资源的重新分配。 5. 后期支持阶段:在这个阶段,团队将提供项目交付的后续支持和维护。他们将监测项目的绩效,并解决任何可能出现的问题。此外,团队还将提供培训和知识转移,以确保组织内其他人员能够使用和维护项目交付物。 以上是新项目导入的五个阶段,每个阶段都有其特定的任务和目标,以确保项目的成功实施和交付。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值