每当有新的平台起来的时候,大概率会伴随着新系统的发布,无论是高通的还是Google Andorid的。在做平台Bringup阶段总会遇到各种各样的专业术语。例如,总是会听到有人说PBL,SBL,XBL,UFEI,Bootloader,Kernel,Android 等等。这些是说的启动的不同阶段呢,还是指不同的分区镜像呢?今天就以QCM4490为例,简单做一下解释和区分。
分区(镜像)名称:
xbl,xbl_s.melf
xbl config,xbl_config.elf
uefi,uefi.elf
QSEE/TrustZone,tz.img
super,super.img
vendor,vendor.img
system,system.img
启动不同阶段:
启动过程:
详细内容:
- PBL 阶段
- 黑色块表示具体的ROM,TME也是开机 最初阶段进行运行的firmware,TME全称为Trust Managerment Engine,以看名字就知道与安全有关。通常是为开机提供Rot和一套验证机制。蓝色块代表了不同阶段的执行程序,e.g 各种loader。
- PBL(Primary Boot Loader)负责枚举启动方式和加载SBL(Secondary Boot Loader)镜像。
PBL is a rom-based bootloader and there isn't any log such as UART can be catched by external device, so the best way to debug PBL is JTAG with Trace32。 - 如果启动失败,PBL会创建一个虚拟端口9008供镜像下载。
- PBL还会检查BootOption GPIO或fuse来确定当前的启动方式,如通过USB或Flash EMMC或者UFS启动。
SBL阶段(高通新平台用xbl sc替换,Android12之前都还有)- SBL(Secondary Boot Loader)镜像从EMMC/UFS加载并进行校验。
- SBL负责将镜像分配到不同的内存区域,如RPM Code RAM。
- SBL还负责处理电源、休眠唤醒时钟等相关管理任务。
- XBL SC阶段
- XBL system controller, 用于加载XBL镜像(xbl loader),提供XBL config,并将执行移交到xbl。主要功能是setup xbl运行环境,e.g bus/ DDR / clocks / Charger and CDT 有关的设定。xbl sc的代码通常是不可以更改的,通常是release的二进制镜像文件,俗称xbl_sc(但是它不是一个单独的img,而是被包裹在xbl_s.melf分区中)。如果,我们需要在xbl_sc中进行修改代码,通常做法是提QCOM case。例如,同一套代码在不同设备上启动,并且要选择不同的XBL config, 那么我们就必需要改动XBL SC进行选择。但是这样,会带来一个问题,就是每次codebase升级,我们都需要进行提QCOM case寻求帮助。
所以,这里有个教训就是,在我们需要启用新平台时候,需要进行和Qcom TAM进行设计确认。提出我们的需求,请高通实现。这个对架构师的要求比较高,需要看的远才行。 - XBL SC loads SHRM image from the boot device and TME authenticates and brings it out of reset.
- XBL SC loads AOP CFG and AOP image from the boot device and TME authenticates and brings AOP out of reset.
- XBL SC loads CPUCP firmware image from the boot device and TME authenticates it.
- XBL SC loads TZ device configuration (DEVCFG) image and Qualcomm TEE image from the boot device and TME authenticates it.
- ...
- xbl sc是高通签名的一个镜像文件,是否会影响release的bootup?
答案是不会,因为我们会重签。 - XBL config的主要内容有哪些?xbl_config.elf
- 包含了CDT,这个很重要,现在高通不希望我们改动CDT了,他的code是IDP的CDT,release给我们的code有而是基于IDP开发的。关于CDT的细节可以参考我的NPI项目之设备系统启动(一) -- 客制化/给设备身份的CDT-CSDN博客
- PMIC, DDR and XBL device tree。
- XBL system controller, 用于加载XBL镜像(xbl loader),提供XBL config,并将执行移交到xbl。主要功能是setup xbl运行环境,e.g bus/ DDR / clocks / Charger and CDT 有关的设定。xbl sc的代码通常是不可以更改的,通常是release的二进制镜像文件,俗称xbl_sc(但是它不是一个单独的img,而是被包裹在xbl_s.melf分区中)。如果,我们需要在xbl_sc中进行修改代码,通常做法是提QCOM case。例如,同一套代码在不同设备上启动,并且要选择不同的XBL config, 那么我们就必需要改动XBL SC进行选择。但是这样,会带来一个问题,就是每次codebase升级,我们都需要进行提QCOM case寻求帮助。
- XBL阶段
- XBL(Extended Boot Loader)阶段,用于对硬件环境进行初始化,但这些通常与高通特定的技术相关,且可能不会出现在所有的高通平台上。
- 从XBL sc切换到XBL core, which is known as UEFI.
- UEFI 阶段
- UEFI mounts and runs ABL firmware volume (FV), which has Fastboot and Linux loader applications.
- 进行charging有关的设定和初始化,能够启动ADSP中支持PD快充
- pre-charge/quick charge/
- ABL阶段
- ABL的入口代码位于Linuxloader.c,其入口函数是Linuxloaderentry().
- Linux loader application (part of ABL FV) loads and authenticates the HLOS kernel with verified boot, jumps to HLOS. The HLOS runs at nonsecure EL1 mode.
- Kernel 阶段
- 从EMMC/UFS 中获取boot.img并加载到指定的内存区域。
- 加载内核、ramdisk、devicetree等组件到指定地址,然后引导kernel。
- 内核启动入口在head.S中,最终调用的函数是start_kernel,位于main.c中。
- Android 阶段
- init 经常创建孵化器进程,孵化器进程再逐个的创建Android运行时的service。显示界面,进入Android;
当我们熟悉了分区和阶段之后,在bringup主板阶段,就可以很好的区分,代码执行到哪个阶段了,具体位于哪个分区代码中。
--熟悉启动,定制启动。